# Trace Schema — morph-spec NLH

## Local de armazenamento

`.morph/traces/YYYY-MM-DD-{feature}-{phase}.json`

Um arquivo por fase. Se a fase for executada em múltiplas sessões, o mesmo arquivo é atualizado incrementalmente.

## Formato JSON

```json
{
  "schema_version": "1.0",
  "session_id": "YYYY-MM-DD-HH-MM-SS",
  "feature": "nome-da-feature",
  "phase": "implement | plan | review",
  "started_at": "ISO 8601",
  "completed_at": "ISO 8601",
  "tasks": [
    {
      "id": "T1",
      "title": "descrição da task",
      "status": "completed | failed | skipped",
      "standards_consulted": ["id-do-standard-1"],
      "agent_persona": "dotnet-senior | nextjs-expert | etc",
      "sub_agent_dispatched": false,
      "eval_score": 8.5,
      "eval_dimensions": {
        "architecture": 9.0,
        "contracts": 8.0,
        "code_quality": 8.5,
        "test_coverage": 8.5
      },
      "files_modified": ["path/relativo/arquivo.cs"],
      "duration_seconds": null
    }
  ],
  "phase_summary": {
    "tasks_completed": 3,
    "tasks_failed": 0,
    "avg_eval_score": 8.3,
    "standards_most_used": ["architecture-vertical-slice"],
    "sub_agents_dispatched": 0
  }
}
```

## Como o trace é gerado (automático — não escreva à mão)

O trace é **gerado pelo hook `trace-autogen`** (PostToolUse em Write|Edit) a cada
write de `2-plan/tasks.json` — o último write da cerimônia de cada task. As skills
(`morph-implement`, `morph-eval`, `morph-review`) **não escrevem o trace**.

| Fonte | O que alimenta |
|-------|----------------|
| `tasks.json` | conjunto de tasks, `status` (done→completed, skipped→skipped, blocked→failed; pending/in_progress ficam fora), `outputs` → `files_modified` |
| `recap.md` | `**Standard:**` → `standards_consulted`; `**Persona:**` → `agent_persona` + `sub_agent_dispatched` (`morph-{id}`/`general-purpose` = true) |
| `feature.json → taskScores` (gravado por `morph-spec score`) | `eval_score` (lastScore) e `eval_dimensions` (camelCase → snake_case) |

`completed_at` e `phase_summary` são preenchidos quando nenhuma task resta
`pending`/`in_progress`. O arquivo existente da mesma feature+fase é atualizado
in place (`session_id`/`started_at` preservados entre sessões).

**Se o trace parecer incompleto, corrija a FONTE** (um `morph-spec score`
faltante, um recap sem o bloco `## T{N}`), nunca o trace.

## Regras de geração

- Se um campo não tiver valor disponível, o hook usa `null` — nunca omite o campo.
- Estrutura completa mantida para compatibilidade com análise de meta-harness.
- `session_id` usa o formato `YYYY-MM-DD-HH-MM-SS` da primeira geração.
- `standards_consulted` contém os `id`s do STANDARDS.json, não os paths.
- `files_modified` usa paths relativos à raiz do repositório (vem de `outputs`).

## Motivação

Raw traces preservam o sinal completo de execução. Summaries comprimem informação e perdem sinais que o meta-harness usa para otimização. Regra: logar o trace completo — nunca substituir por resumo.
