@polymorphism-tech/morph-spec 8.37.0 → 8.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/CLAUDE.md +19 -6
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +16 -7
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/CLAUDE.md +3 -3
  8. package/framework/MORPH.md +25 -22
  9. package/framework/agents.json +76 -27
  10. package/framework/docs/CLI.md +55 -18
  11. package/framework/evals/rubrics/code-quality.md +5 -0
  12. package/framework/evals/rubrics/condensed.md +6 -2
  13. package/framework/evals/rubrics/contracts.md +20 -0
  14. package/framework/evals/rubrics/test-coverage.md +17 -6
  15. package/framework/hooks/README.md +9 -3
  16. package/framework/hooks/claude-code/core/graph-refresh-kick.js +52 -0
  17. package/framework/hooks/claude-code/core/telemetry-log.js +172 -87
  18. package/framework/hooks/claude-code/core/validate-completion.js +16 -90
  19. package/framework/hooks/claude-code/core/worktree-context.js +10 -0
  20. package/framework/hooks/shared/command-tokens.js +96 -0
  21. package/framework/hooks/shared/git-exclude.js +44 -0
  22. package/framework/hooks/shared/git-paths.js +52 -0
  23. package/framework/hooks/shared/graph-freshness.js +380 -0
  24. package/framework/hooks/shared/graph-refresh.js +416 -0
  25. package/framework/hooks/shared/morph-cli.js +17 -5
  26. package/framework/hooks/shared/redact-secrets.js +55 -0
  27. package/framework/hooks/shared/telemetry-logger.js +25 -2
  28. package/framework/hooks/shared/transcript-usage.js +80 -0
  29. package/framework/rubrics/backend.json +2 -2
  30. package/framework/rubrics/default.json +2 -2
  31. package/framework/rubrics/frontend.json +2 -2
  32. package/framework/rules/csharp-standards.md +1 -0
  33. package/framework/rules/morph-workflow.md +1 -0
  34. package/framework/rules/nextjs-standards.md +1 -0
  35. package/framework/schemas/config.schema.json +41 -1
  36. package/framework/schemas/feature.schema.json +5 -1
  37. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  38. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  39. package/framework/skills/core/morph-apply/SKILL.md +36 -11
  40. package/framework/skills/core/morph-brainstorming/SKILL.md +16 -7
  41. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  42. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  43. package/framework/skills/core/morph-implement/SKILL.md +39 -10
  44. package/framework/skills/core/morph-media/SKILL.md +1 -1
  45. package/framework/skills/core/morph-plan/SKILL.md +72 -15
  46. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  47. package/framework/skills/core/morph-review/SKILL.md +51 -13
  48. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  49. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  50. package/framework/skills/core/morph-uiux/SKILL.md +34 -9
  51. package/framework/standards/STANDARDS.json +187 -12
  52. package/framework/standards/ai-agents/rag-custom-pgvector.md +7 -3
  53. package/framework/standards/ai-agents/testing-ai.md +2 -1
  54. package/framework/standards/architecture/code-comments.md +64 -0
  55. package/framework/standards/backend/dotnet/testing.md +22 -0
  56. package/framework/standards/frontend/admin-app/data-table.md +562 -0
  57. package/framework/standards/frontend/admin-app/feedback.md +236 -0
  58. package/framework/standards/frontend/admin-app/forms.md +232 -0
  59. package/framework/standards/frontend/admin-app/page-structure.md +203 -0
  60. package/framework/standards/frontend/nextjs/components.md +37 -58
  61. package/framework/standards/frontend/nextjs/data-fetching.md +1 -0
  62. package/framework/standards/frontend/nextjs/forms.md +31 -30
  63. package/framework/standards/frontend/nextjs/state-management.md +2 -1
  64. package/framework/standards/frontend/nextjs/testing.md +18 -0
  65. package/framework/templates/context/design-system.md +3 -3
  66. package/framework/templates/docs/proposal.md +11 -0
  67. package/framework/templates/docs/spec.md +15 -0
  68. package/framework/templates/docs/ui-mockups.md +115 -98
  69. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +12 -6
  70. package/framework/templates/feature/decisions.md +124 -122
  71. package/package.json +1 -1
  72. package/src/commands/graph/affected.js +4 -3
  73. package/src/commands/graph/build.js +109 -18
  74. package/src/commands/graph/explain.js +8 -5
  75. package/src/commands/graph/status.js +14 -8
  76. package/src/commands/observability/cost.js +148 -18
  77. package/src/commands/project/doctor.js +82 -10
  78. package/src/commands/project/update.js +25 -0
  79. package/src/commands/project/worktree.js +73 -90
  80. package/src/commands/state/advance.js +18 -0
  81. package/src/commands/state/approve.js +15 -0
  82. package/src/commands/state/archive.js +62 -9
  83. package/src/commands/state/finish.js +62 -14
  84. package/src/commands/state/gate-check.js +8 -1
  85. package/src/commands/state/gate-decision.js +8 -4
  86. package/src/commands/state/report-check.js +90 -9
  87. package/src/commands/state/usecase.js +66 -0
  88. package/src/commands/tasks/dag.js +17 -2
  89. package/src/commands/validation/validate-feature.js +6 -1
  90. package/src/commands/validation/verify.js +20 -1
  91. package/src/dashboard/scanner/agents-scanner.js +5 -1
  92. package/src/dashboard/scanner/hooks-scanner.js +8 -1
  93. package/src/dashboard/scanner/standards-scanner.js +2 -1
  94. package/src/lib/ai/comment-stripper.js +101 -4
  95. package/src/lib/evaluator-report.js +25 -0
  96. package/src/lib/generators/handoff-generator.js +4 -18
  97. package/src/lib/git/default-branch.js +52 -0
  98. package/src/lib/git/tree-fingerprint.js +58 -0
  99. package/src/lib/git/tree-state.js +167 -0
  100. package/src/lib/graph/god-nodes.js +12 -3
  101. package/src/lib/graph/graph-health.js +48 -2
  102. package/src/lib/graph/graph-loader.js +99 -25
  103. package/src/lib/graph/graphifyignore.js +145 -28
  104. package/src/lib/graph/sanitize.js +117 -11
  105. package/src/lib/risk-detector.js +90 -0
  106. package/src/lib/specs/acervo-format.js +70 -0
  107. package/src/lib/specs/acervo-lifecycle.js +264 -0
  108. package/src/lib/specs/adr-index.js +169 -0
  109. package/src/lib/specs/revocations.js +156 -0
  110. package/src/lib/specs/screen-checklist.js +357 -0
  111. package/src/lib/specs/usecase-check.js +20 -16
  112. package/src/lib/specs/usecase-promoter.js +103 -38
  113. package/src/lib/specs/usecase-registry.js +7 -7
  114. package/src/lib/tasks/tasks-json-parser.js +2 -3
  115. package/src/lib/telemetry/metrics.js +386 -0
  116. package/src/lib/telemetry/telemetry-reader.js +161 -51
  117. package/src/lib/telemetry/verify-event.js +79 -0
  118. package/src/lib/validators/code-budget/code-budget-validator.js +172 -0
  119. package/src/lib/validators/code-budget/comment-scanner.js +75 -0
  120. package/src/lib/validators/code-budget/index.js +9 -0
  121. package/src/lib/validators/reuse/reuse-validator.js +4 -2
  122. package/src/lib/validators/reuse/symbol-scanner.js +27 -22
  123. package/src/lib/validators/validation-runner.js +21 -5
  124. package/src/lib/validators/verify-runner.js +11 -0
  125. package/src/lib/worktree/finish-backup.js +739 -0
  126. package/src/lib/worktree/ignored-triage.js +15 -8
  127. package/src/lib/worktree/worktree-audit.js +5 -0
  128. package/src/scripts/setup-infra.js +29 -18
  129. package/src/utils/agents-installer.js +281 -12
  130. package/src/utils/hooks-installer.js +75 -15
