@polymorphism-tech/morph-spec 9.8.0 → 10.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.
Files changed (185) hide show
  1. package/CLAUDE.md +10 -10
  2. package/README.md +4 -4
  3. package/bin/morph-spec.js +40 -43
  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 +24 -30
  8. package/framework/MORPH.md +47 -123
  9. package/framework/agents.json +6 -374
  10. package/framework/commands/morph-apply.md +1 -1
  11. package/framework/commands/morph-archive.md +4 -3
  12. package/framework/commands/morph-hotfix.md +8 -30
  13. package/framework/commands/morph-infra.md +2 -2
  14. package/framework/commands/morph-media.md +10 -9
  15. package/framework/commands/morph-review.md +15 -0
  16. package/framework/commands/morph-status.md +1 -1
  17. package/framework/docs/CLI.md +83 -94
  18. package/framework/evals/review-checklist.md +45 -53
  19. package/framework/hooks/README.md +4 -4
  20. package/framework/hooks/claude-code/core/README.md +1 -1
  21. package/framework/hooks/claude-code/core/denylist.json +4 -4
  22. package/framework/hooks/claude-code/core/gate-guard.js +9 -0
  23. package/framework/hooks/claude-code/core/masked-exit.js +49 -0
  24. package/framework/hooks/claude-code/core/state-sync.js +4 -1
  25. package/framework/hooks/claude-code/core/telemetry-log.js +1 -2
  26. package/framework/hooks/claude-code/core/test-budget.js +10 -70
  27. package/framework/hooks/claude-code/core/validate-completion.js +11 -24
  28. package/framework/hooks/claude-code/core/worktree-context.js +5 -22
  29. package/framework/hooks/claude-code/core/worktree-create.js +6 -45
  30. package/framework/hooks/claude-code/core/worktree-env-inject.js +2 -10
  31. package/framework/hooks/shared/e2e-check.js +0 -0
  32. package/framework/hooks/shared/gate-event.js +2 -2
  33. package/framework/hooks/shared/graph-refresh.js +20 -3
  34. package/framework/hooks/shared/heavy-command.js +32 -1
  35. package/framework/hooks/shared/heavy-config.js +1 -1
  36. package/framework/hooks/shared/next-step.js +63 -24
  37. package/framework/hooks/shared/phase-utils.js +6 -9
  38. package/framework/hooks/shared/report-progress.js +86 -0
  39. package/framework/hooks/shared/state-reader.js +3 -2
  40. package/framework/hooks/statusline.js +332 -0
  41. package/framework/phases.json +32 -10
  42. package/framework/rules/ai-agents-standards.md +9 -1
  43. package/framework/rules/csharp-standards.md +4 -0
  44. package/framework/rules/ef-standards.md +20 -0
  45. package/framework/rules/frontend-standards.md +1 -1
  46. package/framework/rules/implement-report.md +25 -0
  47. package/framework/rules/infrastructure-standards.md +2 -0
  48. package/framework/rules/nextjs-standards.md +7 -0
  49. package/framework/rules/plan-grammar.md +53 -0
  50. package/framework/rules/ui-design.md +27 -0
  51. package/framework/schemas/config.schema.json +11 -18
  52. package/framework/schemas/feature.schema.json +7 -1
  53. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  54. package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +1 -1
  55. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +2 -2
  56. package/framework/skills/core/morph-apply/SKILL.md +38 -166
  57. package/framework/skills/core/morph-apply/references/debugging.md +8 -0
  58. package/framework/skills/core/morph-apply/references/hotfix.md +42 -0
  59. package/framework/skills/core/morph-apply/references/machine.md +29 -0
  60. package/framework/skills/core/{morph-media/SKILL.md → morph-apply/references/media.md} +11 -74
  61. package/framework/skills/core/morph-apply/references/review.md +65 -0
  62. package/framework/skills/core/morph-plan/SKILL.md +42 -108
  63. package/framework/skills/core/morph-plan/references/critique.md +40 -0
  64. package/framework/skills/core/morph-plan/references/interview.md +25 -0
  65. package/framework/skills/core/morph-uiux/SKILL.md +47 -64
  66. package/framework/skills/core/morph-uiux/surfaces.json +32 -0
  67. package/framework/standards/STANDARDS.json +32 -5
  68. package/framework/standards/STANDARDS.meta.json +5 -1
  69. package/framework/standards/ai-agents/agent-session.md +2 -3
  70. package/framework/standards/ai-agents/context-providers.md +2 -2
  71. package/framework/standards/ai-agents/durable-workflows-hitl.md +2 -2
  72. package/framework/standards/ai-agents/providers/model-registry.md +2 -2
  73. package/framework/standards/ai-agents/rag-custom-pgvector.md +6 -6
  74. package/framework/standards/ai-agents/setup.md +1 -1
  75. package/framework/standards/ai-agents/tool-adapters.md +2 -2
  76. package/framework/standards/architecture/stack-baseline.md +47 -0
  77. package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -4
  78. package/framework/standards/frontend/design-system/ai-image-generation.md +51 -12
  79. package/framework/standards/frontend/design-system/ai-video-generation.md +50 -4
  80. package/framework/standards/frontend/design-system/art-direction.md +2 -2
  81. package/framework/standards/frontend/scroll-driven/frame-scrub.md +12 -2
  82. package/framework/standards/frontend/scroll-driven/scroll-components.md +76 -4
  83. package/framework/templates/REGISTRY.json +1 -2
  84. package/framework/templates/context/ARCHITECTURE.md +1 -1
  85. package/framework/templates/docs/plan.md +12 -12
  86. package/framework/templates/docs/ui-mockups.md +17 -105
  87. package/package.json +1 -1
  88. package/src/commands/e2e/e2e.js +88 -23
  89. package/src/commands/graph/diff.js +74 -0
  90. package/src/commands/graph/status.js +1 -1
  91. package/src/commands/observability/cost.js +2 -4
  92. package/src/commands/observability/telemetry.js +1 -1
  93. package/src/commands/project/doctor.js +23 -39
  94. package/src/commands/project/fleet.js +5 -6
  95. package/src/commands/project/init.js +63 -36
  96. package/src/commands/project/stack-scan.js +3 -42
  97. package/src/commands/project/stack-set.js +26 -0
  98. package/src/commands/project/status.js +12 -13
  99. package/src/commands/project/update.js +39 -3
  100. package/src/commands/project/worktree.js +3 -14
  101. package/src/commands/state/advance.js +17 -17
  102. package/src/commands/state/approve.js +0 -6
  103. package/src/commands/state/archive.js +27 -1
  104. package/src/commands/state/auto-approval.js +1 -1
  105. package/src/commands/state/create.js +0 -5
  106. package/src/commands/state/gate-check.js +37 -30
  107. package/src/commands/state/gate-decision.js +3 -2
  108. package/src/commands/state/next.js +1 -0
  109. package/src/commands/state/recap.js +67 -0
  110. package/src/commands/state/report-check.js +36 -178
  111. package/src/commands/validation/plan-check.js +16 -11
  112. package/src/commands/validation/validate-feature.js +3 -3
  113. package/src/commands/validation/verify.js +3 -6
  114. package/src/core/paths/output-schema.js +3 -3
  115. package/src/core/state/state-manager.js +2 -4
  116. package/src/dashboard/app/components/CommandPalette.jsx +2 -5
  117. package/src/dashboard/app/components/GatePauses.jsx +116 -0
  118. package/src/dashboard/app/components/SessionMap.jsx +77 -0
  119. package/src/dashboard/app/pages/Activity.jsx +4 -0
  120. package/src/dashboard/app/pages/AgentMap.jsx +1 -2
  121. package/src/dashboard/app/pages/FeatureDetail.jsx +129 -186
  122. package/src/dashboard/app/pages/Features.jsx +7 -7
  123. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  124. package/src/dashboard/app/pages/Portfolio.jsx +40 -5
  125. package/src/dashboard/scanner/activity-scanner.js +29 -0
  126. package/src/dashboard/scanner/agents-scanner.js +11 -14
  127. package/src/dashboard/scanner/features-scanner.js +45 -24
  128. package/src/dashboard/scanner/project-api.js +11 -2
  129. package/src/dashboard/scanner/skills-scanner.js +11 -1
  130. package/src/lib/e2e/applicability.js +3 -1
  131. package/src/lib/git/tree-state.js +1 -16
  132. package/src/lib/graph/diff-tree.js +127 -0
  133. package/src/lib/graph/graphify-runtime.js +12 -5
  134. package/src/lib/installers/memory-installer.js +2 -2
  135. package/src/lib/installers/rules-installer.js +57 -0
  136. package/src/lib/installers/stack-assets.js +17 -0
  137. package/src/lib/installers/stack-sync.js +219 -0
  138. package/src/lib/plan/checks.js +55 -110
  139. package/src/lib/plan/critique.js +28 -0
  140. package/src/lib/plan/media.js +42 -0
  141. package/src/lib/plan/plan-html.js +125 -0
  142. package/src/lib/plan/plan-parser.js +34 -45
  143. package/src/lib/recap/piper.js +36 -0
  144. package/src/lib/recap/recap.js +232 -0
  145. package/src/lib/review-reports.js +28 -4
  146. package/src/lib/risk-detector.js +90 -11
  147. package/src/lib/specs/screen-checklist.js +33 -48
  148. package/src/lib/stack/dotnet-build-ignores.js +8 -9
  149. package/src/lib/telemetry/metrics.js +27 -29
  150. package/src/lib/validators/reuse/reuse-validator.js +1 -9
  151. package/src/lib/validators/verify-runner.js +0 -7
  152. package/src/lib/worktree/fleet-scanner.js +7 -20
  153. package/src/lib/worktree/worktree-audit.js +0 -37
  154. package/src/scripts/setup-infra.js +15 -50
  155. package/src/utils/agents-installer.js +27 -201
  156. package/src/utils/hooks-installer.js +11 -95
  157. package/framework/hooks/claude-code/core/warn-bash-source-write.js +0 -23
  158. package/framework/hooks/claude-code/statusline.py +0 -699
  159. package/framework/hooks/claude-code/statusline.sh +0 -11
  160. package/framework/hooks/shared/agent-reap.js +0 -74
  161. package/framework/hooks/shared/slice-progress.js +0 -110
  162. package/framework/skills/core/morph-hotfix/SKILL.md +0 -133
  163. package/framework/skills/core/morph-machine/SKILL.md +0 -46
  164. package/framework/skills/core/morph-review/SKILL.md +0 -129
  165. package/framework/skills/core/morph-standards/SKILL.md +0 -52
  166. package/framework/standards/PROVENANCE.json +0 -119
  167. package/src/commands/project/worktree-reap.js +0 -34
  168. package/src/commands/state/handoff.js +0 -65
  169. package/src/commands/validation/mutate.js +0 -263
  170. package/src/commands/validation/scout-check.js +0 -28
  171. package/src/lib/generators/handoff-generator.js +0 -172
  172. package/src/lib/mutation/adapters.js +0 -79
  173. package/src/lib/mutation/commands.js +0 -61
  174. package/src/lib/mutation/dotnet-introspection.js +0 -281
  175. package/src/lib/mutation/manifest.js +0 -144
  176. package/src/lib/mutation/plan.js +0 -44
  177. package/src/lib/mutation/report.js +0 -68
  178. package/src/lib/mutation/runner.js +0 -301
  179. package/src/lib/mutation/schemata.js +0 -60
  180. package/src/lib/mutation/snapshot.js +0 -65
  181. package/src/lib/mutation/subset.js +0 -109
  182. package/src/lib/mutation/trx.js +0 -50
  183. package/src/lib/scout/scout-check.js +0 -293
  184. package/src/lib/validators/traceability-check.js +0 -103
  185. package/src/lib/worktree/agent-reaper.js +0 -247
