@polymorphism-tech/morph-spec 8.47.0 → 9.0.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.
- package/CLAUDE.md +48 -39
- package/README.md +3 -4
- package/bin/morph-spec.js +37 -51
- package/bin/validate.js +3 -111
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +75 -18
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +1 -1
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-preflight.md +2 -3
- package/framework/commands/morph-proposal.md +2 -50
- package/framework/commands/morph-status.md +3 -3
- package/framework/docs/CLI.md +585 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- package/framework/hooks/claude-code/core/comment-guard.js +1 -1
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
- package/framework/hooks/claude-code/core/gate-guard.js +2 -11
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
- package/framework/hooks/claude-code/core/state-sync.js +7 -21
- package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
- package/framework/hooks/claude-code/core/validate-completion.js +33 -97
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
- package/framework/hooks/claude-code/core/worktree-context.js +5 -4
- package/framework/hooks/claude-code/statusline.py +55 -41
- package/framework/hooks/package.json +3 -0
- package/framework/hooks/shared/activity-logger.js +1 -1
- package/framework/hooks/shared/build-check.js +10 -6
- package/framework/hooks/shared/command-tokens.js +169 -0
- package/framework/hooks/shared/comment-rules.js +1 -1
- package/framework/hooks/shared/comment-scanner.js +10 -23
- package/framework/hooks/shared/comment-stripper.js +1 -1
- package/framework/hooks/shared/e2e-check.js +64 -27
- package/framework/hooks/shared/errata.js +72 -0
- package/framework/hooks/shared/feature-locator.js +1 -1
- package/framework/hooks/shared/frontend-locations.js +6 -0
- package/framework/hooks/shared/gate-question.js +18 -0
- package/framework/hooks/shared/phase-utils.js +15 -32
- package/framework/hooks/shared/slice-progress.js +118 -0
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +61 -87
- package/framework/hooks/shared/state-writer.js +2 -3
- package/framework/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- package/framework/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -50
- package/framework/skills/README.md +3 -4
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +149 -222
- package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
- package/framework/skills/core/morph-machine/SKILL.md +2 -2
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +137 -299
- package/framework/skills/core/morph-review/SKILL.md +111 -136
- package/framework/skills/core/morph-standards/SKILL.md +27 -39
- package/framework/skills/core/morph-uiux/SKILL.md +77 -152
- package/framework/standards/STANDARDS.json +86 -1218
- package/framework/standards/STANDARDS.meta.json +1305 -0
- package/framework/standards/ai-agents/evals-with-cache.md +1 -2
- package/framework/standards/ai-agents/setup.md +1 -1
- package/framework/standards/architecture/code-comments.md +6 -6
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +6 -170
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
- package/package.json +1 -1
- package/src/commands/e2e/e2e.js +2 -2
- package/src/commands/observability/cost.js +18 -60
- package/src/commands/project/doctor-procs.js +1 -1
- package/src/commands/project/doctor.js +9 -9
- package/src/commands/project/fleet.js +4 -4
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +4 -0
- package/src/commands/project/setup-infra-cmd.js +2 -1
- package/src/commands/project/stack-scan.js +58 -0
- package/src/commands/project/standards.js +79 -25
- package/src/commands/project/status.js +29 -69
- package/src/commands/project/update.js +17 -1
- package/src/commands/project/worktree.js +1 -1
- package/src/commands/state/advance.js +62 -46
- package/src/commands/state/approve.js +81 -141
- package/src/commands/state/archive.js +20 -84
- package/src/commands/state/auto-approval.js +68 -0
- package/src/commands/state/create.js +28 -1
- package/src/commands/state/delete.js +1 -1
- package/src/commands/state/finish.js +11 -23
- package/src/commands/state/gate-check.js +85 -84
- package/src/commands/state/gate-decision.js +6 -4
- package/src/commands/state/handoff.js +1 -1
- package/src/commands/state/list.js +9 -9
- package/src/commands/state/report-check.js +157 -311
- package/src/commands/state/retype.js +9 -3
- package/src/commands/validation/mutate.js +77 -14
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +60 -135
- package/src/commands/validation/verify.js +40 -72
- package/src/core/paths/output-schema.js +19 -66
- package/src/core/state/gate-order.js +5 -6
- package/src/core/state/lifecycle-audit.js +2 -2
- package/src/core/state/state-manager.js +17 -98
- package/src/core/templates/template-registry.js +2 -2
- package/src/core/templates/template-seed.js +22 -0
- package/src/core/work-types.js +10 -10
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
- package/src/dashboard/app/components/CommandPalette.jsx +5 -5
- package/src/dashboard/app/components/EntityLink.jsx +1 -1
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
- package/src/dashboard/app/lib/phases.js +2 -4
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
- package/src/dashboard/app/pages/Features.jsx +9 -9
- package/src/dashboard/app/pages/Guide.jsx +2 -2
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
- package/src/dashboard/app/pages/Standards.jsx +1 -1
- package/src/dashboard/scanner/activity-scanner.js +5 -15
- package/src/dashboard/scanner/agents-scanner.js +1 -1
- package/src/dashboard/scanner/docs-scanner.js +2 -2
- package/src/dashboard/scanner/features-scanner.js +95 -60
- package/src/dashboard/scanner/project-api.js +1 -1
- package/src/dashboard/scanner/standards-scanner.js +2 -1
- package/src/lib/ci/ci-verify.js +17 -1
- package/src/lib/ci/github-ci.js +1 -1
- package/src/lib/detectors/index.js +3 -8
- package/src/lib/generators/handoff-generator.js +34 -65
- package/src/lib/generators/settings-generator.js +11 -89
- package/src/lib/git/evidence-staleness.js +1 -1
- package/src/lib/git/tree-fingerprint.js +19 -7
- package/src/lib/git/tree-state.js +2 -2
- package/src/lib/heavy/cleanup.js +1 -5
- package/src/lib/installers/memory-installer.js +6 -8
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +46 -9
- package/src/lib/plan/artifact-vocabulary.js +60 -0
- package/src/lib/plan/checks.js +234 -0
- package/src/lib/plan/plan-parser.js +209 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/review-reports.js +222 -0
- package/src/lib/risk-detector.js +131 -140
- package/src/lib/specs/adr-index.js +50 -69
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +44 -0
- package/src/lib/specs/gfm-table.js +17 -0
- package/src/lib/specs/old-format.js +68 -0
- package/src/lib/specs/revocations.js +37 -95
- package/src/lib/specs/screen-checklist.js +18 -17
- package/src/lib/stack/dotnet-build-ignores.js +47 -0
- package/src/lib/stack/stack-scan.js +267 -0
- package/src/lib/standards/registry.js +43 -0
- package/src/lib/standards/sections.js +58 -0
- package/src/lib/tasks/eval-node.js +4 -12
- package/src/lib/tasks/test-nodes.js +1 -74
- package/src/lib/tasks/test-runner.js +75 -117
- package/src/lib/telemetry/metrics.js +8 -69
- package/src/lib/telemetry/telemetry-reader.js +5 -118
- package/src/lib/telemetry/verify-event.js +5 -7
- package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
- package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
- package/src/lib/validators/reuse/reuse-validator.js +22 -45
- package/src/lib/validators/traceability-check.js +85 -129
- package/src/lib/validators/verify-runner.js +118 -235
- package/src/lib/worktree/docker-audit.js +1 -2
- package/src/lib/worktree/fleet-scanner.js +25 -38
- package/src/scripts/setup-infra.js +9 -0
- package/src/utils/agents-installer.js +76 -9
- package/src/utils/claude-settings-manager.js +0 -35
- package/src/utils/file-copier.js +27 -1
- package/src/utils/hooks-installer.js +16 -9
- package/src/utils/skills-installer.js +1 -2
- package/framework/evals/trace-schema.md +0 -67
- package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
- package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
- package/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/framework/hooks/shared/tasks-validator.js +0 -111
- package/framework/rules/morph-task-tracking.md +0 -54
- package/framework/rules/morph-workflow.md +0 -244
- package/framework/schemas/tasks.schema.json +0 -79
- package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
- package/framework/skills/core/morph-implement/SKILL.md +0 -194
- package/framework/skills/core/morph-proposal/SKILL.md +0 -152
- package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
- package/framework/templates/docs/proposal.md +0 -192
- package/framework/templates/docs/spec.md +0 -57
- package/framework/templates/docs/ui-components.md +0 -52
- package/framework/templates/docs/ui-design-system.md +0 -76
- package/framework/templates/docs/ui-flows.md +0 -167
- package/framework/templates/examples/spec-examples.md +0 -91
- package/framework/templates/feature/decisions.md +0 -124
- package/framework/templates/feature/recap.md +0 -145
- package/framework/templates/tasks.template.json +0 -17
- package/src/commands/state/usecase.js +0 -143
- package/src/commands/tasks/dag.js +0 -181
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/evaluator-report.js +0 -104
- package/src/lib/specs/acervo-format.js +0 -70
- package/src/lib/specs/acervo-lifecycle.js +0 -264
- package/src/lib/specs/done-criteria-check.js +0 -200
- package/src/lib/specs/usecase-check.js +0 -301
- package/src/lib/specs/usecase-promoter.js +0 -301
- package/src/lib/specs/usecase-registry.js +0 -237
- package/src/lib/tasks/dispatch-planner.js +0 -319
- package/src/lib/tasks/mermaid-renderer.js +0 -132
- package/src/lib/tasks/task-classifier.js +0 -30
- package/src/lib/tasks/task-parser.js +0 -209
- package/src/lib/tasks/tasks-json-parser.js +0 -296
- package/src/lib/tasks/test-scope.js +0 -597
|
@@ -1,260 +1,187 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: morph-apply
|
|
3
|
-
description:
|
|
3
|
+
description: Executa as fatias do plano de uma feature morph-spec — dispatch por persona, em ondas paralelas do plan-check, com relatório por fatia — prova a feature com um verify sem filtro e entrega à morph-review (Gate 3).
|
|
4
4
|
version: core
|
|
5
|
-
when_to_use: Use
|
|
5
|
+
when_to_use: Use com o gate do plano aprovado, em "use /morph-apply {feature}" ou "implementar feature"
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "9.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
11
11
|
|
|
12
12
|
## Objetivo
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Gate 2 aprovado (`feature.json → approvalGates.plan.approved`), ou o usuário pede "use /morph-apply
|
|
20
|
-
{feature}". Sem argumento: a feature `in_progress` mais recente.
|
|
14
|
+
Toda fatia de `2-plan/checks.json` com relatório final em `3-implement/reports/F{n}.md`, o
|
|
15
|
+
`verify` da feature verde, e a entrega à `morph-review`. O progresso **é** o conjunto de
|
|
16
|
+
relatórios (ausente = pendente, `PARCIAL` na 1ª linha = parcial, senão feito): não há arquivo de
|
|
17
|
+
status para editar.
|
|
21
18
|
|
|
22
19
|
## Ritmo
|
|
23
20
|
|
|
24
21
|
Comando em primeiro plano; o `verify {feature}` que passa do teto de 10 min do Bash vai com
|
|
25
|
-
`run_in_background` e espera a notificação de término
|
|
22
|
+
`run_in_background` e espera a notificação de término **no mesmo turno**: nunca encerre o turno
|
|
23
|
+
com o verify da feature rodando — o stamp que o Gate 3 lê é o dele. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
|
|
26
24
|
pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
|
|
27
25
|
saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
|
|
28
26
|
|
|
29
|
-
##
|
|
27
|
+
## 1. Contexto, uma vez
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
Read em `2-plan/plan.md` e `2-plan/checks.json` uma vez por sessão (ou depois de um `/compact`):
|
|
30
|
+
o plano está congelado desde o gate, então não releia por padrão — só o trecho que falta.
|
|
31
|
+
Antes do primeiro dispatch: `.morph/config/config.json` sem `project.stack` ou `project.tests` →
|
|
32
|
+
declare-os a partir dos comandos de baseline do `## Contrato de implementação` e commite junto com o
|
|
33
|
+
`.gitignore` que o `plan-check` semeou (`bin/`/`obj/` num projeto .NET) — antes de qualquer código. Não há comando de
|
|
34
|
+
CLI para isso: uma edição no `config.json` na forma de `.morph/framework/schemas/config.schema.json`
|
|
35
|
+
(`project.tests[]` com `id` e `command`; `project.stack` com as tags unidas por `+`, ex. `dotnet+nextjs`;
|
|
36
|
+
mais de uma solução .NET no repositório → `project.backendPath` com a pasta da que o build compila), conferida
|
|
37
|
+
por `morph-spec doctor --full`.
|
|
38
|
+
`morph-spec plan-check {feature}` imprime as **ondas**: fatias de uma onda não dependem uma da
|
|
39
|
+
outra nem tocam o mesmo arquivo, até 4 por onda.
|
|
32
40
|
|
|
33
|
-
|
|
34
|
-
`group`, `status`, `doneCriteria`).
|
|
41
|
+
## 2. Fatiar
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
- Uma onda por vez, até **4 agentes ao mesmo tempo**, um por fatia, `subagent_type: "morph-{id}"` (o `persona:` da fatia).
|
|
44
|
+
- Duas fatias em voo que escrevem o mesmo arquivo: a segunda vai em worktree (§4), rolling.
|
|
45
|
+
- Fatias em paralelo na mesma árvore commitam pela lista explícita de arquivos (`git add <paths>`), nunca um diretório: `git add api` leva o arquivo que a fatia vizinha acabou de escrever.
|
|
46
|
+
- **Inline** só para fatia pequena no domínio já carregado, com **uma linha de porquê** no relatório.
|
|
47
|
+
Antes de codar, leia os standards que a fatia fixa. Inline também grava `3-implement/reports/F{n}.md`,
|
|
48
|
+
no formato abaixo — é ele que conta o progresso.
|
|
37
49
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
```
|
|
50
|
+
O hook `validate-completion` (no Stop) e o `report-check` cobram o relatório pela mesma régua
|
|
51
|
+
(`inspectReport`); conhecer o formato antes evita reescrever o relatório depois de dar a fatia por feita:
|
|
41
52
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- ≥ 2 fluxos de domínio independentes com peso (backend ‖ frontend) → **um sub-agent por fluxo, em
|
|
45
|
-
paralelo** (§3b); cadeia longa vai inteira ao agente do fluxo.
|
|
46
|
-
- ≥ 3 raízes independentes de effort ≥ M → raízes em **paralelo**, o resto sequencial.
|
|
47
|
-
- Senão, sequencial com auto-advance. Raiz S roda `inline`.
|
|
53
|
+
```markdown
|
|
54
|
+
# F{n} — {título}
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
quantas tasks ao mesmo tempo; o `morph-implement` §4 decide quem executa cada uma —
|
|
51
|
-
`DAG: sequencial` não significa "tudo inline". Registre a linha de decisão que o comando imprimiu.
|
|
56
|
+
{2-3 frases: o comportamento entregue, onde mora e como foi provado}
|
|
52
57
|
|
|
53
|
-
|
|
58
|
+
**Arquivos:** `{path}`, `{path}`
|
|
54
59
|
|
|
55
|
-
|
|
56
|
-
while (true):
|
|
57
|
-
ready = tasks 'pending' com todas as dependencies 'done' (releia tasks.json)
|
|
58
|
-
if ready vazio: break
|
|
59
|
-
task = ready[0]
|
|
60
|
-
marcar task.status = 'in_progress' (Edit, só campos mutáveis)
|
|
61
|
-
|
|
62
|
-
attempt = 0; feedback = null; pronto = false
|
|
63
|
-
while attempt < 3:
|
|
64
|
-
attempt += 1
|
|
65
|
-
// attempt 1: invoke Skill(morph-implement) with task. Nas seguintes, aplique o
|
|
66
|
-
// feedback direto ao código — reinvoque a skill só depois de /compact ou numa
|
|
67
|
-
// sessão nova, que descartam o conteúdo dela.
|
|
68
|
-
implementar (ou corrigir com feedback)
|
|
69
|
-
|
|
70
|
-
// OUTPUTS ANTES DO VERIFY: o recorte por task lê `outputs`.
|
|
71
|
-
atualizar task.outputs em tasks.json (divergiu do plano → `notes` na mesma edição)
|
|
72
|
-
|
|
73
|
-
run: morph-spec verify {feature} {task.id} --json
|
|
74
|
-
if verify.status == 'fail':
|
|
75
|
-
feedback = verify.feedback; continue // conta como tentativa
|
|
76
|
-
// 'busy': ver "Ritmo"
|
|
77
|
-
|
|
78
|
-
// cada doneCriteria com a evidência que o prova (teste, arquivo:linha) — do
|
|
79
|
-
// relatório `reports/{task.id}.md` quando despachada, do seu código quando inline
|
|
80
|
-
faltando = critérios sem evidência
|
|
81
|
-
if faltando: feedback = faltando; continue
|
|
82
|
-
pronto = true; break
|
|
83
|
-
|
|
84
|
-
if pronto:
|
|
85
|
-
// task com `3-implement/evidencias/{id}.md` em `outputs`: confira o arquivo antes do `done`
|
|
86
|
-
// (morph-implement §5). Em batch paralelo sem isolamento o sub-agente não roda eval — o
|
|
87
|
-
// ORQUESTRADOR roda, após o batch, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
|
|
88
|
-
marcar task.status = 'done' (Edit; confirme os outputs reais)
|
|
89
|
-
else:
|
|
90
|
-
// 3 tentativas sem verify verde + critérios: a única pausa do loop
|
|
91
|
-
registrar no recap as tentativas e o que faltou
|
|
92
|
-
AskUserQuestion: "Task {id} sem verify verde e critérios atendidos após 3 tentativas — aceitar, continuar tentando, ou pular?"
|
|
93
|
-
options: [aceitar (done com ressalva no recap), continuar (+3 tentativas), pular (blocked)]
|
|
94
|
-
```
|
|
60
|
+
**Checks:** C{n} — {teste que prova, ou `arquivo:linha`}
|
|
95
61
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
> `nodes.tests.runs[]` com `selection` e o motivo. `--filter {ids}` só força a escolha de nós (um
|
|
99
|
-
> filtro que não casa nada é erro de uso, exit 2); `--full` desliga o recorte. A verificação
|
|
100
|
-
> pós-batch e a do Gate 3 rodam **sem filtro**, e `verify {feature}` **nunca recorta**. Detalhe:
|
|
101
|
-
> `.morph/framework/CLI.md`, seção "Suítes de teste".
|
|
62
|
+
**Standards:** `{id}`, `{id}`
|
|
63
|
+
```
|
|
102
64
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
65
|
+
`**Arquivos:**` lista todo arquivo criado ou modificado; cada `C{n}` que a fatia `cobre` aparece pelo
|
|
66
|
+
id; relatório que abre com `PARCIAL` não conta como feito. Os relatórios **são** o registro da
|
|
67
|
+
implementação (não há `recap.md`): o `verify` confere a união dos `**Arquivos:**` contra os
|
|
68
|
+
`arquivos:` das fatias (aviso, nunca reprova). `**Standards:**` nomeia os ids que o agente de fato
|
|
69
|
+
consultou (o `report-check` não o exige).
|
|
70
|
+
- Persona não registrada: `general-purpose` com o campo `persona` de `agents.json` colado, e
|
|
71
|
+
`dispatch-fallback: general-purpose ({id} não registrado)` no relatório.
|
|
106
72
|
|
|
107
|
-
|
|
73
|
+
## 3. Dispatch — só o que muda
|
|
108
74
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
`domains`. Tipo não registrado: `general-purpose` com o campo `persona` colado, e
|
|
112
|
-
`dispatch-fallback: general-purpose ({id} não registrado)` nas `notes`. Cap de 4 agentes ao mesmo
|
|
113
|
-
tempo. **Cole o template literal** — só os campos entre `<>` mudam:
|
|
75
|
+
O contrato fixo (relatório, estado, teste, escopo, `wip`, processos, reuso, mutação e o formato do
|
|
76
|
+
relatório) está no corpo da persona gerada e chega a todo dispatch sem ser colado. O prompt leva:
|
|
114
77
|
|
|
115
78
|
```
|
|
116
79
|
dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
trabalho, nunca de conhecimento do codebase. Antes de criar tipo,
|
|
126
|
-
componente, hook ou serviço NOVO, verifique se já existe: `morph-spec graph
|
|
127
|
-
explain <nome>` e `graph affected <conceito> --uses-only`; sem grafo
|
|
128
|
-
(`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
|
|
129
|
-
nunca bloqueia. Se criar mesmo assim, diga por que em uma linha no relatório.
|
|
130
|
-
|
|
131
|
-
Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
|
|
132
|
-
turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
|
|
133
|
-
turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
|
|
134
|
-
Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
|
|
135
|
-
`ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
|
|
136
|
-
acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
|
|
137
|
-
se lê pelo `Grep` do erro, não inteiro.
|
|
138
|
-
|
|
139
|
-
Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
|
|
140
|
-
shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
|
|
141
|
-
`query-docs`). Impacto e vizinhança de símbolo vêm do grafo
|
|
142
|
-
(`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
|
|
143
|
-
(`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
|
|
144
|
-
|
|
145
|
-
Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
|
|
146
|
-
`///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
|
|
147
|
-
da task. Só o porquê que o código não mostra, em uma linha
|
|
148
|
-
(`architecture-code-comments`). O elo com a pós-condição vai no nome do
|
|
149
|
-
teste. O hook `comment-guard` bloqueia a edição que adiciona história,
|
|
150
|
-
banner ou bloco longo. Não modifique spec.md.
|
|
151
|
-
|
|
152
|
-
Contrato do relatório final:
|
|
153
|
-
1. GRAVE um relatório por task em
|
|
154
|
-
`.morph/features/{feature}/3-implement/reports/{taskId}.md` ANTES de
|
|
155
|
-
encerrar — é o retorno autoritativo. NÃO chame SendMessage.
|
|
156
|
-
2. NÃO toque em tasks.json, feature.json, state.json nem no board de
|
|
157
|
-
sessão — todo estado é gravado exclusivamente pelo orquestrador.
|
|
158
|
-
3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
|
|
159
|
-
Testes pelo orçamento: um por pós-condição, um de regressão por bug,
|
|
160
|
-
variantes numa tabela. NÃO rode teste a cada marco nem faça ciclo
|
|
161
|
-
red→green: compile e rode SÓ o filtro dos seus testes UMA vez, em
|
|
162
|
-
primeiro plano, saída em arquivo
|
|
163
|
-
(`… > .morph/logs/test-last.log 2>&1`). Não rode `morph-spec verify`.
|
|
164
|
-
Batch SEM isolamento: só compile. Com `isolation: "worktree"`: o mesmo
|
|
165
|
-
dentro do seu worktree, e o último ato é o commit na branch dele —
|
|
166
|
-
nunca faça merge.
|
|
167
|
-
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
168
|
-
volta — fatie antes, não depois.
|
|
169
|
-
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
170
|
-
corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
|
|
171
|
-
uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
|
|
172
|
-
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
173
|
-
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
174
|
-
na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
|
|
175
|
-
siga ou pare, por decisão sua; o relatório final substitui o parcial.
|
|
176
|
-
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
177
|
-
sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
|
|
178
|
-
suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
|
|
179
|
-
plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
|
|
180
|
-
nem espere em laço — diga no relatório o que não rodou.
|
|
181
|
-
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
182
|
-
substituto do relatório e não deve ser chamado.
|
|
183
|
-
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
184
|
-
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
185
|
-
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
186
|
-
|
|
187
|
-
Formato do relatório: (1) o que foi feito, em 2-3 frases; **Arquivos:** um
|
|
188
|
-
item `- \`path\`` por arquivo; **Critérios:** cada doneCriteria — atendido (o
|
|
189
|
-
teste ou `arquivo:linha` que o prova) ou não (por quê); (4) problemas.
|
|
80
|
+
Fatia F{n} — <título>
|
|
81
|
+
cobre: <cada Cn com o texto literal do cenário e a `prova:`>
|
|
82
|
+
arquivos: <os `arquivos:` da fatia>
|
|
83
|
+
standards: <por id: o digest de `morph-spec standards --find` + as 3-8 regras que ESTA fatia aplica>
|
|
84
|
+
reuso: <as linhas de `## Reuso` que tocam a fatia — conceito, veredito, alvo>
|
|
85
|
+
contexto: <o que você já leu: `arquivo:linhas` + o trecho; nada que o agente tenha de reler>
|
|
86
|
+
relatório: .morph/features/{feature}/3-implement/reports/F{n}.md (com `**Standards:**`: os ids consultados)
|
|
87
|
+
worktree: <só com isolamento>
|
|
190
88
|
```
|
|
191
89
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
`
|
|
196
|
-
`
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
`
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
1
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
90
|
+
## 4. Worktree rolling
|
|
91
|
+
|
|
92
|
+
Com `isolation: "worktree"` o hook `WorktreeCreate` cria `worktrees/<n>` na branch `morph-task/<n>`,
|
|
93
|
+
com junctions e `.morph/worktree.env` prontos (infra faltando: `morph-spec worktree link --all`).
|
|
94
|
+
**Rolling, não por onda:** a cada relatório, `report-check`, `git merge --no-ff <branch>` (conflito →
|
|
95
|
+
`git merge --abort` e a fatia volta a pendente com nota no relatório) e despache na hora a próxima fatia
|
|
96
|
+
que ficou pronta sem colidir com as em voo. Depois de cada retorno, `morph-spec worktree reap --json`
|
|
97
|
+
(`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou); o que sobrar sai por `morph-spec worktree remove --target <path> --delete-branch` (já mergeada; o
|
|
98
|
+
`git branch -d` dele recusa trabalho não integrado) — NUNCA `git worktree remove` cru,
|
|
99
|
+
que atravessa as junctions.
|
|
100
|
+
|
|
101
|
+
## 5. Retomar o controle
|
|
102
|
+
|
|
103
|
+
`morph-spec report-check {feature} F1 F2 … --json` com as fatias que voltaram. **Leia o arquivo de
|
|
104
|
+
relatório, não a mensagem** — a mensagem final pode não chegar ou vir resumida.
|
|
105
|
+
|
|
106
|
+
| Veredito | Ação |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `ok` | siga |
|
|
109
|
+
| `report-stale` | **não re-despache**: o agente escreveu depois de relatar; leia `observed` e atualize o relatório |
|
|
110
|
+
| `report-incomplete` + `resume` | `PARCIAL` na 1ª linha = a fatia não está pronta — o `report-check` o acusa como `report-incomplete`. Retome o MESMO agente por `SendMessage`, colando `tree.dirty`, `tree.commits` e o que falta |
|
|
111
|
+
| `report-incomplete` + `complete-degraded` | complete a partir da mensagem, carimbe DEGRADADO e registre a falha no relatório |
|
|
112
|
+
| `work-landed-report-missing` | não re-despache; grave você o relatório, DEGRADADO |
|
|
113
|
+
| `no-work-no-report` / `report-missing-evidence-unknown` | re-despache uma vez; segunda ausência sem trabalho = escale |
|
|
114
|
+
|
|
115
|
+
Árvore suja sem explicação ou `tree.markers` não vazio vão ao relatório da fatia.
|
|
116
|
+
|
|
117
|
+
## 6. Verify da feature, uma vez
|
|
118
|
+
|
|
119
|
+
Sem fatia pendente nem em voo, **primeiro o contexto** — antes do verify, para que a prova e o Gate 3
|
|
120
|
+
cubram a árvore que vai ao merge. Todo `.morph/context/*.md` que descreve um fato que esta feature
|
|
121
|
+
mudou tem o **corpo** reescrito para o estado novo, nunca empilhado (valor que ainda vale em algum
|
|
122
|
+
lugar diz onde); o changelog do documento guarda só data e motivo. Mudança estrutural
|
|
123
|
+
(`package.json`, `.csproj`, `next.config.*`, `tsconfig.json`, `docker-compose.yml`) atualiza também
|
|
124
|
+
`.morph/context/README.md` (stack, arquitetura, integrações) e `.morph/config/config.json` (stack,
|
|
125
|
+
arquitetura, integrações, paths). **Commite** o trabalho das fatias e essa atualização de contexto e
|
|
126
|
+
config **antes** do verify: o stamp grava o HEAD, e código ou `config.json` commitado depois dele é
|
|
127
|
+
árvore nova — um terceiro verify.
|
|
128
|
+
|
|
129
|
+
Depois `morph-spec verify {feature} --json`, **sem filtro** — nunca recorte o
|
|
130
|
+
verify da feature. `--filter` é do loop do próprio sub-agente; o Gate 3 e o CI rodam a suíte
|
|
131
|
+
inteira. Nó de teste sem `expectedCount`: acrescente `--record-baseline` a ESTA rodada — ela mede e
|
|
132
|
+
prova de uma vez; nunca um segundo verify só para gravar a baseline. Vermelho: corrija com `verify.feedback` (direto no código, ou re-despachando a fatia dona)
|
|
133
|
+
e rode de novo; **3 tentativas** sem verde → `AskUserQuestion` ("Verify de {feature} vermelho após 3
|
|
134
|
+
tentativas — aceitar com ressalva, continuar tentando, ou parar?").
|
|
135
|
+
|
|
136
|
+
**Cenário que julga saída de LLM** (`prova: eval`): a evidência é rodar, não ler código. Com nó
|
|
137
|
+
`runner: "evals"`: `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
|
|
138
|
+
(sonda, não prova de gate). Grave `3-implement/evidencias/{Cn}.md`: o cenário literal, o nó, o modelo
|
|
139
|
+
efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado pessoal, e o
|
|
140
|
+
veredito com a razão. Não é o `reports/F{n}.md`: aquele diz o que o agente fez; este prova, rodando,
|
|
141
|
+
que a saída atende ao cenário.
|
|
142
|
+
|
|
143
|
+
## 7. Review
|
|
144
|
+
|
|
145
|
+
Verify verde: `Skill(morph-review)`. O Gate 3 é apresentado, decidido e aprovado por ela; ao retomar o
|
|
146
|
+
controle, **não re-apresente o gate** — siga para o encerramento conforme `gateDecisions.review`.
|
|
147
|
+
|
|
148
|
+
## 8. Encerramento
|
|
149
|
+
|
|
150
|
+
- **Contexto já foi no §6**, antes da prova. Depois do Gate 3 nada muda `config.json` nem código: a
|
|
151
|
+
árvore integrada é a revisada. Commite na branch da feature o que faltar (relatórios do review) —
|
|
152
|
+
o `finish` exige a árvore limpa.
|
|
153
|
+
- **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo por `AskUserQuestion` (header
|
|
154
|
+
`"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
|
|
155
|
+
`aguardando-merge` em `list`/`fleet`.
|
|
156
|
+
|
|
157
|
+
## Escalada de escopo
|
|
158
|
+
|
|
159
|
+
| Situação | Caminho |
|
|
160
|
+
|---|---|
|
|
161
|
+
| Acréscimo pequeno dentro da fatia | registre no relatório da fatia — sem gate a revogar |
|
|
162
|
+
| **Fato errado**: o plano afirma algo que o código desmente, sem mudar escopo | bloco `## Errata` no FIM do `plan.md`, corpo intacto, append-only |
|
|
163
|
+
| **O escopo mudou** | `morph-spec unapprove {feature} plan --reason "..."`, emende, `plan-check`, re-aprove |
|
|
164
|
+
|
|
165
|
+
Ambiguidade que o plano não cobre não é escalada: resolva pelo lado conservador, registre a decisão sob `## Errata` do `plan.md`
|
|
166
|
+
e siga.
|
|
167
|
+
|
|
168
|
+
## Arquivo de teste
|
|
169
|
+
|
|
170
|
+
1. **Analise primeiro** — a IMPLEMENTAÇÃO está errada ou a ESPECIFICAÇÃO do teste está?
|
|
171
|
+
2. **Corrija a implementação primeiro** — o teste é a especificação; confie nele por padrão.
|
|
172
|
+
3. **Só mude um arquivo de teste se a própria expectativa estiver errada.**
|
|
173
|
+
4. **Antes de mudar, explique POR QUE o teste está errado** — qual é o comportamento certo.
|
|
174
|
+
|
|
175
|
+
## Debugging
|
|
176
|
+
|
|
177
|
+
Causa raiz antes do conserto: reproduza e leia o erro inteiro; erro conhecido de .NET/Next.js →
|
|
178
|
+
`/morph-troubleshoot <palavras>`; **uma hipótese por vez**, cada uma testada pela menor checagem que
|
|
179
|
+
a refutaria; depois de três consertos falhos, nunca tente um quarto sozinho — `AskUserQuestion`
|
|
180
|
+
com a pergunta de desenho que as falhas levantam; confirme com a mesma checagem que reproduziu.
|
|
246
181
|
|
|
247
182
|
## Anti-padrões
|
|
248
183
|
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
- Editar `spec.md` depois do Gate 2, ou `feature.json` à mão.
|
|
184
|
+
- Mais de 4 agentes ao mesmo tempo, ou duas fatias em voo no mesmo arquivo sem worktree.
|
|
185
|
+
- Sub-agente tocando `plan.md`, `checks.json` ou `feature.json`.
|
|
186
|
+
- Re-despachar sobre `report-stale` ou sobre um `PARCIAL` (retome o MESMO agente).
|
|
253
187
|
- Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
|
|
254
|
-
|
|
255
|
-
## Referências
|
|
256
|
-
|
|
257
|
-
- `.morph/framework/MORPH.md` §6 — contrato do relatório final
|
|
258
|
-
- `morph-spec dag|verify|report-check|worktree reap` — `.morph/framework/CLI.md`
|
|
259
|
-
- `.claude/skills/morph-implement/SKILL.md` §4 — template sequencial paritário
|
|
260
|
-
- `.claude/skills/morph-review/SKILL.md` — Gate 3
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
name: morph-hotfix
|
|
3
3
|
description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de produção com prioridade máxima em velocidade, com aprovação humana obrigatória antes do ship.
|
|
4
4
|
version: core
|
|
5
|
-
when_to_use: Use quando chegar "/morph-hotfix {feature}", quando a morph-
|
|
5
|
+
when_to_use: Use quando chegar "/morph-hotfix {feature}", quando a morph-plan rotear o pedido como workType hotfix, ou quando o usuário disser "produção caiu / hotfix / urgente" a respeito de um incidente
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "9.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-hotfix
|
|
@@ -16,7 +16,7 @@ Resolver uma queda ou bug crítico de produção o mais rápido possível — pr
|
|
|
16
16
|
## Quando invocar
|
|
17
17
|
|
|
18
18
|
- Usuário roda `/morph-hotfix {feature}` diretamente.
|
|
19
|
-
- `Skill(morph-
|
|
19
|
+
- `Skill(morph-plan)` roteia o pedido como `hotfix` e invoca esta skill.
|
|
20
20
|
- Usuário diz "produção caiu", "hotfix", "urgente", "incident", "P0" — sinais que o detector determinístico de `morph-spec create --request` já reconhece.
|
|
21
21
|
|
|
22
22
|
## Argumentos
|
|
@@ -31,7 +31,7 @@ Resolver uma queda ou bug crítico de produção o mais rápido possível — pr
|
|
|
31
31
|
morph-spec create {feature} --type hotfix --description "<o incidente: o que quebrou / sintoma>"
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
Carimba `name` (o slug) + `description` (obrigatória no nascimento — descreva o incidente) e
|
|
34
|
+
Carimba `name` (o slug) + `description` (obrigatória no nascimento — descreva o incidente) e o gate `plan` como `approvedBy: "policy:hotfix"`, e cria as pastas `2-plan/` e `3-implement/` num passo só — a feature já nasce em `implement` (fase derivada é gate-aware). Se a feature já existe, siga adiante sem recriar.
|
|
35
35
|
|
|
36
36
|
### 2. Scout — mapa do território (obrigatório)
|
|
37
37
|
|
|
@@ -41,47 +41,39 @@ Despache o scout com o sintoma reportado, antes de qualquer fix:
|
|
|
41
41
|
subagent_type: "morph-scout"
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
**Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback
|
|
44
|
+
**Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback no `reports/F1.md`**.
|
|
45
45
|
|
|
46
|
-
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura)
|
|
46
|
+
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) e o corpo da persona dele já carrega o contrato read-only: o contrato de dispatch dos implementadores — commit `wip`, orçamento de teste, escopo da fatia — não se aplica a quem não escreve. O prompt dele diz só o sintoma: ele não escreve nem reverte nada, e o mapa é a mensagem final (Observado/Inferido, no contrato de citação que a persona já carrega). Você grava o mapa.
|
|
47
47
|
|
|
48
48
|
**Audite o mapa antes do brief.** Grave a resposta do scout em `.morph/features/{feature}/2-plan/scout-map.md` e rode `morph-spec scout-check .morph/features/{feature}/2-plan/scout-map.md --json`. Exit ≠ 0 → descarte o mapa e re-despache o scout **uma** vez com as `failures` no prompt (o mapa novo abre com o motivo); na segunda reprovação, faça você o grep do root cause e siga. Root cause e blast radius que entram no brief se conferem com grep próprio mesmo com o mapa aprovado: sob pressão de hotfix, citação inventada vira um segundo incidente.
|
|
49
49
|
|
|
50
|
-
### 3.
|
|
50
|
+
### 3. Plano curto (`2-plan/plan.md` → `checks.json`)
|
|
51
51
|
|
|
52
|
-
Escreva o
|
|
52
|
+
Escreva o `plan.md` mínimo (~25 linhas) numa única escrita: o hotfix nasce com o gate `plan` carimbado, o `create` não escreve esqueleto e o arquivo congela assim que existe. Gramática completa: `morph-spec plan-check --help`.
|
|
53
53
|
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
54
|
+
- `## Problema` — o sintoma em produção, o root cause que o scout localizou e o blast radius.
|
|
55
|
+
- `## Cenários` — dois, sempre:
|
|
56
|
+
- **C1** — o sintoma ausente: dado o estado que quebrava, quando a ação que falhava, então o resultado certo. `prova: teste` (ou `e2e`).
|
|
57
|
+
- **C2** — a regressão do blast radius: o que o fix poderia quebrar continua funcionando. `prova: teste`.
|
|
58
|
+
- `## Decisões` com `### Conflitos com o acervo` (`nenhum` vale).
|
|
59
|
+
- `## Fatias` — uma, `### F1 — fix`, com `persona:`, `arquivos:` e `cobre: C1, C2`.
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
Rode `morph-spec plan-check {feature}` até zero erro: ele grava `2-plan/checks.json`, que o
|
|
62
|
+
`report-check` e o Gate 3 leem. Não pule esta escrita mesmo sob pressão de tempo.
|
|
60
63
|
|
|
61
|
-
|
|
64
|
+
### 4. Fix cirúrgico
|
|
62
65
|
|
|
63
|
-
- `
|
|
64
|
-
- `T2` — verify/regressão do blast radius.
|
|
66
|
+
Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` (a `morph-apply` §3 mostra o prompt: só os campos da fatia). Inline ou despachada, a fatia termina em `3-implement/reports/F1.md` com `**Arquivos:**` e `**Checks:**` (C1 e C2 com a evidência). Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
### 5. Fix cirúrgico
|
|
69
|
-
|
|
70
|
-
Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` conforme `MORPH.md` §6 se a task cruzar domínio ou tiver esforço L/XL. Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
|
|
71
|
-
|
|
72
|
-
A task fecha com o `verify` verde e o sintoma reproduzido antes e ausente depois — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
|
|
73
|
-
|
|
74
|
-
### 6. Test loop no blast radius
|
|
75
|
-
|
|
76
|
-
Rode a cadeia determinística focada na(s) task(s) do fix, não uma suíte ad-hoc:
|
|
68
|
+
### 5. Prova
|
|
77
69
|
|
|
78
70
|
```
|
|
79
|
-
morph-spec verify {feature}
|
|
71
|
+
morph-spec verify {feature} --json
|
|
80
72
|
```
|
|
81
73
|
|
|
82
|
-
|
|
74
|
+
Sem filtro: é a prova que o Gate 3 lê. Para iterar rápido antes, `--skip-tests`/`--skip-build` servem, mas não gravam o stamp `verification` (`reason: 'skip-tests'`/`'skip-build'`): o Gate 3 só lê uma execução completa. C1 se prova com o sintoma reproduzido antes e ausente depois; capture a saída real no `3-implement/reports/F1.md` — não descreva "testes passaram" sem colar a evidência.
|
|
83
75
|
|
|
84
|
-
###
|
|
76
|
+
### 6. Gate 3 — SEMPRE humano
|
|
85
77
|
|
|
86
78
|
O hotfix nasce com o Gate 3 em `forcedPauseGates` — o Gate 3 pausa **sempre**, mesmo em `trust: auto`. `gate-check` já sabe disso: lê `workType` do disco e `shouldPauseGate` força a pausa antes de checar qualquer outro sinal — rode direto, sem `--signals`:
|
|
87
79
|
|
|
@@ -89,7 +81,7 @@ O hotfix nasce com o Gate 3 em `forcedPauseGates` — o Gate 3 pausa **sempre**,
|
|
|
89
81
|
morph-spec gate-check {feature} review [--json]
|
|
90
82
|
```
|
|
91
83
|
|
|
92
|
-
Escreva `4-review/
|
|
84
|
+
Escreva você mesmo `4-review/verifier.md` — o hotfix não despacha verificador nem revisor: `**Verdict:** SHIP|FIX`, `**Reviewed-SHA:** {git rev-parse HEAD}`, `## Checks` com C1 e C2 (`| Cn | PROVADO|NÃO PROVADO|FALHA | evidência |`, a evidência é a saída real do `verify` do passo 5), o diff do fix e `## Bloqueadores` (`Nenhum.` quando não há). Depois, **`AskUserQuestion` SEMPRE**:
|
|
93
85
|
|
|
94
86
|
```
|
|
95
87
|
question: "Gate 3 — Hotfix de {feature} pronto para ship?"
|
|
@@ -108,9 +100,9 @@ morph-spec approve {feature} review --approver "<nome de quem aprovou>"
|
|
|
108
100
|
|
|
109
101
|
`--approver` é a única assinatura que passa pelo backstop em headless — as outras rotas de `resolveApprovedBy` (`--mode auto`, e "sem TTY") resolvem para `"auto"` e são recusadas. Ela é **auto-declarada**: o CLI não consegue verificar que houve um humano, só recusa as assinaturas definitivamente não-humanas. Por isso: **nunca invente o nome** — use `--approver` só quando o humano de fato aprovou, senão o backstop do hotfix vira teatro.
|
|
110
102
|
|
|
111
|
-
###
|
|
103
|
+
### 7. Pós-gate (o "test loop → ship" de `MORPH.md` §2.1)
|
|
112
104
|
|
|
113
|
-
-
|
|
105
|
+
- Se o código mudou depois do verify do passo 5 (ajuste pedido no Gate 3), rode `morph-spec verify {feature}` de novo.
|
|
114
106
|
- Feche com `morph-spec finish {feature} --pr|--merge` — o mesmo encerramento único das demais features (arquiva commitando dentro de `morph/{f}`, desmonta). Num hotfix urgente o `--merge` (local, direto na default, integra na hora) costuma ser o caminho; use `--pr` quando o fix precisa passar por CI/review antes do merge — mas `--pr` **não integra**: sai com `finished: true` e `integrated: false`, `awaiting: "merge"`. Um hotfix "fechado" por `--pr` ainda não chegou na produção — não relate o incidente como resolvido até o merge. Ver `MORPH.md` §2.2.
|
|
115
107
|
- Não integre automaticamente — o usuário decide quando e por qual modo (`finish` toca a default ou o remoto). Feature legada sem `morph/{f}`: `finish` roteia para `morph-spec archive {feature}`.
|
|
116
108
|
|
|
@@ -119,24 +111,23 @@ morph-spec approve {feature} review --approver "<nome de quem aprovou>"
|
|
|
119
111
|
- Não pular o scout — mesmo sob pressão, o mapa de blast radius evita um segundo incidente causado pelo próprio fix.
|
|
120
112
|
- Não auto-aprovar o Gate 3 — nunca tente `morph-spec approve {feature} review --mode auto` num hotfix; o backstop server-side existe exatamente para isso.
|
|
121
113
|
- Não "fazer do jeito certo" às custas da velocidade — refatoração, cobertura extra, ou hardening que não bloqueia o sintoma atual vira item no roadmap-fora-hotfix, não neste diff.
|
|
122
|
-
- Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no
|
|
114
|
+
- Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no `verifier.md`.
|
|
123
115
|
|
|
124
116
|
## Output esperado
|
|
125
117
|
|
|
126
|
-
- `.morph/features/{feature}/
|
|
127
|
-
- `.morph/features/{feature}/
|
|
128
|
-
- `.morph/features/{feature}/
|
|
129
|
-
-
|
|
130
|
-
- Gates `proposal`/`plan` carimbados `approvedBy: "policy:hotfix"`; Gate 3 registrado em `feature.json` (autoritativo) com uma **assinatura humana** — `"manual"` pelo `state-sync` (resposta ao `AskUserQuestion`), o nome passado em `--approver`, ou `$USER` num terminal interativo. **Nunca `"auto"`** — é o que o backstop recusa.
|
|
118
|
+
- `.morph/features/{feature}/2-plan/plan.md` + `checks.json` — C1 sintoma ausente, C2 regressão, F1 fix
|
|
119
|
+
- `.morph/features/{feature}/3-implement/reports/F1.md` — o relatório da fatia, com a evidência real de teste
|
|
120
|
+
- `.morph/features/{feature}/4-review/verifier.md` — escrito pelo orquestrador: C1/C2 com evidência + diff, Gate 3 sempre humano
|
|
121
|
+
- Gate `plan` carimbado `approvedBy: "policy:hotfix"`; Gate 3 registrado em `feature.json` (autoritativo) com uma **assinatura humana** — `"manual"` pelo `state-sync` (resposta ao `AskUserQuestion`), o nome passado em `--approver`, ou `$USER` num terminal interativo. **Nunca `"auto"`** — é o que o backstop recusa.
|
|
131
122
|
|
|
132
123
|
## Referências
|
|
133
124
|
|
|
134
125
|
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho
|
|
135
126
|
- `.morph/framework/MORPH.md` §5 — Gates de aprovação, gate humano forçado no hotfix
|
|
136
127
|
- `.morph/framework/MORPH.md` §6 — Sub-agents, persona de estágio scout, protocolo obrigatório
|
|
137
|
-
- `.claude/skills/morph-
|
|
138
|
-
- `.claude/skills/morph-
|
|
128
|
+
- `.claude/skills/morph-plan/SKILL.md` — roteamento que invoca esta skill
|
|
129
|
+
- `.claude/skills/morph-apply/SKILL.md` §3/§5 — prompt de dispatch e retomada por `report-check`
|
|
139
130
|
- `morph-spec create {feature} --type hotfix --json` — mostra a política do tipo (`scaffold`, `skippedGates`, `forcedPauseGates`) como o CLI a aplicou
|
|
140
131
|
- `morph-spec create {feature} --type hotfix` — nascimento com política de gates
|
|
141
|
-
- `morph-spec verify {feature}
|
|
132
|
+
- `morph-spec verify {feature} --json` — cadeia determinística build+testes+validadores
|
|
142
133
|
- `morph-spec gate-check {feature} review [--json]` — persiste a decisão de pausa (forçada por `workType: hotfix`) antes do Gate 3
|
|
@@ -4,7 +4,7 @@ description: Cuida da RAM e da CPU da máquina enquanto o morph-spec trabalha
|
|
|
4
4
|
version: core
|
|
5
5
|
when_to_use: Use quando a máquina estiver lenta ou sem RAM, um comando pesado esperou ou foi recusado pela fila, sobrou worktree de sub-agent, ou vários sub-agents pesados vão rodar em paralelo
|
|
6
6
|
user-invocable: false
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "9.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-machine
|
|
@@ -42,5 +42,5 @@ Limites: não cobre `run_in_background`, PowerShell nem comando fora da lista; u
|
|
|
42
42
|
|
|
43
43
|
## Referências
|
|
44
44
|
|
|
45
|
-
- `.morph/framework/CLI.md` —
|
|
45
|
+
- `.morph/framework/CLI.md` — `### heavy`, `### worktree reap`, `### doctor --procs` e `### worktree.root`.
|
|
46
46
|
- `MORPH.md` §2.2 (worktrees) e a cláusula 6 dos templates de dispatch (PROCESSOS).
|
|
@@ -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_use: Use quando a tarefa for PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisar decidir modelo, prompt e aprovação
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "9.0.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- dotnet
|
|
10
10
|
- nextjs
|