@@ -15,3 +15,4 @@ stacks:
15
15
  @.morph/framework/standards/backend/dotnet/scrutor.md
16
16
  @.morph/framework/standards/backend/dotnet/scalar-ui.md
17
17
  @.morph/framework/standards/backend/api/validation.md
18
+ @.morph/framework/standards/architecture/code-comments.md
@@ -156,6 +156,7 @@ Do not modify test files to make a failing test pass when the implementation is
156
156
 
157
157
  After making structural changes (new packages, dependencies, project config changes), update the project context:
158
158
  - Edit `.morph/context/README.md` — update Tech Stack, Architecture, Key Integrations sections
159
+ - Any `.morph/context/*.md`: **rewrite the body, never stack** — the section that described the old fact now describes the new one (a value that still holds somewhere says where); a changelog keeps only date and reason
159
160
  - Update `.morph/config/config.json` — update stack, architecture, integrations, paths
160
161
  - Structural changes include: package.json, .csproj, next.config.*, tsconfig.json, docker-compose.yml
161
162
 
@@ -18,3 +18,4 @@ stacks:
18
18
  @.morph/framework/standards/frontend/nextjs/testing.md
19
19
  @.morph/framework/standards/frontend/nextjs/nextjs-patterns.md
20
20
  @.morph/framework/standards/frontend/nextjs/motion-patterns.md