@@ -122,11 +122,16 @@
122
122
  "e2e": {
123
123
  "type": "object",
124
124
  "additionalProperties": true,
125
- "description": "The verification stack of `e2e up` and of the verify e2e node. Only hostServices is described here; the other keys (auth, command, portEnvNames, ...) stay open.",
125
+ "description": "The verification stack of `e2e up` and of the verify e2e node. Only hostServices and resetCommand are described here; the other keys (auth, command, portEnvNames, ...) stay open.",
126
126
  "properties": {
127
+ "resetCommand": {
128
+ "type": "string",
129
+ "minLength": 1,
130
+ "description": "Run by `e2e reset` to put the running stack's data back in a known state between verification flows, with the stack env (port block + e2e.auth.envFile), before the auth seed. Unset: `e2e reset` recreates, empty, the compose services without a build section that mount a named, non-external volume (rm -sfv, volume rm, up -d --wait). App services and hostServices are never restarted."
131
+ },
127
132
  "hostServices": {
128
133
  "type": "array",
129
- "description": "Apps that run as host processes next to the compose stack, when building them inside the Docker VM is expensive: compose keeps only the dependencies. Order on `e2e up` and on the verify e2e node: compose up --wait, then each service in array order (build, start detached, health), then the auth seed. They stay up until `e2e down`, `finish`, `delete` or `worktree remove`. Reused while the code stamp (HEAD + status + diff) matches and health is green; a divergent stamp or --fresh/--fresh-e2e kills, rebuilds and restarts them. A failure (build exit != 0, timeout, health never green) fails `e2e up` (exit 1) and the e2e node with the service name and its log tail, kills what this run started and skips the seed. The authority at runtime is validateServices() in framework/hooks/shared/host-services.js.",
134
+ "description": "Apps that run as host processes, in the feature's port block: next to the compose stack when building them inside the Docker VM is expensive (compose keeps only the dependencies), or alone when the app has no dependency to containerize (no database, no queue). Without a compose file and without a configured e2e.composeFile, a non-empty hostServices IS the stack (host-only): no compose lint, no Docker check, `e2e reset` runs resetCommand or only the seed. Order on `e2e up` and on the verify e2e node: compose up --wait (skipped host-only), then each service in array order (build, start detached, health), then the auth seed. They stay up until `e2e down`, `finish`, `delete` or `worktree remove`. Reused while the code stamp (HEAD + status + diff) matches and health is green; a divergent stamp or --fresh/--fresh-e2e kills, rebuilds and restarts them. A failure (build exit != 0, timeout, health never green) fails `e2e up` (exit 1) and the e2e node with the service name and its log tail, kills what this run started and skips the seed. The authority at runtime is validateServices() in framework/hooks/shared/host-services.js.",
130
135
  "items": {
131
136
  "type": "object",
132
137
  "additionalProperties": false,
@@ -237,7 +242,7 @@
237
242
  "type": "object",
238
243
  "additionalProperties": false,
239
244
  "default": { "unit": 1.5, "build": 4, "e2e": 4 },
240
- "description": "Free-RAM floor per kind of heavy command. unit = vitest/jest, npm|pnpm|yarn test, the verify tests node; e2e = playwright, docker compose up, the verify e2e node, e2e up; build = everything else (dotnet build|test|publish, next build, docker build, mutate, unknown commands). A verify admitted at a lighter node waits again, holding its slot, before a heavier one. A kind left out takes an explicit heavy.minFreeMemGb, else its default.",
245
+ "description": "Free-RAM floor per kind of heavy command. unit = vitest/jest, npm|pnpm|yarn test, the verify tests node; e2e = playwright, docker compose up, the verify e2e node, e2e up; build = everything else (dotnet build|test|publish, next build, docker build, unknown commands). A verify admitted at a lighter node waits again, holding its slot, before a heavier one. A kind left out takes an explicit heavy.minFreeMemGb, else its default.",
241
246
  "properties": {
242
247
  "unit": { "type": "number", "minimum": 0 },
243
248
  "build": { "type": "number", "minimum": 0 },
@@ -268,15 +273,15 @@
268
273
  },
269
274
  "gateBash": {
270
275
  "type": "boolean",
271
- "default": false,
272
- "description": "Opt-in. A PreToolUse hook takes a slot before a raw heavy Bash command (dotnet build|test|publish|pack, npm|pnpm|yarn test|build, vitest, jest, docker compose up|build, ...) runs and the matching Post hook gives it back. Waits up to heavy.waitTimeoutSec (capped below the hook timeout), then refuses the call with a busy message instead of running it. Foreground Bash only: a run_in_background call is not gated, and a call denied or interrupted after the hook keeps its slot until its timeout lapses, and that timeout starts before the permission prompt."
276
+ "default": true,
277
+ "description": "On by default: the session runs builds and tests itself, so a raw heavy command queues like the verify does. A PreToolUse hook takes a slot before a raw heavy Bash command (dotnet build|test|publish|pack, npm|pnpm|yarn test|build, vitest, jest, docker compose up|build, ...) runs and the matching Post hook gives it back. Waits up to heavy.waitTimeoutSec (capped below the hook timeout), then refuses the call with a busy message instead of running it. Foreground Bash only: a run_in_background call is not gated, and a call denied or interrupted after the hook keeps its slot until its timeout lapses, and that timeout starts before the permission prompt."
273
278
  }
274
279
  }
275
280
  },
276
281
  "worktree": {
277
282
  "type": "object",
278
283
  "additionalProperties": true,
279
- "description": "Worktree behaviour of this project. Other keys are left open; the readers are src/lib/worktree/vscode-settings.js and src/lib/worktree/agent-reaper.js.",
284
+ "description": "Worktree behaviour of this project. Other keys are left open; the reader is src/lib/worktree/vscode-settings.js.",
280
285
  "properties": {
281
286
  "root": {
282
287
  "type": "string",
@@ -287,18 +292,6 @@
287
292
  "type": "boolean",
288
293
  "default": true,
289
294
  "description": "false stops `init`, `update`, `worktree setup|provision` and `doctor --worktrees --prune` from adding the worktree/node_modules (and, on .NET, bin/obj) excludes to .vscode/settings.json. `MORPH_EDITOR_SETTINGS=0` does the same for one run."
290
- },
291
- "reap": {
292
- "type": "object",
293
- "additionalProperties": false,
294
- "properties": {
295
- "graceMinutes": {
296
- "type": "number",
297
- "minimum": 0,
298
- "default": 30,
299
- "description": "How long a sub-agent's events.jsonl must stay quiet after its AgentUsage before `worktree reap` removes the tree: a stopped agent can still be resumed by SendMessage. An invalid value falls back to 30."
300
- }
301
- }
302
295
  }
303
296
  }
304
297
  }
@@ -29,6 +29,11 @@
29
29
  "format": "date-time",
30
30
  "description": "Stamped by `morph-spec archive`."
31
31
  },
32
+ "archivedFrom": {
33
+ "type": "object",
34
+ "properties": { "sha": { "type": "string", "pattern": "^[0-9a-f]{40}$" } },
35
+ "description": "Branch tip before `morph-spec archive` pruned the folder to feature.json + 2-plan/plan.md: the report, reviews and evidence stay readable at this sha."
36
+ },
32
37
  "abandonedAt": {
33
38
  "type": "string",
34
39
  "format": "date-time",
@@ -52,7 +57,8 @@
52
57
  "type": "object",
53
58
  "required": ["pause", "reason", "signals", "trust", "decidedAt"],
54
59
  "properties": {
55
- "pause": { "type": "boolean", "description": "true = the gate must pause for a human (AskUserQuestion); false = auto-pass with a short summary." },
60
+ "pause": { "type": "boolean", "description": "true = the gate does not pass yet: `resolver` says who clears it (the session by doing the work, or a human by AskUserQuestion); false = auto-pass with a short summary." },
61
+ "resolver": { "type": ["string", "null"], "enum": ["session", "human", null], "description": "Who clears a pause: `session` does the work the reason names and runs gate-check again (verify, fix loop, plan-check, review dispatch); `human` answers the gate question. null when the gate does not pause. Rule: `pauseResolver` in src/lib/risk-detector.js." },
56
62
  "reason": { "type": "string", "description": "The signal that drove the decision (or 'nenhum sinal de risco')." },
57
63
  "signals": {
58
64
  "type": "object",
@@ -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_use: Use quando for iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invocable: true
7
- cliVersion: "9.8.0"
7
+ cliVersion: "10.0.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -1,6 +1,6 @@
1
1
  # Umbraco 17 / .NET 10 + Next.js: Padrões e Gotchas do Sistema de Leads (Frente 4)
2
2
 
3
- > **Origem:** documentado a partir do código real em `MORPH_Umbraco_LP_Template` (template canônico) e validado contra `Gardim_LP_Umbraco` (implementação de referência).
3
+ > **Origem:** documentado a partir do código real em `MORPH_Umbraco_LP_Template` (template canônico) e validado contra uma LP em produção derivada dele.
4
4
  > **Natureza:** referência consultável para devs adaptando o template para novos clientes — não é um skill executável. A lógica vive no template repo; este doc é o mapa dos padrões e armadilhas.
5
5
  > **Convenção de citação:** cada padrão cita o **arquivo real** no `MORPH_Umbraco_LP_Template`. Símbolos (método/classe/alias) são âncoras estáveis; números de linha, quando aparecem, são auxiliares e podem deslizar entre versões.
6
6
 
@@ -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_use: Use quando o usuário pedir "use /migrate-lp-to-umbraco {projeto}" ou descrever a necessidade de migrar uma LP para Umbraco
6
6
  user-invocable: true
7
- cliVersion: "9.8.0"
7
+ cliVersion: "10.0.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -346,7 +346,7 @@ Copiar as variáveis de design da origem para `frontend/src/app/globals.css` no
346
346
  href="https://fonts.googleapis.com/css2?...">` no `<head>` é render-blocking (round-trip
347
347
  externo antes de qualquer paint) e, combinado com `font-display: swap`, causa CLS quando a
348
348
  fonte troca depois do primeiro paint — foi 1.680ms de render-blocking estimado e 0.221 de CLS
349
- medidos num caso real (Barone_LP). **Não usar `next/font/google`** aqui (diferente do passo 4
349
+ medidos numa LP real migrada. **Não usar `next/font/google`** aqui (diferente do passo 4
350
350
  de `create-umbraco-lp`, que pode usar): o nome de família que ele gera é escopado/diferente do
351
351
  literal da origem, e o gate de paridade (passo 6b.2) compara `font-family` computado
352
352
  byte-a-byte contra a origem — `next/font` quebra esse check.
@@ -1,189 +1,61 @@
1
1
  ---
2
2
  name: morph-apply
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).
3
+ description: Implementa o plano aprovado de uma feature morph-spec inteiro nesta sessão, prova com um verify sem filtro, conduz o Gate 3 (verificador, revisor e segurança em contexto fresco) e fecha com finish. Também conduz hotfix e chore.
4
4
  version: core
5
- when_to_use: Use com o gate do plano aprovado, em "use /morph-apply {feature}" ou "implementar feature"
5
+ when_to_use: Use com o gate do plano aprovado ("/morph-apply {feature}", "implementar feature"), em "/morph-review {feature}" (entra no §5), em "/morph-hotfix {feature}" ou incidente de produção (references/hotfix.md), ou quando `morph-spec next` mandar implement, verify, fix, review ou finish
6
6
  user-invocable: true
7
- cliVersion: "9.8.0"
7
+ cliVersion: "10.0.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
11
11
 
12
- ## Objetivo
12
+ Do plano aprovado à feature fechada, numa janela só. O progresso é `3-implement/report.md`; o próximo passo é o que `morph-spec next {feature}` disser.
13
13
 
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.
14
+ ## 1. Contexto, uma vez
18
15
 
19
- ## Ritmo
16
+ Leia `2-plan/plan.md` e `2-plan/checks.json` uma vez por sessão (ou depois de um `/compact`): o plano está congelado, não releia por padrão — só o trecho que falta. Retomando, leia também `3-implement/report.md`: é a sua memória.
20
17
 
21
- Comando em primeiro plano; o `verify {feature}` que passa do teto de 10 min do Bash vai com
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
24
- pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
25
- saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
18
+ `.morph/config/config.json` sem `project.stack` → a stack é do usuário: `AskUserQuestion` com a stack completa do Morph recomendada (`dotnet+nextjs --with neon`, standard `architecture-stack-baseline`), depois `morph-spec stack-set <stack>`. As rules de domínio só valem numa sessão nova: peça para reabrir antes de qualquer código. Sem `project.tests` → declare-os a partir do `## Contrato de implementação` (forma em `.morph/framework/schemas/config.schema.json`) e confira com `morph-spec doctor --full`, antes de qualquer código.
26
19
 
27
- ## 1. Contexto, uma vez
20
+ ## 2. Implementar
28
21
 
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.
40
-
41
- ## 2. Fatiar
42
-
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.
49
-
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:
52
-
53
- ```markdown
54
- # F{n} — {título}
55
-
56
- {2-3 frases: o comportamento entregue, onde mora e como foi provado}
57
-
58
- **Arquivos:** `{path}`, `{path}`
59
-
60
- **Checks:** C{n} — {teste que prova, ou `arquivo:linha`}
61
-
62
- **Standards:** `{id}`, `{id}`
63
- ```
64
-
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: 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.
72
-
73
- ## 3. Dispatch — só o que muda
74
-
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:
77
-
78
- ```
79
- dispatch Agent (subagent_type: "morph-{id}") with prompt:
80
- Fatia F{n} — <título>
81
- cobre: <cada Cn com o texto literal do cenário, a `prova:` e o `risco:`>
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>
88
- ```
89
-
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-blocked` + `ask-human` | `BLOQUEADO` na 1ª linha = decisão que não é do agente; a pergunta e as opções estão no relatório. **Não re-despache.** Plano ou ADR já decide → decida e registre; senão `AskUserQuestion`. Retome o MESMO agente com a resposta |
112
- | `report-incomplete` + `complete-degraded` | complete a partir da mensagem, carimbe DEGRADADO e registre a falha no relatório |
113
- | `work-landed-report-missing` | não re-despache; grave você o relatório, DEGRADADO |
114
- | `no-work-no-report` / `report-missing-evidence-unknown` | re-despache uma vez; segunda ausência sem trabalho = escale |
115
-
116
- Árvore suja sem explicação ou `tree.markers` não vazio vão ao relatório da fatia.
117
-
118
- ## 6. Verify da feature, uma vez
119
-
120
- Sem fatia pendente nem em voo, **primeiro o contexto** — antes do verify, para que a prova e o Gate 3
121
- cubram a árvore que vai ao merge. Todo `.morph/context/*.md` que descreve um fato que esta feature
122
- mudou tem o **corpo** reescrito para o estado novo, nunca empilhado (valor que ainda vale em algum
123
- lugar diz onde); o changelog do documento guarda só data e motivo. Mudança estrutural
124
- (`package.json`, `.csproj`, `next.config.*`, `tsconfig.json`, `docker-compose.yml`) atualiza também
125
- `.morph/context/README.md` (stack, arquitetura, integrações) e `.morph/config/config.json` (stack,
126
- arquitetura, integrações, paths). **Commite** o trabalho das fatias e essa atualização de contexto e
127
- config **antes** do verify: o stamp grava o HEAD, e código ou `config.json` commitado depois dele é
128
- árvore nova — um terceiro verify.
129
-
130
- Depois `morph-spec verify {feature} --json`, **sem filtro** — nunca recorte o
131
- verify da feature. `--filter` é do loop do próprio sub-agente; o Gate 3 e o CI rodam a suíte
132
- inteira. Nó `node-test`/`evals` sem `expectedCount`, ou fatia que apagou teste de propósito (limpeza, `morph-spec tests-audit`): acrescente `--record-baseline` a ESTA rodada — ela mede e
133
- 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)
134
- e rode de novo; **3 tentativas** sem verde → `AskUserQuestion` ("Verify de {feature} vermelho após 3
135
- tentativas — aceitar com ressalva, continuar tentando, ou parar?"). Quem conta é o `feature.json`:
136
- `morph-spec next {feature}` devolve `fix` enquanto há tentativa e `escalate` na 3ª vermelha seguida.
137
-
138
- **Cenário que julga saída de LLM** (`prova: eval`): a evidência é rodar, não ler código. Com nó
139
- `runner: "evals"`: `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
140
- (sonda, não prova de gate). Grave `3-implement/evidencias/{Cn}.md`: o cenário literal, o nó, o modelo
141
- efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado pessoal, e o
142
- veredito com a razão. Não é o `reports/F{n}.md`: aquele diz o que o agente fez; este prova, rodando,
143
- que a saída atende ao cenário.
144
-
145
- ## 7. Review
146
-
147
- Verify verde: `Skill(morph-review)`. O Gate 3 é apresentado, decidido e aprovado por ela; ao retomar o
148
- controle, **não re-apresente o gate** — siga para o encerramento conforme `gateDecisions.review`.
149
-
150
- ## 8. Encerramento
151
-
152
- - **Contexto já foi no §6**, antes da prova. Depois do Gate 3 nada muda `config.json` nem código: a
153
- árvore integrada é a revisada. Commite na branch da feature o que faltar (relatórios do review) —
154
- o `finish` exige a árvore limpa.
155
- - **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo por `AskUserQuestion` (header
156
- `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
157
- `aguardando-merge` em `list`/`fleet`.
158
-
159
- ## Escalada de escopo
22
+ O plano inteiro, nesta sessão, em sequência. Sem sub-agent para implementar: o que você descobre no `C1` (um formato, uma regra, um nome) é o que o `C5` precisa.
23
+
24
+ - As regras de cada domínio (.NET, EF, MAF, Next.js, infra) chegam sozinhas: a rule do stack carrega quando você toca o arquivo. O texto inteiro de um standard: `morph-spec standards --find` → `--show <id>#<âncora>`.
25
+ - Antes de criar um tipo, confira a tabela `## Reuso` e `morph-spec graph explain <nome>` (sem grafo, `grep -rn`).
26
+ - Rode build e teste quando quiser; teste pesado fora do `verify` por `morph-spec heavy run -- <cmd>`. Exit 3 = fila cheia: uma chamada nova no máximo (`references/machine.md`).
27
+ - Ao fechar um `Cn`, atualize a linha dele no `report.md` (`feito` + a evidência: teste, `arquivo:linha`) e commite (`wip(<f>): C2 …`). Decisão ou fato novo → uma linha em `## Notas`.
28
+ - Mídia gerada por IA: `references/media.md`. Erro difícil: `references/debugging.md`.
29
+
30
+ `Cn` que depende de uma decisão que não é sua: status `bloqueado` e a pergunta em `## Notas`; o `next` devolve `decide` → `AskUserQuestion`.
160
31
 
161
32
  | Situação | Caminho |
162
33
  |---|---|
163
- | Acréscimo pequeno dentro da fatia | registre no relatório da fatia — sem gate a revogar |
164
- | **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 |
165
- | **O escopo mudou** | `morph-spec unapprove {feature} plan --reason "..."`, emende, `plan-check`, re-aprove |
34
+ | acréscimo pequeno dentro do escopo | `## Notas` do report |
35
+ | fato errado no plano, escopo igual | `## Errata` no fim do `plan.md` (append-only) |
36
+ | escopo mudou | `morph-spec unapprove {feature} plan --reason "…"`, emende, `plan-check`, gate de novo |
166
37
 
167
- Ambiguidade que o plano não cobre não é escalada: resolva pelo lado conservador, registre a decisão sob `## Errata` do `plan.md`
168
- e siga.
38
+ **Cenário `prova: eval`:** a evidência é rodar. Com nó `runner: "evals"`: `morph-spec verify {feature} --filter <nó> --skip-e2e --no-persist`; grave `3-implement/evidencias/{Cn}.md` (cenário, modelo, hash do prompt, entrada e saída sem dado pessoal, veredito). `prova: manual`: passo e resultado no mesmo lugar.
169
39
 
170
- ## Arquivo de teste
40
+ ## 3. Verify, sem filtro
171
41
 
172
- 1. **Analise primeiro** — a IMPLEMENTAÇÃO está errada ou a ESPECIFICAÇÃO do teste está?
173
- 2. **Corrija a implementação primeiro** — o teste é a especificação; confie nele por padrão.
174
- 3. **Só mude um arquivo de teste se a própria expectativa estiver errada.**
175
- 4. **Antes de mudar, explique POR QUE o teste está errado** — qual é o comportamento certo.
42
+ Todo `Cn` `feito`: `morph-spec context refresh` (regera o inventário em `.morph/context/README.md`; `design-system.md` você atualiza só se mudou token), commite tudo e rode `morph-spec verify {feature} --json` sem filtro: a suíte inteira é a prova que o Gate 3 e o CI leem; com `--filter`, o verde mede só um nó. Passou de 10 min: `run_in_background` e espere a notificação **no mesmo turno**. Nó `node-test`/`evals` sem `expectedCount`, ou teste apagado de propósito: `--record-baseline` nesta mesma rodada.
176
43
 
177
- ## Debugging
44
+ Vermelho → corrija com `verify.feedback` e rode de novo. `next` conta: `fix` enquanto há tentativa, `escalate` na 3ª vermelha seguida → `AskUserQuestion` ("Verify de {feature} vermelho após 3 tentativas — aceitar com ressalva, continuar tentando, ou parar?").
178
45
 
179
- Causa raiz antes do conserto: reproduza e leia o erro inteiro; erro conhecido de .NET/Next.js →
180
- `/morph-troubleshoot <palavras>`; **uma hipótese por vez**, cada uma testada pela menor checagem que
181
- a refutaria; depois de três consertos falhos, nunca tente um quarto sozinho — `AskUserQuestion`
182
- com a pergunta de desenho que as falhas levantam; confirme com a mesma checagem que reproduziu.
46
+ ## 4. Ramo por tipo
183
47
 
184
- ## Anti-padrões
48
+ - **chore:** Gate 3 só com o revisor (`references/review.md`).
49
+ - **hotfix:** `references/hotfix.md` do começo ao fim (diagnóstico, plano curto, `verifier.md` seu, Gate 3 sempre humano).
50
+
51
+ ## 5. Gate 3
52
+
53
+ Verify verde: siga `references/review.md` — foto `--before-eval`, verificador ∥ revisor (∥ segurança) na mesma resposta, correção dos bloqueadores, confirmação, `gate-check review`. Ao retomar com o gate já decidido, não re-apresente: siga para o §6.
54
+
55
+ ## 6. Fechar
56
+
57
+ Commite o que faltar (relatórios do review) — o `finish` exige árvore limpa. Modo por `AskUserQuestion` (header "Integração"): `morph-spec finish {feature} --pr|--merge`. `--pr` não integra: a feature fica `aguardando-merge` até o merge. O `finish` arquiva o `feature.json`, o `plan.md` e o recap; o report e a review ficam no histórico do git. Encerrado, aponte o recap ao usuário (`.morph/archive/{feature}/recap.html`, abra no navegador; `morph-spec recap {feature} --piper` narra com o Piper local).
58
+
59
+ ## Arquivo de teste
185
60
 
186
- - Mais de 4 agentes ao mesmo tempo, ou duas fatias em voo no mesmo arquivo sem worktree.
187
- - Sub-agente tocando `plan.md`, `checks.json` ou `feature.json`.
188
- - Re-despachar sobre `report-stale` ou sobre um `PARCIAL` (retome o MESMO agente).
189
- - Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
61
+ A implementação está errada ou a expectativa do teste está? Corrija a implementação primeiro — o teste é a especificação. Só mude o teste quando a expectativa estiver errada, e diga por quê nas `## Notas`.
@@ -0,0 +1,8 @@
1
+ # Debugging
2
+
3
+ Causa raiz antes do conserto.
4
+
5
+ 1. Reproduza e leia o erro inteiro. Erro conhecido de .NET/Next.js → `/morph-troubleshoot <palavras>`.
6
+ 2. **Uma hipótese por vez**, cada uma testada pela menor checagem que a refutaria.
7
+ 3. Confirme o conserto com a mesma checagem que reproduziu o erro.
8
+ 4. Três consertos falhos no mesmo problema: não tente um quarto sozinho — `AskUserQuestion` com a pergunta de desenho que as falhas levantaram.
@@ -0,0 +1,42 @@
1
+ # Hotfix
2
+
3
+ Queda ou bug crítico de produção. Prioridade é velocidade, com aprovação humana obrigatória antes do ship.
4
+
5
+ ## 1. Nascimento
6
+
7
+ `morph-spec create {feature} --type hotfix --description "<o que quebrou / sintoma>"` — nasce com o gate `plan` carimbado por política, já em `implement`. Já existe: siga.
8
+
9
+ ## 2. Diagnóstico
10
+
11
+ Você mesmo, antes de qualquer fix: o sintoma → o caminho no código (`morph-spec graph affected <símbolo> --prod --json`; sem grafo, `grep -rn`) → causa provável → blast radius (o que mais passa pelo trecho que vai mudar). Cite `arquivo:linha` só do que você abriu: sob pressão, citação inventada vira um segundo incidente.
12
+
13
+ ## 3. Plano curto (uma escrita só — o arquivo congela ao nascer)
14
+
15
+ `2-plan/plan.md`, ~20 linhas:
16
+
17
+ - `## Problema` — sintoma, causa, blast radius.
18
+ - `## Cenários`:
19
+ - **C1** — o sintoma ausente: dado o estado que quebrava, quando a ação que falhava, então o resultado certo. `prova: teste` (ou `e2e`) e `risco: regressão` — o único teste novo do hotfix.
20
+ - **C2** — o blast radius continua funcionando. `prova: leitura` (`arquivo:linha`) ou um teste existente que já o cobre.
21
+ - `## Decisões` com `### Conflitos com o acervo` (`nenhum` vale).
22
+
23
+ `morph-spec plan-check {feature}` até zero erro.
24
+
25
+ ## 4. Fix e prova
26
+
27
+ A mudança mínima que tira a falha do ar — refatoração e hardening fora do sintoma ficam para outra feature. `report.md` com C1/C2. `morph-spec verify {feature} --json` sem filtro; C1 se prova com o sintoma reproduzido antes e ausente depois — cole a saída real.
28
+
29
+ ## 5. Gate 3 — sempre humano
30
+
31
+ Escreva você `4-review/verifier.md`: `**Verdict:** SHIP|FIX`, `**Reviewed-SHA:** {git rev-parse HEAD}`, `## Checks` (`| Cn | PROVADO|NÃO PROVADO|FALHA | evidência |`, evidência = saída do verify), `## Bloqueadores` (`Nenhum.` vale). `morph-spec gate-check {feature} review` pausa sempre. `AskUserQuestion`, header "Gate 3":
32
+
33
+ ```
34
+ question: "Gate 3 — Hotfix de {feature} pronto para ship?"
35
+ options: "aprovado, ship" | "preciso ajustar" | "rollback"
36
+ ```
37
+
38
+ **Nunca** `approve {feature} review --mode auto` (o CLI recusa). Headless: `morph-spec approve {feature} review --approver "<quem aprovou>"` — só com aprovação humana real; nunca invente o nome.
39
+
40
+ ## 6. Pós-gate
41
+
42
+ Código mudou depois do verify → verify de novo. `morph-spec finish {feature} --pr|--merge`, modo escolhido pelo usuário; `--merge` integra na hora, `--pr` não — o incidente só está resolvido depois do merge.
@@ -0,0 +1,29 @@
1
+ # Máquina: RAM, fila e processos
2
+
3
+ Para manter a máquina utilizável enquanto você compila e testa. Aplique quando o sintoma aparecer; o usuário não precisa pedir.
4
+
5
+ ## Regras que não se negociam
6
+
7
+ - **Nunca** `taskkill /IM`, `pkill`, `killall` nem `Stop-Process -Name`: derrubam os MCPs de todas as sessões abertas. O único que encerra processo é `doctor --procs --prune`, e por PID.
8
+ - **Fila cheia não é erro de código.** `⏳ … não rodou`, `slots pesados ocupados` e exit 3 querem dizer que a fila já esperou o prazo dela (`heavy.waitTimeoutSec`). Não entra no loop de correção, não conta como tentativa e não é vermelho no `verify`. No máximo uma chamada nova; persistiu, siga sem aquela rodada e avise o usuário — nunca `sleep`/`until` nem retentativa agendada.
9
+ - **Nunca remova worktree** por `git worktree remove`, `rm -rf` ou `Remove-Item -Recurse`: atravessa a junction e apaga o conteúdo real da raiz. Só `finish` ou `worktree remove`.
10
+ - **Destrutivo pergunta antes.** `doctor --procs --prune`: mostre a lista e use `AskUserQuestion`.
11
+
12
+ ## Sintoma → comando
13
+
14
+ | Sintoma | Comando | Como ler e o que fazer |
15
+ |---|---|---|
16
+ | Máquina ou editor lento, pouca RAM | `morph-spec doctor --procs` (só lê) | Cada linha diz órfão ou protegido, com a razão. Sem órfão, a pressão vem de fora (vmmem do WSL, IDE): diga isso e passe a sugestão de `.wslconfig` que o relatório traz. Com órfão, mostre a lista e ofereça `--prune`. |
17
+ | Comando voltou `⏳ … não rodou` ou exit 3 | `morph-spec heavy status` | Mostra quem segura cada vaga, há quanto tempo, e a RAM livre. A vaga solta sozinha (processo morto ou timeout). Vaga presa por sessão viva: diga ao usuário quem a segura. Se a causa for RAM e nenhuma vaga estiver presa, rode `doctor --procs`. |
18
+ | Várias features abertas, uma por worktree, testando ao mesmo tempo | nada: a fila resolve | São 2 vagas por padrão; o que não couber espera. Se a espera virar recusa toda hora, `heavy.slots` sobe quando houver RAM. |
19
+ | Worktree sobrando ou fora do contêiner | `morph-spec doctor --worktrees` | Lista cada árvore com a razão; remova só por `worktree remove`. |
20
+ | A worktree precisa de arquivo fora do git (`.env`, segredos) | `.worktreeinclude` na raiz do repo | Um padrão por linha, sintaxe do gitignore. Copia só o que casa **e** é ignorado; nunca `node_modules`, build ou `.git`. O `setup` e o `provision` aplicam. |
21
+ | Editor pesado por causa das worktrees | `worktree.root` em `.morph/config/config.json` | Põe as worktrees fora da árvore aberta (caminho absoluto fora do projeto). `init` e `update` já gravam as exclusões no `.vscode/settings.json`. |
22
+
23
+ ## A fila pega o seu build e o seu teste
24
+
25
+ `heavy.gateBash` vem ligado: antes de `dotnet build|test`, `npm test`, `vitest`, `docker compose up` e afins, um hook toma uma vaga da fila e a devolve depois. Sem vaga no prazo, a chamada é recusada com a causa: rode o mesmo comando de novo uma vez, ou siga sem ele. Projeto que prefere sem a fila: `"heavy": { "gateBash": false }` em `.morph/config/config.json` (pergunte ao usuário antes).
26
+
27
+ Limites: não cobre `run_in_background`, PowerShell nem comando fora da lista; uma chamada negada por regra ou interrompida segura a vaga até o timeout dela.
28
+
29
+ Referências: `.morph/framework/CLI.md` — `### heavy`, `### doctor --procs` e `### worktree.root`; MORPH.md §2.2 (worktrees).
@@ -1,17 +1,4 @@
1
- ---
2
- name: morph-media
3
- description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear derivadas a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas. É o lado processo; o conhecimento de API, custo e conformidade vive nos standards de mídia.
4
- version: core
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
- user-invocable: true
7
- cliVersion: "9.8.0"
8
- stacks:
9
- - dotnet
10
- - nextjs
11
- ---
12
-
13
- # morph-media
14
-
1
+ # Mídia gerada por IA
15
2
  ## Objetivo
16
3
 
17
4
  Conduzir a **autoria** de mídia gerada: a sequência de decisões humanas que vai de "precisamos de
@@ -66,65 +53,17 @@ Uma pergunta decide quase tudo: **existe um produto real a preservar?**
66
53
  desligado não é preferência de estilo: é uma chamada que devolve erro depois de você ter escrito o
67
54
  código inteiro em cima dela.
68
55
 
69
- ## Passo 2 — Montar o prompt como spec versionada
70
-
71
- Prompt de produção é **template versionado**, nunca string concatenada. A ordem importa, e as duas
72
- famílias de modelo concordam nela:
73
-
74
- ```
75
- cena/fundo → sujeito → detalhes-chave → restrições
76
- ```
77
-
78
- Seis regras que mudam o resultado mais do que qualquer outra coisa:
79
-
80
- 1. **Descreva em prosa, não em lista de keywords.** "beautiful, stunning, 4k, masterpiece" adiciona
81
- ruído, não qualidade. Briefe como se briefasse um fotógrafo.
82
- 2. **Seja hiper-específico no sujeito.** "armadura de fantasia" produz genérico; "armadura élfica de
83
- placas prateadas, gravada com folhas, gola alta, ombreiras em asa de falcão" produz uma imagem.
84
- 3. **Descreva em camadas** — primeiro plano, plano médio, fundo. Descrição plana produz imagem
85
- plana; camadas produzem profundidade.
86
- 4. **Iluminação é a maior alavanca isolada de qualidade.** Sempre declare, com termos de fotografia,
87
- e prefira **múltiplas fontes** com direções e temperaturas diferentes. Luz única e frontal é o
88
- que faz uma imagem parecer amadora.
89
- 5. **Enquadre positivamente.** "rua deserta, completamente parada" funciona; "rua sem carros" não —
90
- o modelo lida mal com negação.
91
- 6. **Contexto e finalidade entram no prompt.** "logo para uma marca de skincare minimalista premium"
92
- decide melhor que "faça um logo".
56
+ ## Passos 2 a 4 — Prompt, edição e encadeamento
93
57
 
94
- **Texto na imagem:** cite literalmente entre aspas e soletre marcas. Erro de grafia é o defeito mais
95
- comum dessa categoria — **confira lendo a imagem gerada** e corrija com uma edição pontual ("corrija
96
- a grafia para 'X' exatamente; mantenha o resto"). Duas ou três iterações são normais.
58
+ O ofício mora no standard de imagem; abra só a seção do passo (`morph-spec standards --show <id>#<âncora>`):
97
59
 
98
- **Aspect ratio é decisão, não default.** Escolha pelo destino final (feed, story, banner, impressão).
99
-
100
- ## Passo 3 — Editar é o oposto de gerar
101
-
102
- | | Gerar | Editar |
103
- |---|---|---|
104
- | Estratégia | **Profundidade** — composição em camadas, texturas, luz dramática | **Contenção** — 1 a 2 frases, exatamente o que muda |
105
- | Erro típico | Prompt raso → imagem plana e genérica | Prompt longo → o modelo "re-imagina" tudo e o resultado fica artificial |
106
-
107
- Padrões de edição que funcionam:
108
-
109
- - **Acrescentar/remover:** uma frase. Não explique como integrar — o modelo faz isso bem quando você
110
- não o sufoca.
111
- - **Trocar o fundo:** diga o fundo novo e pare. Ele casa a iluminação sozinho.
112
- - **Inpaint:** nomeie o que muda e o que fica. *"Troque o sofá azul por um chesterfield de couro
113
- marrom. Mantenha o resto."*
114
- - **"Preserve list" repetida em CADA iteração.** É o que impede o drift de acumular.
115
- - **Uma mudança por vez.** Refinamentos em série, nunca em bloco.
116
- - **Ao driftar, recomece** com a descrição completa em vez de empilhar correções.
117
-
118
- ## Passo 4 — Encadear a partir de um herói aprovado
119
-
120
- A consistência não vem do prompt; vem da **referência**.
121
-
122
- 1. Gere e **aprove** o herói primeiro — a imagem que define paleta, luz e enquadramento.
123
- 2. Use o herói aprovado como **referência** das derivadas. Nunca gere as derivadas em paralelo com o
124
- herói: elas herdam o erro que ainda não foi visto.
125
- 3. Indexe cada referência no prompt ("image 1 = o sofá; image 2 = o tecido") e diga como interagem.
126
- 4. Imagens que vão virar vídeo são enquadradas **sem rosto** — rosto derruba moderação, e o contorno
127
- está em `ai-video-generation.md` §Section 3.
60
+ | Passo | Seção |
61
+ |---|---|
62
+ | Prompt como spec versionada: prosa, sujeito específico, camadas, luz, enquadrar no positivo, contexto | `frontend-design-system-ai-image-generation#narrative-style`, `#prompting-principles`, `#category-templates` |
63
+ | Texto dentro da imagem e proporção pelo destino | `#text-rendering`, `#aspect-ratio-guide` |
64
+ | Editar é o oposto de gerar (contenção, preserve list, uma mudança por vez) | `#iterative-editing-workflows` |
65
+ | Herói aprovado primeiro, derivadas por referência, várias referências | `#chain-from-an-approved-hero`, `#multi-image-composition` |
66
+ | Imagem que vira vídeo (sem rosto) | `#downstream-images-that-become-video` |
128
67
 
129
68
  **O que a IA nunca recria:** render arquitetônico do cliente e foto real de produto. Esses são
130
69
  animados ou editados a partir do arquivo real — recriá-los é inventar o que o cliente já tem.
@@ -210,6 +149,4 @@ trabalho de design". Tratar a saída como entregável vetorial é o erro clássi
210
149
 
211
150
  ## Referências
212
151
 
213
- - Os cinco standards da tabela do topo — a fonte de API, custo, prazo e conformidade.
214
- - Proveniência do conhecimento absorvido: `.morph/framework/standards/PROVENANCE.json`
215
- (`morph-image`, `cinematic-lp`, `brand-design`).
152
+ Os cinco standards da tabela do topo: a fonte de API, custo, prazo, conformidade e do ofício do prompt.