@polymorphism-tech/morph-spec 8.46.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.
Files changed (304) hide show
  1. package/CLAUDE.md +53 -44
  2. package/README.md +3 -4
  3. package/bin/morph-spec.js +38 -55
  4. package/bin/validate.js +5 -134
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -2
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +41 -101
  9. package/framework/MORPH.md +95 -252
  10. package/framework/agents.json +75 -18
  11. package/framework/commands/create-umbraco-lp.md +2 -0
  12. package/framework/commands/migrate-lp-to-umbraco.md +2 -0
  13. package/framework/commands/morph-apply.md +5 -28
  14. package/framework/commands/morph-archive.md +2 -2
  15. package/framework/commands/morph-hotfix.md +8 -8
  16. package/framework/commands/morph-infra.md +17 -203
  17. package/framework/commands/morph-media.md +3 -0
  18. package/framework/commands/morph-preflight.md +7 -31
  19. package/framework/commands/morph-proposal.md +2 -50
  20. package/framework/commands/morph-status.md +3 -3
  21. package/framework/commands/morph-troubleshoot.md +2 -14
  22. package/framework/docs/CLI.md +585 -286
  23. package/framework/evals/review-checklist.md +82 -41
  24. package/framework/hooks/README.md +10 -11
  25. package/framework/hooks/claude-code/core/comment-guard.js +1 -1
  26. package/framework/hooks/claude-code/core/denylist.json +33 -3
  27. package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
  28. package/framework/hooks/claude-code/core/gate-guard.js +2 -11
  29. package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
  30. package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
  31. package/framework/hooks/claude-code/core/state-sync.js +17 -19
  32. package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
  33. package/framework/hooks/claude-code/core/validate-completion.js +33 -97
  34. package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
  35. package/framework/hooks/claude-code/core/worktree-context.js +5 -4
  36. package/framework/hooks/claude-code/statusline.py +55 -41
  37. package/framework/hooks/package.json +3 -0
  38. package/framework/hooks/shared/activity-logger.js +1 -1
  39. package/framework/hooks/shared/build-check.js +10 -6
  40. package/framework/hooks/shared/command-tokens.js +169 -0
  41. package/framework/hooks/shared/comment-rules.js +1 -1
  42. package/framework/hooks/shared/comment-scanner.js +10 -23
  43. package/framework/hooks/shared/comment-stripper.js +1 -1
  44. package/framework/hooks/shared/e2e-check.js +67 -31
  45. package/framework/hooks/shared/errata.js +72 -0
  46. package/framework/hooks/shared/feature-locator.js +1 -1
  47. package/framework/hooks/shared/frontend-locations.js +6 -0
  48. package/framework/hooks/shared/gate-question.js +18 -0
  49. package/framework/hooks/shared/phase-utils.js +15 -32
  50. package/framework/hooks/shared/slice-progress.js +118 -0
  51. package/framework/hooks/shared/spawn-command.js +23 -0
  52. package/framework/hooks/shared/state-reader.js +61 -87
  53. package/framework/hooks/shared/state-writer.js +3 -3
  54. package/framework/mcp/registry.json +3 -4
  55. package/framework/phases.json +23 -39
  56. package/framework/rules/ai-agents-standards.md +18 -16
  57. package/framework/rules/asaas-standards.md +3 -1
  58. package/framework/rules/csharp-standards.md +10 -8
  59. package/framework/rules/data-standards.md +5 -5
  60. package/framework/rules/dotnet-templates.md +1 -1
  61. package/framework/rules/frontend-standards.md +4 -2
  62. package/framework/rules/gsap-standards.md +10 -5
  63. package/framework/rules/hangfire-standards.md +3 -1
  64. package/framework/rules/infrastructure-standards.md +4 -2
  65. package/framework/rules/neon-auth-standards.md +3 -1
  66. package/framework/rules/neon-standards.md +6 -4
  67. package/framework/rules/nextjs-standards.md +13 -11
  68. package/framework/rules/nextjs-templates.md +1 -1
  69. package/framework/rules/resend-standards.md +3 -1
  70. package/framework/schemas/config.schema.json +14 -9
  71. package/framework/schemas/feature.schema.json +15 -52
  72. package/framework/skills/README.md +4 -5
  73. package/framework/skills/core/create-umbraco-lp/SKILL.md +3 -3
  74. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +3 -3
  75. package/framework/skills/core/morph-apply/SKILL.md +150 -223
  76. package/framework/skills/core/morph-hotfix/SKILL.md +34 -43
  77. package/framework/skills/core/morph-machine/SKILL.md +4 -4
  78. package/framework/skills/core/morph-media/SKILL.md +3 -3
  79. package/framework/skills/core/morph-plan/SKILL.md +138 -300
  80. package/framework/skills/core/morph-review/SKILL.md +112 -137
  81. package/framework/skills/core/morph-standards/SKILL.md +29 -41
  82. package/framework/skills/core/morph-uiux/SKILL.md +78 -153
  83. package/framework/standards/STANDARDS.json +90 -1219
  84. package/framework/standards/STANDARDS.meta.json +1305 -0
  85. package/framework/standards/ai-agents/evals-with-cache.md +2 -3
  86. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  87. package/framework/standards/ai-agents/modalities-speech-to-text.md +36 -26
  88. package/framework/standards/ai-agents/prompt-sources.md +6 -4
  89. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  90. package/framework/standards/ai-agents/rag-custom-pgvector.md +67 -39
  91. package/framework/standards/ai-agents/setup.md +2 -2
  92. package/framework/standards/ai-agents/structured-output.md +1 -1
  93. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  94. package/framework/standards/architecture/code-comments.md +8 -8
  95. package/framework/standards/architecture/vertical-slice/vertical-slice.md +18 -9
  96. package/framework/standards/backend/api/validation.md +135 -47
  97. package/framework/standards/backend/database/postgresql/database.md +11 -7
  98. package/framework/standards/backend/database/vector-search-rag.md +207 -324
  99. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +14 -8
  100. package/framework/standards/backend/dotnet/result-pattern.md +40 -6
  101. package/framework/standards/backend/dotnet/scalar-ui.md +13 -7
  102. package/framework/standards/backend/dotnet/scrutor.md +1 -1
  103. package/framework/standards/backend/dotnet/testing.md +1 -1
  104. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +7 -7
  105. package/framework/standards/backend/integrations/asaas/asaas-api.md +309 -165
  106. package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +134 -154
  107. package/framework/standards/data/nosql/cache/redis.md +120 -44
  108. package/framework/standards/data/nosql/cosmos-db.md +114 -71
  109. package/framework/standards/frontend/design-system/animations.md +1 -1
  110. package/framework/standards/frontend/design-system/naming.md +1 -1
  111. package/framework/standards/frontend/nextjs/motion-patterns.md +45 -29
  112. package/framework/standards/frontend/nextjs/naming-conventions.md +1 -1
  113. package/framework/standards/infrastructure/docker/coolify-deploy.md +8 -6
  114. package/framework/standards/infrastructure/neon/neon-pgvector.md +120 -75
  115. package/framework/standards/infrastructure/neon/neon-setup.md +53 -31
  116. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  117. package/framework/templates/README.md +2 -3
  118. package/framework/templates/REGISTRY.json +6 -170
  119. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +2 -2
  120. package/framework/templates/code/dotnet/extensions/database-extensions.cs +1 -1
  121. package/framework/templates/code/dotnet/extensions/result-extensions.cs +27 -0
  122. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +2 -2
  123. package/framework/templates/docs/plan.md +72 -0
  124. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  125. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +1 -1
  126. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  127. package/framework/templates/infrastructure/docker/coolify.template.json +3 -3
  128. package/framework/templates/infrastructure/github/README.md +2 -1
  129. package/framework/templates/infrastructure/github/workflows/deploy-coolify.yml.hbs +2 -1
  130. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  131. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  132. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  133. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  134. package/package.json +1 -1
  135. package/src/commands/e2e/e2e.js +2 -2
  136. package/src/commands/observability/cost.js +18 -60
  137. package/src/commands/observability/telemetry.js +3 -5
  138. package/src/commands/project/doctor-procs.js +1 -1
  139. package/src/commands/project/doctor.js +9 -9
  140. package/src/commands/project/fleet.js +4 -4
  141. package/src/commands/project/heavy.js +3 -3
  142. package/src/commands/project/init.js +6 -1
  143. package/src/commands/project/setup-infra-cmd.js +2 -1
  144. package/src/commands/project/stack-scan.js +58 -0
  145. package/src/commands/project/standards.js +79 -25
  146. package/src/commands/project/status.js +29 -69
  147. package/src/commands/project/update.js +33 -19
  148. package/src/commands/project/worktree.js +1 -1
  149. package/src/commands/state/advance.js +62 -46
  150. package/src/commands/state/approve.js +95 -138
  151. package/src/commands/state/archive.js +20 -84
  152. package/src/commands/state/auto-approval.js +68 -0
  153. package/src/commands/state/create.js +28 -1
  154. package/src/commands/state/delete.js +1 -1
  155. package/src/commands/state/finish.js +11 -23
  156. package/src/commands/state/gate-check.js +86 -95
  157. package/src/commands/state/gate-decision.js +6 -4
  158. package/src/commands/state/handoff.js +1 -1
  159. package/src/commands/state/list.js +9 -9
  160. package/src/commands/state/report-check.js +157 -311
  161. package/src/commands/state/retype.js +9 -3
  162. package/src/commands/validation/mutate.js +77 -14
  163. package/src/commands/validation/plan-check.js +81 -0
  164. package/src/commands/validation/validate-feature.js +60 -135
  165. package/src/commands/validation/verify.js +41 -82
  166. package/src/core/paths/output-schema.js +20 -67
  167. package/src/core/state/gate-order.js +5 -6
  168. package/src/core/state/lifecycle-audit.js +2 -2
  169. package/src/core/state/state-manager.js +17 -98
  170. package/src/core/templates/template-registry.js +2 -2
  171. package/src/core/templates/template-seed.js +22 -0
  172. package/src/core/work-types.js +10 -10
  173. package/src/dashboard/app/App.jsx +0 -2
  174. package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
  175. package/src/dashboard/app/components/CommandPalette.jsx +7 -8
  176. package/src/dashboard/app/components/EntityLink.jsx +1 -2
  177. package/src/dashboard/app/components/Markdown.jsx +1 -1
  178. package/src/dashboard/app/components/Sidebar.jsx +1 -2
  179. package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
  180. package/src/dashboard/app/lib/phases.js +2 -4
  181. package/src/dashboard/app/pages/Activity.jsx +1 -1
  182. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
  183. package/src/dashboard/app/pages/Features.jsx +9 -9
  184. package/src/dashboard/app/pages/Guide.jsx +2 -2
  185. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
  186. package/src/dashboard/app/pages/RulesMap.jsx +3 -3
  187. package/src/dashboard/app/pages/SkillsLibrary.jsx +3 -3
  188. package/src/dashboard/app/pages/Standards.jsx +1 -1
  189. package/src/dashboard/scanner/activity-scanner.js +6 -16
  190. package/src/dashboard/scanner/agents-scanner.js +1 -1
  191. package/src/dashboard/scanner/docs-scanner.js +5 -23
  192. package/src/dashboard/scanner/features-scanner.js +95 -60
  193. package/src/dashboard/scanner/index.js +0 -2
  194. package/src/dashboard/scanner/project-api.js +1 -1
  195. package/src/dashboard/scanner/rules-scanner.js +15 -10
  196. package/src/dashboard/scanner/skills-scanner.js +2 -3
  197. package/src/dashboard/scanner/standards-scanner.js +2 -1
  198. package/src/lib/ci/ci-verify.js +17 -1
  199. package/src/lib/ci/github-ci.js +1 -1
  200. package/src/lib/detectors/index.js +3 -8
  201. package/src/lib/generators/handoff-generator.js +34 -65
  202. package/src/lib/generators/settings-generator.js +11 -89
  203. package/src/lib/git/evidence-staleness.js +1 -1
  204. package/src/lib/git/tree-fingerprint.js +19 -7
  205. package/src/lib/git/tree-state.js +2 -2
  206. package/src/lib/heavy/cleanup.js +1 -5
  207. package/src/lib/installers/memory-installer.js +6 -8
  208. package/src/lib/mutation/commands.js +3 -2
  209. package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
  210. package/src/lib/mutation/plan.js +14 -6
  211. package/src/lib/mutation/runner.js +1 -1
  212. package/src/lib/mutation/subset.js +46 -9
  213. package/src/lib/plan/artifact-vocabulary.js +60 -0
  214. package/src/lib/plan/checks.js +234 -0
  215. package/src/lib/plan/plan-parser.js +209 -0
  216. package/src/lib/plan/plan-template.js +18 -0
  217. package/src/lib/review-reports.js +222 -0
  218. package/src/lib/risk-detector.js +134 -135
  219. package/src/lib/specs/adr-index.js +50 -69
  220. package/src/lib/specs/design-seed.js +18 -0
  221. package/src/lib/specs/frontmatter.js +44 -0
  222. package/src/lib/specs/gfm-table.js +17 -0
  223. package/src/lib/specs/old-format.js +68 -0
  224. package/src/lib/specs/revocations.js +37 -95
  225. package/src/lib/specs/screen-checklist.js +18 -17
  226. package/src/lib/stack/dotnet-build-ignores.js +47 -0
  227. package/src/lib/stack/stack-profile.js +1 -1
  228. package/src/lib/stack/stack-scan.js +267 -0
  229. package/src/lib/standards/registry.js +43 -0
  230. package/src/lib/standards/sections.js +58 -0
  231. package/src/lib/tasks/eval-node.js +4 -12
  232. package/src/lib/tasks/test-nodes.js +1 -74
  233. package/src/lib/tasks/test-runner.js +75 -117
  234. package/src/lib/telemetry/metrics.js +8 -69
  235. package/src/lib/telemetry/telemetry-reader.js +5 -118
  236. package/src/lib/telemetry/verify-event.js +5 -7
  237. package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
  238. package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
  239. package/src/lib/validators/reuse/reuse-validator.js +24 -48
  240. package/src/lib/validators/reuse/symbol-scanner.js +2 -4
  241. package/src/lib/validators/traceability-check.js +85 -129
  242. package/src/lib/validators/validation-runner.js +8 -88
  243. package/src/lib/validators/verify-runner.js +134 -301
  244. package/src/lib/worktree/docker-audit.js +1 -2
  245. package/src/lib/worktree/fleet-scanner.js +25 -38
  246. package/src/scripts/setup-infra.js +42 -22
  247. package/src/utils/agents-installer.js +92 -13
  248. package/src/utils/claude-settings-manager.js +0 -35
  249. package/src/utils/file-copier.js +34 -6
  250. package/src/utils/hooks-installer.js +16 -9
  251. package/src/utils/skills-installer.js +1 -2
  252. package/framework/commands/commit.md +0 -166
  253. package/framework/evals/trace-schema.md +0 -67
  254. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  255. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  256. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  257. package/framework/hooks/shared/tasks-validator.js +0 -111
  258. package/framework/rubrics/backend.json +0 -41
  259. package/framework/rubrics/default.json +0 -36
  260. package/framework/rubrics/frontend.json +0 -36
  261. package/framework/rules/morph-task-tracking.md +0 -54
  262. package/framework/rules/morph-workflow.md +0 -244
  263. package/framework/schemas/tasks.schema.json +0 -79
  264. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  265. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  266. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  267. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  268. package/framework/templates/docs/proposal.md +0 -192
  269. package/framework/templates/docs/spec.md +0 -57
  270. package/framework/templates/docs/ui-components.md +0 -52
  271. package/framework/templates/docs/ui-design-system.md +0 -76
  272. package/framework/templates/docs/ui-flows.md +0 -167
  273. package/framework/templates/examples/spec-examples.md +0 -91
  274. package/framework/templates/feature/decisions.md +0 -124
  275. package/framework/templates/feature/recap.md +0 -145
  276. package/framework/templates/project/validate.js +0 -97
  277. package/framework/templates/tasks.template.json +0 -17
  278. package/src/commands/state/usecase.js +0 -143
  279. package/src/commands/tasks/dag.js +0 -181
  280. package/src/dashboard/app/pages/Rubrics.jsx +0 -97
  281. package/src/dashboard/scanner/rubrics-scanner.js +0 -12
  282. package/src/lib/agents/output-collector.js +0 -76
  283. package/src/lib/evaluator-report.js +0 -91
  284. package/src/lib/specs/acervo-format.js +0 -70
  285. package/src/lib/specs/acervo-lifecycle.js +0 -264
  286. package/src/lib/specs/done-criteria-check.js +0 -200
  287. package/src/lib/specs/usecase-check.js +0 -301
  288. package/src/lib/specs/usecase-promoter.js +0 -301
  289. package/src/lib/specs/usecase-registry.js +0 -237
  290. package/src/lib/tasks/dispatch-planner.js +0 -319
  291. package/src/lib/tasks/mermaid-renderer.js +0 -132
  292. package/src/lib/tasks/task-classifier.js +0 -30
  293. package/src/lib/tasks/task-parser.js +0 -209
  294. package/src/lib/tasks/tasks-json-parser.js +0 -296
  295. package/src/lib/tasks/test-scope.js +0 -597
  296. package/src/lib/validators/architecture/architecture-validator.js +0 -270
  297. package/src/lib/validators/architecture/index.js +0 -7
  298. package/src/lib/validators/css/css-validator.js +0 -340
  299. package/src/lib/validators/css/index.js +0 -7
  300. package/src/lib/validators/design-system/design-system-validator.js +0 -237
  301. package/src/lib/validators/design-system/index.js +0 -7
  302. package/src/lib/validators/score-aggregator.js +0 -244
  303. package/src/lib/validators/ui/index.js +0 -7
  304. package/src/lib/validators/ui/ui-contrast-validator.js +0 -422