21
+ @.morph/framework/standards/architecture/code-comments.md
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "MORPH-SPEC .morph/config/config.json",
4
- "description": "Describes ONLY project.tests[] — the plural declaration of the project's test suites. Everything else in config.json is deliberately left open (additionalProperties: true) so that configs already in the field never break on a key this schema has not heard of. The authority at runtime is validateTestNodes() in src/lib/tasks/test-nodes.js: a schema nothing calls is decoration.",
4
+ "description": "Describes project.tests[] — the plural declaration of the project's test suites — and finishBackup.retention. Everything else in config.json is deliberately left open (additionalProperties: true) so that configs already in the field never break on a key this schema has not heard of. The authorities at runtime are validateTestNodes() in src/lib/tasks/test-nodes.js and resolveBackupRetention() in src/lib/worktree/finish-backup.js: a schema nothing calls is decoration.",
5
5
  "type": "object",
6
6
  "additionalProperties": true,
7
7
  "properties": {
@@ -109,6 +109,46 @@
109
109
  }
110
110
  }
111
111
  }
112
+ },
113
+ "finishBackup": {
114
+ "type": "object",
115
+ "additionalProperties": true,
116
+ "description": "The backups `finish` and `worktree remove` write to .git/morph-spec/finish-backup/ before deleting a file that exists nowhere else.",
117
+ "properties": {
118
+ "retention": {
119
+ "description": "How long a backup lives. ON by default: a config without this key gets the defaults below - the maxCount newest backups of each namespace always stay, at any age (no age cut unless maxAgeDays is set), and .env* files inside a backup go after secretMaxAgeDays. One finish is one backup, even when it writes two folders (same stamp). Applied after every finish and every `worktree remove` that wrote a backup, and on demand by `morph-spec doctor --worktrees --prune`. A backup without its {folder}.manifest.json was written before this retention: the automatic prune never deletes it, never strips it and gives it no place in the count (it reports legacyPending); only the explicit `doctor --worktrees --prune` prunes it, counting it with the rest, and writes a manifest into every one it keeps. Only `false` turns retention off. Anything else it cannot read - an unknown key, a value that is not an integer >= 1, a retention that is neither `false` nor this object, a finishBackup that is not an object, a config.json that does not parse - SKIPS the prune for that run, with the reason in the output: never the defaults, because the operation deletes. The backup the running command just wrote is never pruned by it, and a backup stamped in the future is kept without taking a place in the count.",
120
+ "oneOf": [
121
+ {
122
+ "const": false,
123
+ "description": "Retention off: no backup and no .env* inside one is ever deleted."
124
+ },
125
+ {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "properties": {
129
+ "maxCount": {
130
+ "type": "integer",
131
+ "minimum": 1,
132
+ "default": 20,
133
+ "description": "Backups kept per namespace (the top level, and task/ for task isolation trees), newest first."
134
+ },
135
+ "maxAgeDays": {
136
+ "type": ["integer", "null"],
137
+ "minimum": 1,
138
+ "default": null,
139
+ "description": "Optional age cut: when set, no backup older than this survives, whatever the count. Absent or null (the default) means no age cut - a quiet period never empties the backups of the last features closed."
140
+ },
141
+ "secretMaxAgeDays": {
142
+ "type": "integer",
143
+ "minimum": 1,
144
+ "default": 7,
145
+ "description": "Files named .env* are deleted from a backup older than this; the rest of it stays, and its manifest keeps the names."
146
+ }
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ }
112
152
  }
113
153
  }
114
154
  }
@@ -60,7 +60,11 @@
60
60
  "description": "Risk signals evaluated (free-form): taskCount, evalScore, standardsViolations, designSystemDivergence..."
61
61
  },
62
62
  "trust": { "type": "string", "enum": ["auto", "manual"] },
63
- "decidedAt": { "type": "string", "format": "date-time" }
63
+ "decidedAt": { "type": "string", "format": "date-time" },
64
+ "mockupsHash": {
65
+ "type": ["string", "null"],
66
+ "description": "uiux only: hash of the 1-design/mockups.md the decision saw (null = no mockup). A pause:false unlocks the auto signature only while the mockup is still this one."
67
+ }
64
68
  },
65
69
  "additionalProperties": false
66
70
  }
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
4
4
  version: core
5
5
  when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
@@ -159,8 +159,9 @@ while (true):
159
159
  ```
160
160
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
161
161
  contexto: spec.md, mandate.md, task description completa, doneCriteria,
162
- task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito) e os paths
163
- dos alvos de reuso
162
+ task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito), os paths
163
+ dos alvos de reuso e o que você já leu para a task (`arquivo:linhas`
164
+ + o trecho)
164
165
  standard: <path(s) .md do(s) standard(s) do domínio — leia-o(s) antes de implementar>
165
166
  instrução: |
166
167
  Leia o(s) standard(s) indicado(s) antes de escrever código.
@@ -172,6 +173,9 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
172
173
  (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
173
174
  nunca bloqueia. Se algo cobre o caso, reuse ou estenda; se criar mesmo
174
175
  assim, diga por que em uma linha no relatório.
176
+ Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
177
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
178
+ dependem uma da outra vão no mesmo turno, em paralelo.
175
179
  Não modifique spec.md, mandate.md.
176
180
 
177
181
  Contrato do relatório final:
@@ -192,12 +196,23 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
192
196
  DENTRO do seu worktree; commite seu trabalho na branch do worktree como
193
197
  último ato antes do relatório; reporte a branch — nunca faça merge nem
194
198
  toque na árvore principal.
199
+ - Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
200
+ --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
201
+ uma falha, só os que falharam. Grave a saída em arquivo uma vez
202
+ (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
203
+ rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
204
+ linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
195
205
 
196
206
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
197
207
  volta — fatie antes, não depois.
198
- 5. SOBREVIVÊNCIA: commite `wip({taskId})` ao fim de cada task. Se você parar no
199
- limite de turnos, é o commit que preserva o trabalho — sem ele, a retomada
200
- recomeça do zero.
208
+ 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
209
+ corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
210
+ compila, teste que passa), não só ao fim da task — e só os seus arquivos
211
+ (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
212
+ A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
213
+ na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
214
+ por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
215
+ `PARCIAL`. Sem limite declarado, bastam os commits por marco.
201
216
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
202
217
  sessões). Encerre dev server pelo PID que você mesmo subiu.
203
218
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
@@ -210,16 +225,25 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
210
225
  ```