@@ -1,8 +1,8 @@
1
1
  {
2
- "version": "5.4.0",
2
+ "version": "5.5.0",
3
3
  "schema": "domain-personas",
4
- "total_agents": 8,
5
- "description": "Domain personas dispatched per task via subagent_type morph-{id} (.claude/agents/ generated from this file — single source of truth, ADR-001). Two independent axes: domain (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, evaluator) and stage (scout — read-only diagnosis before implementation). Optional per-agent fields: `tools` (comma-separated tool scope; default Read, Write, Edit, Bash, Glob, Grep; the installer always appends Skill and ToolSearch — a `tools:` line is a strict allowlist), `model` (dimensioned per stage — evaluator: sonnet, routed to opus at dispatch when the risk-detector flags the diff; domain implementers: sonnet; scout: sonnet), `mcp` (registry ids from framework/mcp/registry.json, granted as one mcp__{name} per registry `serverNames` spelling — `.mcp.json` and plugin names differ), `maxTurns` (turn ceiling of the generated subagent, integer >= 1; default 20 when absent — ADR-004: implementers 120, evaluator 90, scout 60; the generated body announces it to the sub-agent with the ~70% checkpoint turn), `surfaces` (standards split by kind of screen — `{ \"<surface>\": { when, standards: [ids] } }`; the persona reads `standards` on every surface plus only the list of the screen's surface, which the mockup checklist names; a standard is universal OR of a surface, never both). The 3 roles (Orchestrator/Specialist/Evaluator) are assumed by Claude itself per MORPH.md.",
4
+ "total_agents": 10,
5
+ "description": "Domain personas dispatched per plan slice via subagent_type morph-{id} (.claude/agents/ generated from this file — single source of truth, ADR-001). Two independent axes: domain (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, verifier, reviewer, security) and stage (scout — read-only diagnosis before implementation). Optional per-agent fields: `tools` (comma-separated tool scope; default Read, Write, Edit, Bash, Glob, Grep; the installer always appends Skill and ToolSearch — a `tools:` line is a strict allowlist), `model` (dimensioned per stage — verifier: sonnet, routed to opus at dispatch on prompt/model or media; reviewer: sonnet; security: opus; domain implementers: sonnet; scout: sonnet), `mcp` (registry ids from framework/mcp/registry.json, granted as one mcp__{name} per registry `serverNames` spelling — `.mcp.json` and plugin names differ), `maxTurns` (turn ceiling of the generated subagent, integer >= 1; default 20 when absent — ADR-004: implementers 120, verifier 90, reviewer 60, security 60, scout 60; the generated body announces it to the sub-agent with the ~70% checkpoint turn), `surfaces` (standards split by kind of screen — `{ \"<surface>\": { when, standards: [ids] } }`; the persona reads `standards` on every surface plus only the list of the screen's surface, which the mockup checklist names; a standard is universal OR of a surface, never both). The 3 roles (Orchestrator/Specialist/Evaluator) are assumed by Claude itself per MORPH.md.",
6
6
  "agents": {
7
7
  "dotnet-senior": {
8
8
  "title": ".NET Senior Engineer",
@@ -48,7 +48,7 @@
48
48
  "model": "sonnet",
49
49
  "maxTurns": 120,
50
50
  "effort": "medium",
51
- "persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> já é repository, DbContext já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em decisions.md; nunca uma camada de Service/Manager; nunca repository genérico (IRepository<T>/IUnitOfWork). Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros. REUSO ANTES DE CRIAR: antes de declarar record/class/interface novo, rode `morph-spec graph explain <Nome>` e `graph affected <Conceito> --uses-only` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim diga por que em uma linha no relatório da task. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
51
+ "persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> já é repository, DbContext já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em ADR no plan.md; nunca uma camada de Service/Manager; nunca repository genérico (IRepository<T>/IUnitOfWork). Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros. REUSO ANTES DE CRIAR: antes de declarar record/class/interface novo, rode `morph-spec graph explain <Nome>` e `graph affected <Conceito> --uses-only` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim diga por que em uma linha no relatório da fatia. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
52
52
  },
53
53
  "ef-modeler": {
54
54
  "title": "EF Core / Database Modeler",
@@ -88,7 +88,7 @@
88
88
  "model": "sonnet",
89
89
  "maxTurns": 120,
90
90
  "effort": "medium",
91
- "persona": "Você é um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explícitas, configurações fluentes, navigation properties bem nomeadas, índices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler. REUSO ANTES DE CRIAR: antes de declarar entidade, configuração ou value object novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — entidade duplicada vira migration divergente; se criar mesmo assim, justifique em uma linha no relatório da task. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto. NEON: o MCP `neon` inspeciona schema e ensaia migração numa branch descartável (prepare_database_migration → complete_database_migration); ele também APAGA branch e projeto — nunca chame tool destrutiva sem confirmação humana explícita."
91
+ "persona": "Você é um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explícitas, configurações fluentes, navigation properties bem nomeadas, índices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler. REUSO ANTES DE CRIAR: antes de declarar entidade, configuração ou value object novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — entidade duplicada vira migration divergente; se criar mesmo assim, justifique em uma linha no relatório da fatia. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
92
92
  },
93
93
  "maf-expert": {
94
94
  "title": "Microsoft Agent Framework Expert",
@@ -149,7 +149,7 @@
149
149
  "model": "sonnet",
150
150
  "maxTurns": 120,
151
151
  "effort": "medium",
152
- "persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via UseOpenTelemetry(sourceName, configure) no builder, nos DOIS níveis (agente e chat client), com EnableSensitiveData desligado fora de dev — AgentOpenTelemetryConsts e agent.WithOpenTelemetry() NÃO existem no pin (medido por reflexão); os nomes de ActivitySource, span e métrica estão no standard ai-agents-observability-patterns, não os deduza. Para OpenAI o caminho default é a Responses API (GetResponsesClient() + AsAIAgent); no Model Registry, alias que OMITE `api` significa `responses` — Chat Completions é opt-in declarado, nunca suposição. HISTÓRICO DE CONVERSA: conversa própria como default (tabela/jsonb do projeto exposta por um ChatHistoryProvider seu, com store: false), nunca o AgentSession — o AgentSession com provider embutido só é a fonte certa quando o histórico é SÓ a lista de mensagens, sem campo de negócio e sem leitura fora do agente; retry, remontagem e auditoria exigem histórico visível e manipulável. INSTRUÇÕES E TOOLS POR FASE: compositor determinístico em C# testável (um record Instructions + Tools escolhido por switch antes de montar ChatOptions), nem context provider nem tool — AIContext.Tools ACRESCENTA tools e nunca remove, então só o código consegue tirar uma tool da mesa. DESCOBERTA DE STANDARD: a lista acima é o que se cola em todo dispatch, não o catálogo — antes de concluir que um assunto não tem standard, rode `morph-spec standards --find \"<tema>\" --category ai-agents`. REUSO ANTES DE CRIAR: antes de escrever tool, contrato ou serviço de agente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim justifique em uma linha no relatório da task. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
152
+ "persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via UseOpenTelemetry(sourceName, configure) no builder, nos DOIS níveis (agente e chat client), com EnableSensitiveData desligado fora de dev — AgentOpenTelemetryConsts e agent.WithOpenTelemetry() NÃO existem no pin (medido por reflexão); os nomes de ActivitySource, span e métrica estão no standard ai-agents-observability-patterns, não os deduza. Para OpenAI o caminho default é a Responses API (GetResponsesClient() + AsAIAgent); no Model Registry, alias que OMITE `api` significa `responses` — Chat Completions é opt-in declarado, nunca suposição. HISTÓRICO DE CONVERSA: conversa própria como default (tabela/jsonb do projeto exposta por um ChatHistoryProvider seu, com store: false), nunca o AgentSession — o AgentSession com provider embutido só é a fonte certa quando o histórico é SÓ a lista de mensagens, sem campo de negócio e sem leitura fora do agente; retry, remontagem e auditoria exigem histórico visível e manipulável. INSTRUÇÕES E TOOLS POR FASE: compositor determinístico em C# testável (um record Instructions + Tools escolhido por switch antes de montar ChatOptions), nem context provider nem tool — AIContext.Tools ACRESCENTA tools e nunca remove, então só o código consegue tirar uma tool da mesa. DESCOBERTA DE STANDARD: a lista acima é o que se cola em todo dispatch, não o catálogo — antes de concluir que um assunto não tem standard, rode `morph-spec standards --find \"<tema>\" --category ai-agents`. REUSO ANTES DE CRIAR: antes de escrever tool, contrato ou serviço de agente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`); se já existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim justifique em uma linha no relatório da fatia. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
153
153
  },
154
154
  "nextjs-expert": {
155
155
  "title": "Next.js / React Expert",
@@ -201,7 +201,7 @@
201
201
  "model": "sonnet",
202
202
  "maxTurns": 120,
203
203
  "effort": "medium",
204
- "persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido. REUSO ANTES DE CRIAR: antes de declarar tipo, hook ou componente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — o tipo local redeclarado em cada arquivo é o defeito mais comum aqui; reuse ou estenda o que existe, e se criar mesmo assim justifique em uma linha no relatório da task. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
204
+ "persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido. REUSO ANTES DE CRIAR: antes de declarar tipo, hook ou componente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) — o tipo local redeclarado em cada arquivo é o defeito mais comum aqui; reuse ou estenda o que existe, e se criar mesmo assim justifique em uma linha no relatório da fatia. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
205
205
  },
206
206
  "ui-designer": {
207
207
  "title": "UI/UX Designer",
@@ -283,7 +283,7 @@
283
283
  "model": "sonnet",
284
284
  "maxTurns": 120,
285
285
  "effort": "medium",
286
- "persona": "Você desenha sistemas, não telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizáveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediário. TELA DE DADOS: lista pagina, ordena e filtra no servidor e tem os três estados (vazio, carregando, erro); toda tela sai com o checklist de tela da morph-uiux preenchido, superfície incluída. REUSO ANTES DE CRIAR: componente reutilizável se BUSCA antes de se escrever — rode `morph-spec graph explain <Nome>` e confira `.morph/context/design-system.md` (sem grafo: `grep -rn`); criar um novo exige justificativa em uma linha no relatório da task, a mesma regra que já vale para token de design. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
286
+ "persona": "Você desenha sistemas, não telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizáveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediário. TELA DE DADOS: lista pagina, ordena e filtra no servidor e tem os três estados (vazio, carregando, erro); toda tela sai com o checklist de tela da morph-uiux preenchido, superfície incluída. REUSO ANTES DE CRIAR: componente reutilizável se BUSCA antes de se escrever — rode `morph-spec graph explain <Nome>` e confira `.morph/context/design-system.md` (sem grafo: `grep -rn`); criar um novo exige justificativa em uma linha no relatório da fatia, a mesma regra que já vale para token de design. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
287
287
  },
288
288
  "infra-engineer": {
289
289
  "title": "Infrastructure / Jobs Engineer",
@@ -327,23 +327,24 @@
327
327
  "model": "sonnet",
328
328
  "maxTurns": 120,
329
329
  "effort": "medium",
330
- "persona": "Você cuida de infra: jobs assíncronos com Hangfire (apenas quando há razão real), deployment, observabilidade. Pensa em retry, idempotência, dead-letter, métricas. Não inventa infra — usa o que o stack já oferece. Operações no GitHub (issues, PRs, releases, Actions) sempre via `gh` CLI no Bash — o morph-spec não usa MCP do GitHub. Coolify sempre via SSH + curl na API local — não há MCP nem CLI. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, UC/task ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto. NEON: o MCP `neon` inspeciona schema e ensaia migração numa branch descartável (prepare_database_migration → complete_database_migration); ele também APAGA branch e projeto — nunca chame tool destrutiva sem confirmação humana explícita."
330
+ "persona": "Você cuida de infra: jobs assíncronos com Hangfire (apenas quando há razão real), deployment, observabilidade. Pensa em retry, idempotência, dead-letter, métricas. Não inventa infra — usa o que o stack já oferece. Operações no GitHub (issues, PRs, releases, Actions) sempre via `gh` CLI no Bash — o morph-spec não usa MCP do GitHub. Coolify sempre via SSH + curl na API local — não há MCP nem CLI. COMENTÁRIO E TESTE: nenhum comentário, mesmo com vizinho comentado: nome, tipo e teste explicam (pós-condição no nome do teste); só o porquê invisível, sem `///`/JSDoc, id de cenário/fatia ou banner; um teste por pós-condição, cenários do mesmo comportamento em tabela, nenhum teste que só fixa texto."
331
331
  },
332
- "evaluator": {
333
- "title": "Code & Architecture Evaluator",
332
+ "verifier": {
333
+ "title": "Gate 3 Verifier",
334
334
  "icon": "🔍",
335
335
  "color": "red",
336
336
  "domains": [
337
- "evaluation",
337
+ "verification",
338
338
  "review",
339
339
  "quality"
340
340
  ],
341
341
  "keywords": [
342
- "review",
343
- "verdict",
344
- "blocker",
345
- "audit",
346
- "quality"
342
+ "verify",
343
+ "prove",
344
+ "scenario",
345
+ "check",
346
+ "mutation",
347
+ "verdict"
347
348
  ],
348
349
  "stack": [
349
350
  "*"
@@ -356,7 +357,63 @@
356
357
  ],
357
358
  "model": "sonnet",
358
359
  "maxTurns": 90,
359
- "persona": "Você é o avaliador independente do Gate 3. Não participou da implementação. Responde uma pergunta: esta entrega faz o que os use cases dizem, sem quebrar o que já funcionava? Siga `.morph/framework/evals/review-checklist.md`: veredito `**Verdict:** SHIP|FIX`, bloqueadores só com evidência tipada (uc | teste | regressao | seguranca), o resto é nota. Você não dá nota numérica. Você NÃO roda teste nem build: nada de `morph-spec verify`, `dotnet test`, `vitest`, `npm test`. A saída do verify vem no prompt e é a prova de que a suíte passou; rodar de novo só gasta a máquina. Bash serve para ler: `git diff/log/show`, `grep`, `morph-spec graph`, e no máximo UMA rodada de `morph-spec mutate` (até 3 mutantes, cada um com `expect`), só quando o checklist pede. Nunca rode comando em segundo plano nem espere em laço (`sleep`, `until`): o que não terminar no tempo da chamada vira nota com o motivo. NUNCA modifique código, tasks.json, feature.json ou o board de sessão, e nunca reverta por `git checkout --`. Com o stack no ar (URL no prompt), navegue os fluxos da feature com Playwright e confira console e network. Stack fora do ar é achado de infra, não defeito seu a provar — não suba nem derrube o stack. Avaliando uma CORREÇÃO, pergunte o que ela abriu. O MCP `graphify` dá o grafo cru; a conclusão sai do `morph-spec graph`."
360
+ "persona": "Você é o verificador independente do Gate 3. Não participou da implementação. Sua missão é PROVAR cada cenário `C{n}` do `2-plan/checks.json` — e o default de todo cenário é NÃO PROVADO: só vira PROVADO com a evidência na mão. Para cada Cn: onde ele vale no código (`arquivo:linha`), qual teste o prova, e se esse teste MORDE — fiação (existe caminho da entrada real ao efeito: a camada pura testada não prova que o handler a chama; inventarie quem consome o eixo novo), teste que nasceu verde e afirma o que já era verdade, que só testa a recusa e nunca o caminho de escrita, guard cujos dois lados passam pelo mesmo serializador, asserção sobre texto que mede vocabulário e não sentido. Verificações mecânicas (.NET minimal API / Next): todo serviço injetado numa lambda de endpoint tem registro em `Program.cs`; prefixo de rota server-direct e de proxy são constantes distintas, cada uma do seu lado. Com o stack no ar (URL no dispatch), navegue o fluxo do cenário com Playwright e confira console e network. Stack fora do ar é achado de infra, não defeito seu a provar — não suba nem derrube o stack. Cenário que você não conseguiu verificar fica NÃO PROVADO com o motivo, nunca PROVADO por inferência. Siga a seção \"Verificador\" de `.morph/framework/evals/review-checklist.md` e grave `4-review/verifier.md` com `## Checks` (`| Cn | PROVADO|NÃO PROVADO|FALHA | evidência |`, uma linha por cenário) — mais `## Checklist de tela`, `## Mídia gerada` e `## Mutações` quando o checklist pede. Cenário NÃO PROVADO ou FALHA vira bloqueador `check` (ou `teste`). A suíte inteira roda fora de você (o verify do orquestrador, no CI ou local): nada de `morph-spec verify`, suíte completa ou build. Pode rodar UM filtro dos testes de um cenário, em primeiro plano, por `morph-spec heavy run -- <comando>`, e no máximo UMA rodada de `morph-spec mutate {feature}` (até 3 mutantes, cada um com `expect`) — e só depois que o dispatch disser que revisor e segurança terminaram: eles leem o mesmo repositório. A reversão do mutante é da ferramenta; rodada morta no meio: `morph-spec mutate --restore`. Grave o relatório que o dispatch nomeia ANTES de encerrar — o arquivo é o retorno, não a mensagem final. Se ele já existir quando você começar, é resíduo de outra rodada: não o leia antes de escrever o seu (ancoragem no veredito alheio), e não leia os relatórios dos outros papéis. Primeira linha `**Verdict:** SHIP|FIX`, depois `**Reviewed-SHA:** {sha}`, tabela `## Bloqueadores` (`| id | tipo | onde | evidência |`; vazia = `Nenhum.`) e `## Notas`. Bloqueador só com evidência e tipo; o resto é nota, e nota nunca pede rodada nova. Numa confirmação (o orquestrador te retoma depois da correção, com o `sha` novo) acrescente ao fim uma seção nova com `**Verdict:**` e `**Reviewed-SHA:** {sha novo}`: se você abriu bloqueadores, julgue só eles; se não abriu, julgue só o delta `{sha anterior}..{sha novo}` — o que a correção abriu. O relatório é append-only: vale o último veredito e, na `## Checks`, a última linha de cada Cn. Um comando por chamada de Bash, sem encadear (`;`, `&&`, pipe): o composto é negado e custa a rodada. Arquivo você lê com Read, nunca `sed`/`cat`/`head`. NUNCA modifique código, plan.md, checks.json ou feature.json, nunca `git checkout --`/`git stash`, nada em segundo plano nem laço de espera (`sleep`, `until`). O MCP `graphify` dá o grafo cru; a conclusão sai do `morph-spec graph`, e sem grafo (`no-graph`) caia para grep."
361
+ },
362
+ "reviewer": {
363
+ "title": "Gate 3 Reviewer",
364
+ "icon": "🧭",
365
+ "color": "orange",
366
+ "domains": [
367
+ "code-review",
368
+ "architecture",
369
+ "regression"
370
+ ],
371
+ "keywords": [
372
+ "review",
373
+ "scope",
374
+ "architecture",
375
+ "regression",
376
+ "performance",
377
+ "diff"
378
+ ],
379
+ "stack": [
380
+ "*"
381
+ ],
382
+ "standards": [],
383
+ "tools": "Read, Glob, Grep, Bash",
384
+ "mcp": [
385
+ "graphify"
386
+ ],
387
+ "model": "sonnet",
388
+ "maxTurns": 60,
389
+ "persona": "Você é o revisor independente do Gate 3, read-only. Não participou da implementação e não prova cenários (é o verificador). Você lê SÓ o commit revisado: `git diff {base}..{sha}`, `git show {sha}:<caminho>`, `git log {base}..{sha}` — nunca a árvore de trabalho (Read/Glob/Grep sobre `src/` leem o disco, onde o verificador pode estar com um mutante aplicado). `base` e `sha` vêm no dispatch. Julga o diff em cinco dimensões, na seção \"Revisor\" de `.morph/framework/evals/review-checklist.md`: ESCOPO (o diff contra as fatias e o `## Contrato de implementação` do plano — arquivo fora de toda fatia, comportamento que nenhum cenário pediu); ARQUITETURA (padrão ou abstração nova contra o stack do projeto e os standards — camada que o projeto não usa, repositório sobre o DbContext, dependência nova sem decisão no plano); REGRESSÃO (para cada símbolo público alterado, `morph-spec graph affected <símbolo> --prod --json`; sem grafo — `no-graph`, `not-found`, `ambiguous` — caia para `git grep -n <símbolo> {sha}` e siga, a ausência de grafo nunca bloqueia; ausência de consumidor nunca sai do grafo); O QUE A CORREÇÃO ABRIU (revisando uma correção de rodada anterior, releia o comportamento vizinho); PERFORMANCE só com evidência (lista sem paginação no servidor sobre volume real, consulta N+1 visível no diff) e RASTREABILIDADE de chamada a LLM (dá para reconstruir o que foi ao provedor e o que voltou?). Tipos de bloqueador: `escopo`, `arquitetura`, `regressao`, `performance`. Seu default é SHIP: dúvida vira nota. Grave o relatório que o dispatch nomeia ANTES de encerrar — o arquivo é o retorno, não a mensagem final. Se ele já existir quando você começar, é resíduo de outra rodada: não o leia antes de escrever o seu (ancoragem no veredito alheio), e não leia os relatórios dos outros papéis. Primeira linha `**Verdict:** SHIP|FIX`, depois `**Reviewed-SHA:** {sha}`, tabela `## Bloqueadores` (`| id | tipo | onde | evidência |`; vazia = `Nenhum.`) e `## Notas`. Bloqueador só com evidência e tipo; o resto é nota, e nota nunca pede rodada nova. Numa confirmação (o orquestrador te retoma depois da correção, com o `sha` novo) acrescente ao fim uma seção nova com `**Verdict:**` e `**Reviewed-SHA:** {sha novo}`: se você abriu bloqueadores, julgue só eles; se não abriu, julgue só o delta `{sha anterior}..{sha novo}` — o que a correção abriu. O relatório é append-only: vale o último veredito e, na `## Checks`, a última linha de cada Cn. Um comando por chamada de Bash, sem encadear (`;`, `&&`, pipe): o composto é negado e custa a rodada. Arquivo do framework ou da feature (o checklist, o plan.md) você lê com Read, nunca `sed`/`cat`/`head`; código do commit, com `git show {sha}:<caminho>`. NUNCA modifique código, plan.md, checks.json ou feature.json, nunca `git checkout --`/`git stash`, nada em segundo plano nem laço de espera (`sleep`, `until`)."
390
+ },
391
+ "security": {
392
+ "title": "Gate 3 Security Reviewer",
393
+ "icon": "🛡️",
394
+ "color": "pink",
395
+ "domains": [
396
+ "security",
397
+ "privacy",
398
+ "cost"
399
+ ],
400
+ "keywords": [
401
+ "security",
402
+ "authz",
403
+ "secret",
404
+ "injection",
405
+ "pii",
406
+ "migration"
407
+ ],
408
+ "stack": [
409
+ "*"
410
+ ],
411
+ "standards": [],
412
+ "tools": "Read, Glob, Grep, Bash",
413
+ "mcp": [],
414
+ "model": "opus",
415
+ "maxTurns": 60,
416
+ "persona": "Você é a revisão de segurança do Gate 3, read-only, despachada só quando o diff toca auth, segredo, permissão, dado pessoal, pagamento ou migration. Você lê SÓ o commit revisado: `git diff {base}..{sha}`, `git show {sha}:<caminho>`, `git log {base}..{sha}` — nunca a árvore de trabalho (Read/Glob/Grep sobre `src/` leem o disco, onde o verificador pode estar com um mutante aplicado). `base` e `sha` vêm no dispatch. Procure, na seção \"Segurança\" de `.morph/framework/evals/review-checklist.md`: authz faltando ou checada do lado errado, segredo no código, no log ou no cliente, injeção (SQL, comando, prompt), dado pessoal vazando para log, resposta ou provedor, custo sem teto (chamada paga em laço, sem limite por usuário), mídia gerada publicada sem revisão humana, migration destrutiva (DROP/rename de coluna com dado, branch Neon de produção). Bloqueador é tipo `seguranca` e exige o CAMINHO DE EXPLORAÇÃO: quem, por qual entrada, chega a quê. Sem caminho, é nota. Grave o relatório que o dispatch nomeia ANTES de encerrar — o arquivo é o retorno, não a mensagem final. Se ele já existir quando você começar, é resíduo de outra rodada: não o leia antes de escrever o seu (ancoragem no veredito alheio), e não leia os relatórios dos outros papéis. Primeira linha `**Verdict:** SHIP|FIX`, depois `**Reviewed-SHA:** {sha}`, tabela `## Bloqueadores` (`| id | tipo | onde | evidência |`; vazia = `Nenhum.`) e `## Notas`. Bloqueador só com evidência e tipo; o resto é nota, e nota nunca pede rodada nova. Numa confirmação (o orquestrador te retoma depois da correção, com o `sha` novo) acrescente ao fim uma seção nova com `**Verdict:**` e `**Reviewed-SHA:** {sha novo}`: se você abriu bloqueadores, julgue só eles; se não abriu, julgue só o delta `{sha anterior}..{sha novo}` — o que a correção abriu. O relatório é append-only: vale o último veredito e, na `## Checks`, a última linha de cada Cn. Um comando por chamada de Bash, sem encadear (`;`, `&&`, pipe): o composto é negado e custa a rodada. Arquivo do framework ou da feature (o checklist, o plan.md) você lê com Read, nunca `sed`/`cat`/`head`; código do commit, com `git show {sha}:<caminho>`. NUNCA modifique código, plan.md, checks.json ou feature.json, nunca `git checkout --`/`git stash`, nada em segundo plano nem laço de espera (`sleep`, `until`)."
360
417
  },
361
418
  "scout": {
362
419
  "title": "Codebase Scout",
@@ -2,6 +2,8 @@
2
2
  description: Cria uma nova landing page ponta-a-ponta a partir do template MORPH Umbraco genérico: coleta decisões, scaffolda com new-lp, sobe e valida, customiza branding e módulos.
3
3
  argument-hint: [nome-do-projeto]
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
5
+ stacks:
6
+ - umbraco
5
7
  ---
6
8
 
7
9
  # /create-umbraco-lp — Nova LP Umbraco
@@ -2,6 +2,8 @@
2
2
  description: Migra uma LP existente (React/Vite, Next.js estático ou HTML) para o template Umbraco-headless MORPH entregando a LP EXATAMENTE igual à origem (mesmo CSS, imagens, fontes e comportamento) + Umbraco — obtenção automática do template, lift-and-rewire verbatim de cada seção para módulo editável, conexão do formulário ao backend de leads e gate de paridade determinístico. Repo-agnóstica.
3
3
  argument-hint: <projeto>
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skill
5
+ stacks:
6
+ - umbraco
5
7
  ---
6
8
 
7
9
  # /migrate-lp-to-umbraco — Migração de LP para Umbraco Headless
@@ -1,37 +1,14 @@
1
1
  ---
2
- description: Implementa a feature aprovada no Gate 2. Loop autônomo de tarefas via morph-implement com auto-advance entre tarefas, depois morph-review apresenta o Gate 3.
2
+ description: Implementa as fatias do plano aprovado e termina na morph-review (Gate 3).
3
3
  argument-hint: <feature-name>
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skill
5
5
  ---
6
6
 
7
- # /morph-apply — NLH Implementation
7
+ # /morph-apply
8
8
 
9
- Executa as tasks de uma feature até o Gate 3.
9
+ Atalho: invoque `Skill(morph-apply)` com o nome da feature.
10
10
 
11
- **Implementação:** este slash command é um atalho. O agente deve invocar `Skill(morph-apply)` com o nome da feature. A skill decide adaptativamente entre execução sequencial (auto-advance entre tasks) ou paralela (Agent dispatch para tasks independentes) baseado no DAG do `tasks.json`. Termina com `morph-review` + Gate 3 trust-aware.
12
-
13
- ## Argumentos
14
-
15
- `{feature-name}` — nome da feature já planejada (Gate 2 aprovado).
16
-
17
- ## Pré-requisitos
18
-
19
- Antes de começar, verifique:
20
- - `.morph/features/{feature-name}/2-plan/spec.md` existe
21
- - `.morph/features/{feature-name}/2-plan/tasks.json` existe e é válido contra o schema
22
-
23
- Se algum estiver faltando, abortar e pedir ao usuário para rodar `/morph-proposal {feature-name}` primeiro.
24
-
25
- ## Anti-padrões
26
-
27
- - Não pausar entre tarefas para confirmação — o tasks.json já foi aprovado no Gate 2.
28
- - Não escrever código fora de `3-implement/` ou da source tree do projeto.
29
- - Não modificar `spec.md` durante a implementação — ele foi congelado pelo Gate 2.
30
-
31
- ## Referências
32
-
33
- - `.morph/framework/MORPH.md` — charter completo
34
- - `.claude/skills/morph-implement/SKILL.md`
35
- - `.claude/skills/morph-review/SKILL.md`
11
+ Pré-requisito: o gate do plano aprovado, com `.morph/features/{feature}/2-plan/plan.md` e
12
+ `2-plan/checks.json` (gravado por `morph-spec plan-check`). Faltando, rode `/morph-proposal {feature}`.
36
13
 
37
14
  **Feature:** $ARGUMENTS
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Archive a completed MORPH-SPEC feature after Gate 3 approval
2
+ description: Archive a feature WITHOUT integrating — reserved for legacy features (no morph/{f} branch) and cleanup; the normal close is morph-spec finish
3
3
  argument-hint: <feature-name>
4
4
  allowed-tools: Read, Bash
5
5
  ---
@@ -38,7 +38,7 @@ is idempotent: an already-archived feature is reported, not re-moved.
38
38
  drops the feature from the thin index.
39
39
 
40
40
  3. **Report** the new path (`.morph/archive/{feature}/`). Do not invent metrics not recorded in
41
- `feature.json` or `recap.md`.
41
+ `feature.json` or the slice reports (`3-implement/reports/`).
42
42
 
43
43
  ---
44
44
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: ADW cirúrgico de hotfix. Roda scout (root cause + blast radius) → hotfix brief → fix cirúrgico → test loop focado → Gate 3 sempre humano → ship.
2
+ description: ADW cirúrgico de hotfix. Roda scout (root cause + blast radius) → plano curto → fix cirúrgico → verify → Gate 3 sempre humano → ship.
3
3
  argument-hint: <feature-name>
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skill
5
5
  ---
@@ -8,7 +8,7 @@ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skil
8
8
 
9
9
  Resolve uma queda ou bug crítico de produção com prioridade máxima em velocidade, sem abrir mão da aprovação humana antes do ship.
10
10
 
11
- **Implementação:** este slash command é um atalho. O agente deve invocar `Skill(morph-hotfix)` com o nome da feature como argumento. A skill encadeia `morph-spec create --type hotfix` → scout → hotfix brief → plano mínimo → fix cirúrgico → test loop no blast radius → Gate 3 (sempre humano, nunca `--mode auto`) → pós-gate.
11
+ **Implementação:** este slash command é um atalho. O agente deve invocar `Skill(morph-hotfix)` com o nome da feature como argumento. A skill encadeia `morph-spec create --type hotfix` → scout → plano curto → fix cirúrgico → verify → Gate 3 (sempre humano, nunca `--mode auto`) → pós-gate.
12
12
 
13
13
  ## Argumentos
14
14
 
@@ -16,13 +16,13 @@ Resolve uma queda ou bug crítico de produção com prioridade máxima em veloci
16
16
 
17
17
  ## Fluxo
18
18
 
19
- 1. **Nascimento:** `morph-spec create {feature-name} --type hotfix --description "<incidente>"` — carimba `name`+`description` (obrigatória) e os gates `proposal`/`plan` por política e cria `0-proposal/`, `2-plan/`, `3-implement/` num passo só.
19
+ 1. **Nascimento:** `morph-spec create {feature-name} --type hotfix --description "<incidente>"` — carimba `name`+`description` (obrigatória) e o gate `plan` por política e cria `2-plan/` e `3-implement/` num passo só.
20
20
  2. **Scout obrigatório:** despacha `subagent_type: "morph-scout"` (fallback `general-purpose` + persona colada) para localizar root cause e blast radius antes de qualquer fix; o mapa vai para `2-plan/scout-map.md` e passa por `morph-spec scout-check` antes do brief (reprovado → re-despacha uma vez).
21
- 3. **Hotfix brief:** escreve `0-proposal/proposal.md` curto (sintoma/root cause/blast radius/plano do fix) e `2-plan/tasks.json` mínimo (T1 fix, T2 verify/regressão).
22
- 4. **Fix cirúrgico:** implementa a mudança mínima que resolve o sintoma — sem refatoração, sem hardening fora de escopo.
23
- 5. **Test loop:** `morph-spec verify {feature-name} {task} --json` focado no blast radius até verde; evidência real capturada no `recap.md`.
24
- 6. **Gate 3 sempre humano:** `morph-spec gate-check {feature-name} review` (força a pausa via `workType: hotfix`, lido do disco) → `4-review/review-report.md` → `AskUserQuestion` sempre. **Nunca** `morph-spec approve {feature-name} review --mode auto` — o CLI recusa essa combinação num hotfix.
25
- 7. **Pós-gate:** `morph-spec verify {feature-name}` (suíte completa da feature) e sinaliza commit/archive — não arquiva automaticamente.
21
+ 3. **Plano curto:** `2-plan/plan.md` com o sintoma, o root cause e o blast radius em `## Problema`, C1 sintoma ausente, C2 regressão e uma fatia F1; `morph-spec plan-check` grava `checks.json`.
22
+ 4. **Fix cirúrgico:** implementa a mudança mínima que resolve o sintoma — sem refatoração, sem hardening fora de escopo; termina em `3-implement/reports/F1.md`.
23
+ 5. **Prova:** `morph-spec verify {feature-name} --json` até verde; evidência real capturada no `3-implement/reports/F1.md`.
24
+ 6. **Gate 3 sempre humano:** `morph-spec gate-check {feature-name} review` (força a pausa via `workType: hotfix`, lido do disco) → `4-review/verifier.md` escrito por você (C1/C2 + evidência do verify, sem dispatch) → `AskUserQuestion` sempre. **Nunca** `morph-spec approve {feature-name} review --mode auto` — o CLI recusa essa combinação num hotfix.
25
+ 7. **Pós-gate:** `morph-spec finish {feature-name} --pr|--merge` — o encerramento único (arquiva, integra, desmonta). O usuário decide o modo, porque `finish` toca a default ou o remoto; `--pr` **não integra** (`awaiting: "merge"`), então o incidente só está resolvido depois do merge.
26
26
 
27
27
  ## Anti-padrões
28
28
 
@@ -1,215 +1,29 @@
1
1
  ---
2
- description: Manage Azure infrastructure with Bicep templates — provision, update, and monitor cloud resources
3
- argument-hint: [up|down|plan|status]
4
- allowed-tools: Read, Write, Edit, Bash, Glob, AskUserQuestion
2
+ description: Infra do projeto — Docker Compose local e deploy no Coolify (API via SSH), com política de custo
3
+ argument-hint: [compose|deploy|status]
4
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Agent
5
5
  ---
6
6
 
7
- # /morph-infra - Infrastructure Management
7
+ # /morph-infra — Infraestrutura
8
8
 
9
- Manage Azure infrastructure using Bicep templates.
9
+ Antes de agir, leia os standards: `morph-spec standards --find infra` (deploy no Coolify e isolamento do compose local). Trabalho de infra vai para a persona `morph-infra-engineer` quando ela está instalada; sem ela, siga os standards direto.
10
10
 
11
- ## Usage
11
+ ## Local — Docker Compose
12
12
 
13
- ```
14
- /morph-infra [action] [options]
15
- ```
13
+ Cada worktree sobe o próprio stack: portas do bloco do worktree (`${VAR:-default}`), nunca `container_name`, healthcheck em todo serviço. Subir e provar: `morph-spec e2e up {feature}` e o nó e2e do `morph-spec verify {feature}`.
16
14
 
17
- ### Actions
15
+ ## Deploy — Coolify
18
16
 
19
- | Action | Description |
20
- |--------|-------------|
21
- | `init` | Initialize IaC structure in the project |
22
- | `validate` | Validate Bicep templates |
23
- | `plan` | Show what-if of changes |
24
- | `deploy` | Execute resource deployment |
25
- | `destroy` | Remove all resources |
17
+ Não existe MCP nem CLI do Coolify: o acesso é por SSH ao servidor (alias configurado pelo usuário) e `curl` na API em `localhost`, com o token lido do lado do servidor e nunca impresso. Variáveis de ambiente ficam no Coolify, nunca no Dockerfile. Repositório e PRs pelo `gh`.
26
18
 
27
- ---
28
-
29
- ## Workflow
30
-
31
- ### 1. INIT - Initialize IaC
32
-
33
- When the user requests `/morph-infra init`:
34
-
35
- 1. Create the `infra/` structure in the project:
36
- ```
37
- infra/
38
- ├── main.bicep
39
- ├── parameters.dev.json
40
- ├── parameters.prod.json
41
- └── modules/
42
- ├── container-app.bicep
43
- ├── container-app-env.bicep
44
- ├── sql-database.bicep
45
- ├── storage.bicep
46
- ├── key-vault.bicep
47
- └── app-insights.bicep
48
- ```
49
-
50
- 2. Copy templates from `.morph/framework/templates/infrastructure/...`
51
-
52
- 3. Replace placeholders:
53
- - `{{APP_NAME}}` → project name
54
- - `{{SUBSCRIPTION_ID}}` → request from user
55
- - `{{RESOURCE_GROUP}}` → suggest default `rg-{app}-{env}`
56
-
57
- 4. Document the created structure in `decisions.md`
58
-
59
- ---
60
-
61
- ### 2. VALIDATE - Validate Templates
62
-
63
- When the user requests `/morph-infra validate`:
64
-
65
- 1. Run Bicep validation:
66
- ```bash
67
- az bicep build --file infra/main.bicep
68
- ```
69
-
70
- 2. Check required parameters
71
-
72
- 3. Report errors or success
73
-
74
- ---
75
-
76
- ### 3. PLAN - Preview Changes
77
-
78
- When the user requests `/morph-infra plan [env]`:
79
-
80
- 1. Check if Azure CLI is authenticated:
81
- ```bash
82
- az account show
83
- ```
84
-
85
- 2. Run what-if:
86
- ```bash
87
- az deployment group what-if \
88
- --resource-group rg-{app}-{env} \
89
- --template-file infra/main.bicep \
90
- --parameters @infra/parameters.{env}.json
91
- ```
92
-
93
- 3. Present change summary:
94
- - Resources to create
95
- - Resources to modify
96
- - Resources to delete
97
- - Estimated costs
98
-
99
- 4. **STOP and wait for approval** before deploy
100
-
101
- ---
102
-
103
- ### 4. DEPLOY - Execute Deploy
104
-
105
- When the user requests `/morph-infra deploy [env]`:
106
-
107
- 1. Verify plan was approved
108
-
109
- 2. Create resource group if it doesn't exist:
110
- ```bash
111
- az group create --name rg-{app}-{env} --location brazilsouth
112
- ```
113
-
114
- 3. Execute deploy:
115
- ```bash
116
- az deployment group create \
117
- --resource-group rg-{app}-{env} \
118
- --template-file infra/main.bicep \
119
- --parameters @infra/parameters.{env}.json
120
- ```
19
+ ## Custo
121
20
 
122
- 4. Capture outputs:
123
- - Container App URL
124
- - SQL Connection String
125
- - Key Vault URI
21
+ | Custo mensal | Ação |
22
+ |---|---|
23
+ | grátis | segue |
24
+ | até US$ 10 | confirme com o usuário |
25
+ | acima de US$ 10 | ADR em `## Decisões` do `plan.md` antes de criar |
126
26
 
127
- 5. Update documentation with deploy information
128
-
129
- ---
130
-
131
- ### 5. DESTROY - Remove Resources
132
-
133
- When the user requests `/morph-infra destroy [env]`:
134
-
135
- 1. **WARN** that this action is irreversible
136
-
137
- 2. List resources that will be deleted
138
-
139
- 3. **STOP and wait for explicit confirmation** ("yes, delete")
140
-
141
- 4. Execute:
142
- ```bash
143
- az group delete --name rg-{app}-{env} --yes --no-wait
144
- ```
145
-
146
- ---
147
-
148
- ## Security Rules
149
-
150
- ### NEVER:
151
- - Expose secrets in logs
152
- - Commit files with secrets
153
- - Delete production resources without explicit confirmation
154
- - Create resources outside Bicep (zero portal)
155
-
156
- ### ALWAYS:
157
- - Use Key Vault for secrets
158
- - Validate Bicep before deploy
159
- - Run what-if before deploy
160
- - Document estimated costs
161
- - Keep parameters.json separated by environment
162
-
163
- ---
164
-
165
- ## Cost Guardian Integration
166
-
167
- Before any deploy, check with Cost Guardian:
168
-
169
- 1. Estimate monthly resource costs
170
- 2. Verify it's within approved limits:
171
- - Free tier: no approval needed
172
- - Up to $10/month: requires confirmation
173
- - Above $10: requires ADR
174
-
175
- ---
176
-
177
- ## Usage Example
178
-
179
- ```
180
- User: /morph-infra init
181
- Claude: Creating IaC structure...
182
- - infra/main.bicep
183
- - infra/parameters.dev.json
184
- - infra/modules/*.bicep
185
- Done! Run /morph-infra validate to verify.
186
-
187
- User: /morph-infra plan dev
188
- Claude: Analyzing changes for dev environment...
189
-
190
- CREATE:
191
- + Container App Environment
192
- + Container App
193
- + SQL Server (Free)
194
- + Storage Account (LRS)
195
- + Key Vault
196
- + Application Insights
197
-
198
- ESTIMATED COST: ~$0/month (Free tier)
199
-
200
- Approve deploy? (yes/no)
201
-
202
- User: yes
203
- Claude: Executing deploy...
204
- ✓ Resource Group created
205
- ✓ Deploy completed in 3m 45s
206
-
207
- OUTPUTS:
208
- - URL: https://myapp-dev.azurecontainerapps.io
209
- - SQL: tcp:myapp-dev-sql.database.windows.net
210
- - Key Vault: https://myapp-dev-kv.vault.azure.net
211
- ```
212
-
213
- ---
27
+ Nunca apague recurso de produção sem confirmação explícita.
214
28
 
215
- *MORPH-SPEC by Polymorphism Tech*
29
+ **Input:** $ARGUMENTS
@@ -2,6 +2,9 @@
2
2
  description: Conduz a autoria de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas.
3
3
  argument-hint: [o que gerar]
4
4
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
5
+ stacks:
6
+ - dotnet
7
+ - nextjs
5
8
  ---
6
9
 
7
10
  # /morph-media — Autoria de mídia gerada
@@ -28,28 +28,21 @@ These checks verify that the morph-spec workflow is complete for the feature bei
28
28
  # Verify implementation is complete
29
29
  morph-spec status {feature}
30
30
  morph-spec approval-status {feature}
31
- morph-spec validate {feature}
31
+ morph-spec verify {feature}
32
32
  ```
33
33
 
34
34
  | Check | Command | Pass Criteria |
35
35
  |-------|---------|---------------|
36
36
  | Phase is implement or later | `status` | phase derived as `implement` or `review` |
37
- | All gates approved | `approval-status` | proposal, plan, review gates all approved |
38
- | Feature validation passes | `validate` | 100% pass rate |
39
- | All tasks complete | `status` → tasks | 0 tasks in `pending` or `in_progress` |
40
- | Recap generated | Read `3-implement/recap.md` | File exists and is non-empty |
37
+ | All gates approved | `approval-status` | plan (and uiux, when the feature has design) and review gates approved |
38
+ | Build, tests and validators pass | `verify` | every node green |
39
+ | All slices reported | `status` → Fatias | 0 slices pending or partial |
41
40
 
42
41
  **If any MORPH check fails:** Show which check failed and recommend: `Run /morph-apply {feature} to complete implementation before deploying.`
43
42
 
44
43
  ---
45
44
 
46
- ## Test Suite (run before infrastructure checks)
47
-
48
- ```bash
49
- dotnet test --verbosity normal
50
- ```
51
-
52
- **Pass criteria:** 100% test pass rate. Zero tolerance — any failing test blocks deployment.
45
+ **Tests:** run them only through `morph-spec verify {feature}` — never a bare `dotnet test`/`npm test`, which bypasses the heavy-job queue and leaves no proof the gates read. Any red node blocks deployment.
53
46
 
54
47
  ---
55
48
 
@@ -109,6 +102,8 @@ dotnet ef migrations add <migration-name>
109
102
  - .dockerignore present
110
103
 
111
104
  **How to check:**
105
+ `Dockerfile.api` and `Dockerfile.web` are the names the `docker-dockerfile-api`/`docker-dockerfile-web` templates emit (`outputName` in REGISTRY.json); check the project's real names first.
106
+
112
107
  ```bash
113
108
  # Validate API Dockerfile
114
109
  docker build --check -f Dockerfile.api .
@@ -173,25 +168,6 @@ grep -E "REPLACE_WITH_" coolify.json 2>/dev/null && echo "✗ coolify.json still
173
168
 
174
169
  ---
175
170
 
176
- ## Example Output
177
-
178
- ```
179
- MORPH Pre-Flight Check: Deployment
180
-
181
- Packages: No version conflicts detected
182
- Migrations: No pending changes
183
- Dockerfile: Valid multi-stage build (API + Web)
184
- Docker Compose: Valid configuration
185
- Secrets: No hardcoded credentials found
186
- Coolify: Health endpoint found at /healthz
187
-
188
- Summary: 6 passed, 0 failed, 0 warnings
189
-
190
- READY TO DEPLOY
191
- ```
192
-
193
- ---
194
-
195
171
  ## Usage Workflow
196
172
 
197
173
  ### Before creating PR for production