211
226
 
212
227
  > **Passo pós-dispatch (do orquestrador, antes de avaliar qualquer relatório):** ao retomar o
213
- > controle, rode `git status --porcelain src/` e `grep -rn "MUTACAO" src/`. Um sub-agent morto no
214
- > meio deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu
215
- > avalia um estado que ninguém quis. Árvore inesperadamente suja é falha de protocolo: registre no
216
- > recap antes de pontuar.
228
+ > controle, a auditoria do batch abaixo (`report-check` com os ids do batch) traz, no bloco `tree`,
229
+ > o que está não commitado fora de `.morph/` (`dirty`, `diffstat`), os commits sobre a default
230
+ > (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — sem `git status`, `git diff` e
231
+ > `grep` à parte. Um sub-agent morto no meio deixa o disco a meio caminho — e um relatório lido
232
+ > sobre uma árvore que ninguém conferiu avalia um estado que ninguém quis. Árvore inesperadamente
233
+ > suja ou `markers` não vazio é falha de protocolo: registre no recap antes de pontuar.
234
+
235
+ > **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
236
+ > (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
237
+ > retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
238
+ > `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
239
+ > re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
240
+ > parcial.
217
241
 
218
242
  > Este template é deliberadamente paritário com o template sequencial em `morph-implement` §4: ambos despacham o **subagent registrado do domínio (`morph-{id}`)** com standard escopado e as **mesmas 7 cláusulas** do contrato do relatório final (as 3 do relatório + escopo, sobrevivência, processos e retorno) e os mesmos 4 itens de relatório — racional completo em `MORPH.md` §6. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
219
243
 
220
244
  > **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): siga a §3b-w abaixo em vez desta seção — despache com `isolation: "worktree"`, cada agente trabalha numa working tree própria e o orquestrador integra ao final.
221
245
 
222
- Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} --json` — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
246
+ Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} {T1} {T2} … --json` (os ids do batch: sem eles o modo feature só audita tasks já `done`, e as do batch ainda não estão) — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
223
247
  - **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature, **sem `--filter`**) — os agentes não a rodaram (cláusula 3). Vermelho: use `verify.feedback` para corrigir/redespachar ANTES de qualquer morph-eval. (Com isolamento por worktree, cada agente já rodou o verify dentro do seu worktree; o orquestrador roda o verify compartilhado UMA vez após o merge — ver §3b-w.)
224
248
  - Para cada relatório retornado:
225
249
  - Aplicar `Skill(morph-eval)`.
@@ -258,6 +282,7 @@ re-apresente o gate**: siga direto para o encerramento (§6) conforme a decisão
258
282
  ### 6. Pós Gate 3 — encerramento
259
283
 
260
284
  - Aprovar o Gate 3: em auto, `morph-spec approve {feature} review --mode auto`; em manual, o hook state-sync registra a resposta "aprovado" em `AskUserQuestion` — **desde que a pergunta nomeie a feature** (senão aprove via `morph-spec approve`).
285
+ - **Antes do `finish`, reescreva o contexto que a feature mudou.** Todo `.morph/context/*.md` que descreve um fato que esta feature alterou (fonte, token, fluxo, integração) tem o **corpo** reescrito — a seção que descrevia o antigo passa a descrever o novo, e o que ainda vale num escopo diz o escopo. O changelog do documento guarda só data e motivo, nunca o valor novo: um agente que lê só o corpo precisa receber a resposta de hoje. Commite na branch da feature — o `finish` exige a árvore limpa. UCs e ADRs não entram aqui: o `finish` aplica ao acervo o que o `spec.md` declarou revogar (`morph-plan` §3) e reporta em `supersededUseCases`/`adrIndex`/`revocationProblems`.
261
286
  - **Fechar a feature** com `morph-spec finish {feature} --pr|--merge`, modo escolhido via `AskUserQuestion` (header `"Integração"`): `--pr` (push + PR, review antes do merge) vs `--merge` (integra local, single-user direto). Não integre automaticamente sem essa escolha. Mecânica completa (o que cada modo faz, feature legada sem `morph/{f}`): `MORPH.md` §2.1/§2.2.
262
287
  - **`--pr` não encerra a feature; quem encerra é o merge.** O comando arquiva e termina (`finished: true`) nos dois modos, mas só `--merge` integra na hora (`integrated: true`); `--pr` sai com `integrated: false`, `awaiting: "merge"` e `pr: {number, url}` — o archive viaja no diff do PR e só chega na branch default quando alguém mergeia. Até lá a feature aparece em `morph-spec list`/`fleet` como `aguardando-merge`, sem cópia local. Nunca registre a feature como entregue só porque `finish --pr` retornou `finished: true`.
263
288
 
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
4
4
  version: core
5
5
  when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -21,7 +21,7 @@ O harness conhece o stack por padrão (backend .NET 10 + VSA + EF Core/Neon, IA
21
21
 
22
22
  ## Modo bug-lean (`workType: bug`)
23
23
 
24
- Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix**, sem as seções de negócio completas.
24
+ Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Conflitos com o acervo**, sem as seções de negócio completas.
25
25
 
26
26
  Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
27
27
 
@@ -36,11 +36,18 @@ Fato não se pergunta. Antes de levar a primeira pergunta ao usuário, levante o
36
36
  - Em brownfield, varre stack atual (.csproj, package.json, migrations), padrões (Guid.NewGuid vs Guid.CreateVersion7, sealed, result pattern), features existentes.
37
37
  - Produz `.morph/features/{feature}/0-proposal/stack-scan.md`.
38
38
 
39
- 2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/` e o **acervo de use cases** em `.morph/specs/usecases/`. O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
39
+ 2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/`, o **acervo de use cases** em `.morph/specs/usecases/` e o **índice de ADRs ativos** em `.morph/specs/adrs/` (um arquivo por ADR, se existir). O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
40
40
 
41
- 3. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, atualize `.morph/context/design-system.md` com a fonte escolhida + entrada de changelog (data, motivo).
41
+ O acervo tem ciclo de vida: UC com `status: superseded` **não é o comportamento vigente** — o vigente é o `superseded_by`, e `scope` (quando existe) diz onde o antigo ainda vale. Decisão vigente é a do índice; os `decisions.md` de `.morph/archive/` são **história, não instrução** — abra um só para entender por que algo é como é, nunca para decidir.
42
42
 
43
- 4. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
43
+ 3. **Conflitos com o acervo — avise, não entreviste.** Para cada UC vigente, ADR do índice ou documento de `.morph/context/` que o pedido novo **contradiz**:
44
+ - **Avise o usuário** — uma linha por conflito no resumo que abre a Parte 2 (fonte, o que ela diz, o que o pedido muda). Aviso, não pergunta.
45
+ - **Pedido explícito sobre o ponto → vale o mais novo.** Registre a escolha na coluna **Decisão** da seção de conflitos (o que muda, o que o antigo ainda cobre) e siga. Só entra na árvore (Parte 1) o conflito que o pedido deixa **ambíguo** — "o admin passa a Geist" não diz nada sobre a vitrine, então a vitrine é decisão; o admin não é.
46
+ - Todo conflito vai para a seção **Conflitos com o acervo** do `proposal.md` (Parte 4). A `2-plan/` só abre depois do Gate 1, então é a `morph-plan` que transforma cada decisão pelo novo em ADR no `decisions.md` e em linha de revogação no `spec.md` (§3) — é essa linha que o `finish` aplica ao acervo.
47
+
48
+ 4. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, **reescreva o corpo** de `.morph/context/design-system.md` com a fonte escolhida — a seção que descrevia a antiga passa a descrever a nova, e o valor que ainda vale num escopo diz o escopo. O changelog guarda **só data e motivo**, nunca o valor novo: quem lê só o corpo precisa receber a resposta de hoje.
49
+
50
+ 5. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
44
51
 
45
52
  ### Parte 1 — Árvore de decisões abertas
46
53
 
@@ -93,10 +100,11 @@ options:
93
100
  - **Stack:** confirme o stack padrão ou documente desvios aprovados
94
101
  - **Riscos e dependências:** o que pode dar errado, o que esta feature depende
95
102
  - **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
103
+ - **Conflitos com o acervo:** os conflitos da Parte 0 (passo 3), numa tabela `Fonte | O que diz hoje | O que o pedido muda | Decisão` — ou `Nenhum conflito encontrado.`. A seção existe sempre, também no bug-lean: ausente, ela diz que a checagem não rodou (o `validate-feature` avisa)
96
104
 
97
105
  **Não escreva critérios de aceite aqui.** O comportamento verificável mora nos **use cases**, destilados pela `morph-plan` na fase seguinte (`2-plan/usecases/UC-{nn}-{slug}.md`), onde cada pós-condição precisa ser observável em teste e chega literal ao `doneCriteria` das tasks. O `proposal.md` responde **o quê e por quê**; os use cases respondem **como o sistema se comporta**. Duplicar aqui produz duas fontes que divergem no primeiro ajuste.
98
106
 
99
- **Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável** e **Escopo do fix** (o que muda, o que fica de fora) — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
107
+ **Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Conflitos com o acervo** — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
100
108
 
101
109
  Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
102
110
 
@@ -142,7 +150,7 @@ options:
142
150
  No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`) — **atribuindo pela feature nomeada na pergunta**; sem o nome, e com mais de uma feature na árvore, ele recusa a gravar e avisa (aprove então por `morph-spec approve {feature} proposal`). Em modo auto sem AskUserQuestion, aprove via `morph-spec approve {feature} proposal --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta 2-plan/) — nunca via Edit à mão de state.json.
143
151
 
144
152
  ## Output esperado
145
- - `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack"
153
+ - `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack" e os conflitos com o acervo listados em "Conflitos com o acervo"
146
154
  - Gate 1 apresentado e aprovado
147
155
 
148
156
  ## Referências
@@ -150,3 +158,4 @@ options:
150
158
  - `morph-spec standards --find "<query>"` — para referência de standards relevantes à stack (ver `morph-standards`)
151
159
  - `.claude/skills/morph-stack-scan/SKILL.md` — invocada na Parte 0 (varredura), antes de qualquer pergunta
152
160
  - `.morph/framework/MORPH.md` §5 — regras de pausa do Gate 1 (trust mode)
161
+ - `.morph/specs/usecases/` e `.morph/specs/adrs/` — o acervo vigente (UC `superseded` e `decisions.md` arquivado não são instrução); lidos na Parte 0
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
4
4
  version: core
5
5
  when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
6
6
  user-invokable: false
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
4
4
  version: core
5
5
  when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -4,7 +4,7 @@ description: Guia a execução de cada tarefa de implementação com standard e
4
4
  version: core
5
5
  when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
6
  user-invokable: false
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -62,7 +62,8 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
62
62
  Standard: [path do .md do standard identificado no passo 2]
63
63
  Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
64
64
  — este campo não é decorativo: é por ele que o código já existente chega
65
- ao sub-agente, que trabalha em contexto fresco e não conhece o projeto]
65
+ ao sub-agente, que trabalha em contexto fresco e não conhece o projeto.
66
+ O que você já leu para esta task entra como `arquivo:linhas` + o trecho]
66
67
  Reuso: [task.reuse do tasks.json — `CONCEITO: VEREDITO → alvo`, uma linha por
67
68
  conceito; ausente numa task que não introduz conceito]
68
69
  Done quando: [doneCriteria do tasks.json]
@@ -73,6 +74,10 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
73
74
  a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
74
75
  se criar mesmo assim, diga por que em uma linha no relatório.
75
76
 
77
+ Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
78
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
79
+ dependem uma da outra vão no mesmo turno, em paralelo.
80
+
76
81
  Contrato do relatório final:
77
82
  1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
78
83
  encerrar — é o retorno autoritativo, não a sua mensagem final (que é
@@ -86,12 +91,23 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
86
91
  branch do worktree como último ato antes do relatório — nunca faça merge.
87
92
  Worktree não commitado NÃO é removido pelo hook e vira pendência do
88
93
  `doctor`; o commit é o que torna o seu trabalho integrável.
94
+ Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
95
+ --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
96
+ uma falha, só os que falharam. Grave a saída em arquivo uma vez
97
+ (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
98
+ rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
99
+ linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
89
100
 
90
101
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
91
102
  volta — fatie antes, não depois.
92
- 5. SOBREVIVÊNCIA: commite `wip({taskId})` ao fim de cada task. Se você parar no
93
- limite de turnos, é o commit que preserva o trabalho — sem ele, a retomada
94
- recomeça do zero.
103
+ 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
104
+ corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
105
+ compila, teste que passa), não só ao fim da task — e só os seus arquivos
106
+ (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
107
+ A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
108
+ na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
109
+ por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
110
+ `PARCIAL`. Sem limite declarado, bastam os commits por marco.
95
111
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
96
112
  sessões). Encerre dev server pelo PID que você mesmo subiu.
97
113
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
@@ -103,11 +119,15 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
103
119
  justificativa em uma linha. Relatório ausente, oco, ou sem os 4 itens, é
104
120
  falha de protocolo.
105
121
  ```
106
- **Passo pós-dispatch (seu, antes de avaliar o relatório):** rode `git status --porcelain src/`
107
- e `grep -rn "MUTACAO" src/` ao retomar o controle. Um sub-agent morto no meio deixa o disco a
108
- meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu avalia um estado que
109
- ninguém quis. Árvore inesperadamente suja é falha de protocolo: registre no recap antes de
110
- pontuar.
122
+ **Passo pós-dispatch (seu, antes de avaliar o relatório):** rode
123
+ `morph-spec report-check {feature} {taskId} --json` ao retomar o controle. Além do veredito do
124
+ relatório, o bloco `tree` traz o que está não commitado fora de `.morph/` (`dirty`, `diffstat`),
125
+ os commits sobre a default (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — a
126
+ conferência de `git status`, `git diff` e `grep`, numa chamada só. Um sub-agent morto no meio
127
+ deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu avalia
128
+ um estado que ninguém quis. Árvore inesperadamente suja ou `markers` não vazio é falha de
129
+ protocolo: registre no recap antes de pontuar. Essa saída serve ao passo 7 enquanto a árvore
130
+ não mudar; depois de uma correção sua, rode de novo.
111
131
 
112
132
  Após o retorno do dispatch: **leia primeiro** `.morph/features/{feature}/3-implement/reports/[ID].md`
113
133
  — é o valor de retorno autoritativo. Trate a mensagem de texto do sub-agent, se chegou inteira,
@@ -119,11 +139,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
119
139
  para o passo 7 — se a task deve evidência de runtime (`evidencias/` em `outputs`), confira o
120
140
  arquivo como manda o passo 5 antes do `done`.
121
141
 
142
+ **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
143
+ (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
144
+ retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
145
+ `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
146
+ re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
147
+ parcial.
148
+
122
149
  **Se não — siga para o passo 5.**
123
150
 
124
151
  5. Implemente a tarefa seguindo o standard e a persona identificados.
125
152
  Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
126
153
  e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
154
+ Testes rodados durante a implementação inline seguem o mesmo loop da cláusula 3 do template
155
+ do passo 4 (compilar uma vez, `--filter`, saída em arquivo).
127
156
 
128
157
  **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
129
158
  `morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
@@ -4,7 +4,7 @@ description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo
4
4
  version: core
5
5
  when-to-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
6
6
  user-invokable: true
7
- cliVersion: "8.37.0"
7
+ cliVersion: "8.38.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs