@polymorphism-tech/morph-spec 8.38.0 → 8.40.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 (227) hide show
  1. package/CLAUDE.md +19 -8
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +60 -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 +3 -2
  8. package/framework/MORPH.md +1 -1
  9. package/framework/agents.json +36 -25
  10. package/framework/docs/CLI.md +2 -2
  11. package/framework/evals/rubrics/code-quality.md +4 -4
  12. package/framework/evals/rubrics/condensed.md +2 -2
  13. package/framework/mcp/registry.json +33 -2
  14. package/framework/rules/infrastructure-standards.md +0 -1
  15. package/framework/rules/morph-workflow.md +9 -4
  16. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  17. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  18. package/framework/skills/core/morph-apply/SKILL.md +5 -1
  19. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  20. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  21. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  22. package/framework/skills/core/morph-implement/SKILL.md +6 -1
  23. package/framework/skills/core/morph-media/SKILL.md +1 -1
  24. package/framework/skills/core/morph-plan/SKILL.md +4 -3
  25. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  26. package/framework/skills/core/morph-review/SKILL.md +1 -1
  27. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  28. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  29. package/framework/skills/core/morph-uiux/SKILL.md +6 -5
  30. package/framework/standards/STANDARDS.json +3 -3
  31. package/framework/standards/ai-agents/context-providers.md +16 -26
  32. package/framework/standards/ai-agents/durable-workflows-hitl.md +15 -21
  33. package/framework/standards/ai-agents/modalities-image-gen.md +21 -25
  34. package/framework/standards/ai-agents/modalities-speech-to-text.md +4 -15
  35. package/framework/standards/ai-agents/modalities-text-to-speech.md +2 -11
  36. package/framework/standards/ai-agents/modalities-vision.md +1 -18
  37. package/framework/standards/ai-agents/prompt-sources.md +0 -4
  38. package/framework/standards/architecture/code-comments.md +52 -16
  39. package/framework/standards/backend/integrations/neon-auth/neon-auth.md +63 -50
  40. package/framework/standards/frontend/design-system/ai-image-generation.md +5 -5
  41. package/framework/standards/integration/mcp/mcp-tools.md +48 -117
  42. package/framework/templates/code/dotnet/abstractions/result.cs +0 -2
  43. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +26 -39
  44. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +28 -68
  45. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +99 -117
  46. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +2 -44
  47. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +40 -61
  48. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +54 -107
  49. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +53 -58
  50. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +192 -281
  51. package/framework/templates/code/dotnet/database/migration.cs +49 -83
  52. package/framework/templates/code/dotnet/database/vector-entity.cs +2 -46
  53. package/framework/templates/code/dotnet/extensions/result-extensions.cs +0 -2
  54. package/framework/templates/code/dotnet/feature/validator.cs.hbs +11 -15
  55. package/framework/templates/code/dotnet/jobs/agent.cs +3 -51
  56. package/framework/templates/code/dotnet/jobs/job.cs +2 -97
  57. package/framework/templates/code/dotnet/test.cs +2 -87
  58. package/framework/templates/code/typescript/contracts.ts +140 -167
  59. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentApi.cs +1 -48
  60. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactory.cs +3 -79
  61. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentFactoryOptions.cs +1 -70
  62. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpec.cs +1 -47
  63. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Agents/AgentSpecOptions.cs +2 -99
  64. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/AiKitAssemblyMarker.cs +0 -6
  65. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/ConversationStore.cs +3 -88
  66. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/IConversationStore.cs +1 -41
  67. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Conversation/InMemoryConversationStore.cs +0 -21
  68. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/CountingChatClient.cs +1 -25
  69. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalAssertion.cs +2 -63
  70. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheMissException.cs +0 -30
  71. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheOptions.cs +1 -52
  72. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalCacheStamp.cs +3 -78
  73. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalFixture.cs +4 -109
  74. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalMode.cs +0 -22
  75. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalQualityEvaluators.cs +1 -36
  76. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalScenario.cs +2 -57
  77. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/EvalSummary.cs +0 -75
  78. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/OfflineChatClient.cs +2 -59
  79. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Evals/ShortPathResponseCache.cs +4 -111
  80. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaGenerator.cs +0 -34
  81. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/IMediaProvider.cs +1 -57
  82. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaArtifact.cs +0 -19
  83. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaDisclosure.cs +2 -74
  84. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaGenerator.cs +2 -33
  85. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaIdempotencyKey.cs +1 -43
  86. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJob.cs +1 -96
  87. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobId.cs +0 -13
  88. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaJobState.cs +0 -27
  89. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaPricing.cs +0 -33
  90. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaProvenance.cs +0 -31
  91. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaRequest.cs +3 -75
  92. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaResult.cs +0 -42
  93. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaReview.cs +0 -39
  94. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaSeams.cs +1 -55
  95. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MediaStore.cs +3 -59
  96. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/MorphMedia.cs +0 -46
  97. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/GoogleImageProvider.cs +3 -28
  98. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/OpenAIImageProvider.cs +7 -61
  99. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Media/Providers/VeoVideoProvider.cs +2 -37
  100. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/IUsageCostSink.cs +1 -23
  101. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostMiddleware.cs +2 -82
  102. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Middleware/UsageCostRecord.cs +1 -68
  103. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphOpenTelemetryExtensions.cs +1 -62
  104. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Observability/MorphTelemetryOptions.cs +2 -62
  105. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/IProviderClientFactory.cs +1 -25
  106. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelAlias.cs +0 -124
  107. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Providers/ModelRegistry.cs +1 -73
  108. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaIngest.cs +1 -66
  109. package/framework/templates/dotnet/ai-kit/src/Morph.AiKit/Rag/DeltaPlan.cs +0 -41
  110. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentFactoryTests.cs +2 -112
  111. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/AgentSpecTests.cs +2 -43
  112. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ConversationStoreTests.cs +5 -110
  113. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/DeltaIngestTests.cs +7 -103
  114. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalAssertionTests.cs +1 -42
  115. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheMissTests.cs +1 -30
  116. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalCacheStampTests.cs +1 -19
  117. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFailuresTests.cs +0 -48
  118. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalFixtureTests.cs +1 -29
  119. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalRefreshTests.cs +2 -38
  120. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/EvalWorkspace.cs +1 -14
  121. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/KitEvals.cs +4 -69
  122. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Evals/OfflineChatClientTests.cs +1 -10
  123. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClient.cs +1 -57
  124. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeChatClientTests.cs +0 -26
  125. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeClock.cs +1 -19
  126. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeMediaProvider.cs +0 -32
  127. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeProviderClientFactory.cs +0 -14
  128. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/FakeUsageCostSink.cs +0 -24
  129. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Fakes/InMemoryMediaStore.cs +0 -32
  130. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAccessibilityTests.cs +0 -37
  131. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaAliasIsNotAnAgentTests.cs +0 -24
  132. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +0 -78
  133. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaGeneratorTests.cs +0 -53
  134. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaIdempotencyKeyTests.cs +0 -44
  135. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaJobStateTests.cs +0 -44
  136. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaReviewTests.cs +0 -19
  137. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaStoreTests.cs +0 -24
  138. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/ModelRegistryTests.cs +6 -48
  139. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/SkeletonSmokeTests.cs +1 -13
  140. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/TelemetryTests.cs +2 -71
  141. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/UsageCostMiddlewareTests.cs +5 -100
  142. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +39 -43
  143. package/framework/templates/frontend/nextjs/env.mjs.hbs +29 -32
  144. package/framework/templates/frontend/nextjs/page.tsx.hbs +21 -22
  145. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +42 -54
  146. package/framework/templates/integrations/asaas-client.cs +332 -387
  147. package/framework/templates/integrations/asaas-webhook.cs +290 -351
  148. package/framework/templates/integrations/neon-auth-config.cs +9 -105
  149. package/framework/templates/project/validate.js +97 -120
  150. package/package.json +2 -2
  151. package/src/commands/dashboard/dashboard.js +80 -53
  152. package/src/commands/mcp/mcp-setup.js +37 -9
  153. package/src/commands/project/doctor.js +3 -5
  154. package/src/commands/project/init.js +6 -3
  155. package/src/commands/project/install-plugin-cmd.js +1 -1
  156. package/src/commands/project/update.js +5 -0
  157. package/src/dashboard/app/App.jsx +80 -16
  158. package/src/dashboard/app/components/ActivityFeed.jsx +172 -0
  159. package/src/dashboard/app/components/CommandPalette.jsx +155 -0
  160. package/src/dashboard/app/components/DetailPanel.jsx +47 -11
  161. package/src/dashboard/app/components/EntityLink.jsx +55 -0
  162. package/src/dashboard/app/components/ErrorBoundary.jsx +54 -0
  163. package/src/dashboard/app/components/FlowGraph.jsx +19 -17
  164. package/src/dashboard/app/components/KnowledgeMarkdown.jsx +53 -0
  165. package/src/dashboard/app/components/Markdown.jsx +47 -0
  166. package/src/dashboard/app/components/PhaseRail.jsx +111 -0
  167. package/src/dashboard/app/components/SearchFilter.jsx +40 -22
  168. package/src/dashboard/app/components/Sidebar.jsx +146 -37
  169. package/src/dashboard/app/hooks/useMorphQuery.js +54 -0
  170. package/src/dashboard/app/hooks/usePref.js +38 -0
  171. package/src/dashboard/app/lib/format.js +69 -0
  172. package/src/dashboard/app/lib/phases.js +56 -0
  173. package/src/dashboard/app/lib/project.js +50 -0
  174. package/src/dashboard/app/pages/Activity.jsx +24 -0
  175. package/src/dashboard/app/pages/AgentMap.jsx +371 -370
  176. package/src/dashboard/app/pages/FeatureDetail.jsx +604 -0
  177. package/src/dashboard/app/pages/Features.jsx +400 -0
  178. package/src/dashboard/app/pages/Guide.jsx +146 -0
  179. package/src/dashboard/app/pages/HookInspector.jsx +357 -322
  180. package/src/dashboard/app/pages/PhasePipeline.jsx +277 -408
  181. package/src/dashboard/app/pages/Portfolio.jsx +156 -0
  182. package/src/dashboard/app/pages/Rubrics.jsx +101 -0
  183. package/src/dashboard/app/pages/RulesMap.jsx +300 -273
  184. package/src/dashboard/app/pages/SkillsLibrary.jsx +483 -366
  185. package/src/dashboard/app/pages/Standards.jsx +407 -332
  186. package/src/dashboard/app/styles/index.css +187 -47
  187. package/src/dashboard/index.html +14 -12
  188. package/src/dashboard/package.json +32 -24
  189. package/src/dashboard/scanner/activity-scanner.js +351 -0
  190. package/src/dashboard/scanner/agents-scanner.js +59 -1
  191. package/src/dashboard/scanner/docs-scanner.js +59 -0
  192. package/src/dashboard/scanner/feature-status.js +10 -0
  193. package/src/dashboard/scanner/features-scanner.js +360 -0
  194. package/src/dashboard/scanner/index.js +14 -7
  195. package/src/dashboard/scanner/phases-scanner.js +14 -15
  196. package/src/dashboard/scanner/portfolio.js +153 -0
  197. package/src/dashboard/scanner/project-api.js +195 -0
  198. package/src/dashboard/scanner/rules-scanner.js +42 -37
  199. package/src/dashboard/scanner/skills-scanner.js +105 -43
  200. package/src/dashboard/scanner/standards-scanner.js +2 -0
  201. package/src/dashboard/vite-plugin-morph-data.js +134 -17
  202. package/src/lib/detectors/claude-config-detector.js +2 -7
  203. package/src/lib/detectors/index.js +5 -1
  204. package/src/lib/evaluator-report.js +22 -0
  205. package/src/lib/generators/settings-generator.js +208 -209
  206. package/src/lib/installers/mcp-installer.js +724 -719
  207. package/src/lib/installers/memory-installer.js +1 -2
  208. package/src/lib/projects/registry.js +154 -0
  209. package/src/lib/validators/code-budget/code-budget-validator.js +32 -4
  210. package/src/scripts/install-plugin.js +1 -1
  211. package/src/scripts/setup-infra.js +2 -4
  212. package/src/utils/agents-installer.js +57 -12
  213. package/src/utils/banner.js +1 -1
  214. package/src/commands/index.js +0 -13
  215. package/src/commands/project/checkpoint.js +0 -209
  216. package/src/core/state/phase-state-machine.js +0 -197
  217. package/src/dashboard/app/hooks/useDetailPanel.js +0 -15
  218. package/src/dashboard/app/pages/LiveState.jsx +0 -206
  219. package/src/dashboard/scanner/squads-scanner.js +0 -13
  220. package/src/dashboard/scanner/state-scanner.js +0 -85
  221. package/src/lib/generators/index.js +0 -10
  222. package/src/lib/hooks/hook-executor.js +0 -167
  223. package/src/lib/validators/checkpoint-persistence.js +0 -39
  224. package/src/lib/validators/shared/emit-validator-dispatch.js +0 -14
  225. package/src/lib/validators/shared/index.js +0 -12
  226. package/src/lib/validators/shared/issue-counter.js +0 -14
  227. package/src/lib/validators/shared/result-formatter.js +0 -124
@@ -11,7 +11,7 @@ Avalia naming, ausência de code smells e aderência aos padrões do stack do pr
11
11
  - **Nada do que foi criado aqui já existia no projeto**: os conceitos novos batem com o veredito do `reuse-map.md`, e cada `CRIAR` tem justificativa que se sustenta.
12
12
  - Segue os padrões do stack conforme os standards do projeto (ex: Result pattern para .NET, hooks pattern para React).
13
13
  - Sem "dead code" — sem variáveis não usadas, sem blocos comentados, sem imports desnecessários.
14
- - Comentário só com o porquê que o código não mostra (`architecture-code-comments`): nenhum conta história de task, UC, ADR, Gate ou avaliador.
14
+ - Quase nenhum comentário: nome, tipo e teste explicam o código. O que sobra é só o porquê que o código não mostra (`architecture-code-comments`), sem `///`/JSDoc que repete a assinatura, banner de seção nem história de task, UC, ADR, Gate ou avaliador.
15
15
 
16
16
  ## Score 7-8 — Bom
17
17
 
@@ -21,7 +21,7 @@ Avalia naming, ausência de code smells e aderência aos padrões do stack do pr
21
21
  - No máximo um conceito recriado que já existia no codebase, com impacto pequeno e localizado.
22
22
  - Segue padrões do stack com desvios isolados e justificáveis.
23
23
  - Sem dead code significativo.
24
- - Um ou outro comentário que repete o código; nenhum narra o processo.
24
+ - Um ou outro comentário que repete o código ou doc-comment dispensável; nenhum narra o processo.
25
25
 
26
26
  ## Score 5-6 — Aceitável com ressalvas
27
27
 
@@ -31,7 +31,7 @@ Avalia naming, ausência de code smells e aderência aos padrões do stack do pr
31
31
  - Um ou dois tipos/componentes recriados que já existiam em outro arquivo do projeto.
32
32
  - Desvios dos padrões do stack sem justificativa.
33
33
  - Dead code pontual.
34
- - Comentário de processo (UC, ADR, `T{n}`, Gate, `spec.md`, mockup) ou comentário afirmando comportamento que nenhum teste cobra.
34
+ - Comentário de processo (UC, ADR, `T{n}`, Gate, `spec.md`, mockup), comentário afirmando comportamento que nenhum teste cobra, ou `///`/JSDoc em todo membro de aplicação repetindo a assinatura.
35
35
 
36
36
  ## Score 3-4 — Problemático
37
37
 
@@ -95,4 +95,4 @@ chave `obs` no `**Proof-Scores:**`, também não há teto a aplicar.
95
95
  3b. **O que foi criado aqui já existia no projeto?** Confira os tipos, componentes, hooks e serviços novos contra o `reuse-map.md` e contra o grafo — e diga no relatório o que você conferiu.
96
96
  4. O código segue os padrões definidos nos standards do projeto?
97
97
  5. Há variáveis não usadas, imports desnecessários ou blocos comentados?
98
- 6. Algum comentário conta história de processo, repete o código ou passa de ~3 linhas sem justificar? O validador `code-budget` do nó `validators` já conta, nas linhas adicionadas, os comentários que citam processo; leia os citados antes de pontuar.
98
+ 6. Algum comentário existe onde um nome, uma função extraída, um tipo ou um teste bastaria? Algum conta história de processo, repete o código ou a assinatura, ou passa de ~3 linhas sem justificar? O validador `code-budget` do nó `validators` já conta, nas linhas adicionadas, os comentários que citam processo e a densidade de comentário sobre código; leia os arquivos citados antes de pontuar.
@@ -30,7 +30,7 @@ Se o diff toca endpoint minimal API ou fetch cross-camada, independente do resto
30
30
  |---|---|---|---|---|
31
31
  | **Arquitetura** | Ignora a arquitetura do spec.md; sem feature folder; deps circulares; ou violação mecânica acima | Pastas corretas, responsabilidades se misturam; deps cross-feature sem justificativa; domain acoplado a infra | Desvios menores justificados; deps cross-feature via abstração; impurezas de infra pontuais | Feature folder rigoroso; zero deps cross-feature diretas; domain isolado; DI onde exige |
32
32
  | **Contratos** | Sem tipos ou `any` generalizado; zero validação; sem tratamento de erro; naming arbitrário | `any`/genérico visível; validação parcial; mix exceptions/Result; naming inconsistente | Tipos bem definidos, `any` raro e justificado; validação na maioria; erro consistente | Zero `any`; validação em todos endpoints; Result pattern/discriminated union; naming consistente |
33
- | **Qualidade** | Nomes arbitrários; god objects; duplicação massiva; recria o que o `reuse-map` mandou REUSAR; fora do padrão do stack | Nomes genéricos (`data`,`temp`); funções >30 linhas; duplicação perceptível; conceito da MESMA feature redeclarado; comentário que narra task/UC/ADR | Nomes claros, raras exceções; bem dimensionado; duplicação mínima; no máximo um conceito recriado | Nomes comunicam intenção; funções ≤20-25 linhas, 1 responsabilidade; zero duplicação/dead code; nada criado que já existia no projeto; comentário só com o porquê |
33
+ | **Qualidade** | Nomes arbitrários; god objects; duplicação massiva; recria o que o `reuse-map` mandou REUSAR; fora do padrão do stack | Nomes genéricos (`data`,`temp`); funções >30 linhas; duplicação perceptível; conceito da MESMA feature redeclarado; comentário que narra task/UC/ADR ou `///`/JSDoc repetindo a assinatura | Nomes claros, raras exceções; bem dimensionado; duplicação mínima; no máximo um conceito recriado | Nomes comunicam intenção; funções ≤20-25 linhas, 1 responsabilidade; zero duplicação/dead code; nada criado que já existia no projeto; quase nenhum comentário, só o porquê que o código não mostra |
34
34
  | **Testes** | Sem testes ou sem asserts reais; zero edge case; nomes genéricos | Happy path OK, edge cases parciais; erros só óbvios; testes interdependentes; teste de texto de arquivo sem substituto em runtime; cópias em vez de tabela ou excesso sem justificativa | Happy path completo; maioria dos edge cases; erros nos fluxos principais | Toda pós-condição do `usecase` tem teste; A1/A2 cobertos; edge+erro cobertos, em tabela; isolados; dentro do orçamento |
35
35
 
36
36
  > **Qualidade olha o CODEBASE, não só o diff.** Símbolo novo cujo nome já existe no projeto não aparece no diff — é preciso perguntar de fora dele. O nó `validators` do `morph-spec verify` já traz os achados do validador `reuse`; o `2-plan/reuse-map.md` diz o que o plano decidiu por conceito.
@@ -39,7 +39,7 @@ Se o diff toca endpoint minimal API ou fetch cross-camada, independente do resto
39
39
 
40
40
  > Teste que só lê texto de arquivo não cobre pós-condição de comportamento: sem substituto em runtime, ela conta como sem teste (herdado de `test-coverage.md`, pergunta 7).
41
41
 
42
- > Orçamento por task: um teste por pós-condição + um de regressão por bug, cenários do mesmo comportamento numa tabela; teste que só fixa copy é achado (herdado de `test-coverage.md`, pergunta 8). O validador `code-budget` do nó `validators` avisa sobre teste acima de 1,5× a produção e sobre comentário que cita processo.
42
+ > Orçamento por task: um teste por pós-condição + um de regressão por bug, cenários do mesmo comportamento numa tabela; teste que só fixa copy é achado (herdado de `test-coverage.md`, pergunta 8). O validador `code-budget` do nó `validators` avisa sobre teste acima de 1,5× a produção, sobre comentário que cita processo e sobre densidade de comentário acima de 1 linha a cada 10 de código.
43
43
 
44
44
  > Task de UI cuja tela tem `### Checklist de tela` no `1-design/mockups.md`: item divergente sem justificativa em `decisions.md` → teto 8 em Contratos; paginação, ordenação ou filtro que o checklist põe no servidor entregue em memória (ou ausente), ou estado vazio/carregando/erro decidido e ausente → teto 6 (herdado de `contracts.md`, "Contrato de tela").
45
45
 
@@ -5,6 +5,7 @@
5
5
  "context7": {
6
6
  "phases": ["proposal", "plan", "implement"],
7
7
  "tools": ["resolve-library-id", "query-docs"],
8
+ "serverNames": ["context7", "plugin_context7_context7"],
8
9
  "detection": "enabledPlugins includes context7 or mcpServers includes context7",
9
10
  "fallback": "WebSearch + WebFetch for library documentation",
10
11
  "usage": "Library documentation lookups, API reference, implementation patterns",
@@ -33,7 +34,8 @@
33
34
  "playwright": {
34
35
  "phases": ["uiux", "implement"],
35
36
  "tools": ["browser_navigate", "browser_snapshot", "browser_take_screenshot", "browser_console_messages", "browser_click", "browser_resize"],
36
- "detection": "mcpServers includes playwright",
37
+ "serverNames": ["playwright", "plugin_playwright_playwright"],
38
+ "detection": "mcpServers includes playwright or enabledPlugins includes playwright",
37
39
  "fallback": "WebFetch for read-only page content, manual testing",
38
40
  "usage": "UI preview, smoke testing, page inspection, responsive testing, screenshot capture",
39
41
  "healthCheck": {
@@ -168,6 +170,7 @@
168
170
  "gemini-image": {
169
171
  "phases": ["uiux", "implement"],
170
172
  "tools": ["generate_image", "edit_image", "continue_editing", "list_images", "get_image_info", "get_configuration_status"],
173
+ "serverNames": ["gemini-image", "gemini-image-mcp"],
171
174
  "detection": "mcpServers includes gemini-image-mcp",
172
175
  "fallback": "Manual image creation, stock photos, or placeholder divs",
173
176
  "usage": "AI image generation for project assets (heroes, illustrations, brand images) using Gemini models",
@@ -285,9 +288,37 @@
285
288
  ],
286
289
  "setupGuide": null
287
290
  }
291
+ },
292
+ "neon": {
293
+ "phases": ["plan", "implement"],
294
+ "tools": ["list_projects", "describe_table_schema", "get_database_tables", "run_sql", "explain_sql_statement", "prepare_database_migration", "complete_database_migration", "compare_database_schema", "create_branch", "list_branches", "get_connection_string"],
295
+ "serverNames": ["neon", "Neon"],
296
+ "detection": "mcpServers includes neon (case-insensitive)",
297
+ "fallback": "SQL via the connection string (psql / dotnet ef) and the neonctl CLI for branches",
298
+ "usage": "Schema inspection, migration dry-run on a throwaway branch (prepare_database_migration → complete_database_migration), query tuning. The server exposes DESTRUCTIVE tools (delete_branch, delete_project, reset_from_parent): never call one without explicit human confirmation",
299
+ "healthCheck": {
300
+ "toolPattern": "neon",
301
+ "testCall": "Call list_projects with limit 1",
302
+ "testParams": { "limit": 1 },
303
+ "successIndicator": "Returns the project list (possibly empty)",
304
+ "failureHint": "Neon MCP not responding. Re-run the OAuth flow: claude mcp add --transport http neon https://mcp.neon.tech/mcp"
305
+ },
306
+ "install": {
307
+ "autoInstall": false,
308
+ "transport": "http",
309
+ "config": {
310
+ "type": "http",
311
+ "url": "https://mcp.neon.tech/mcp"
312
+ },
313
+ "credentials": [],
314
+ "prerequisites": [],
315
+ "stackRelevance": ["neon"],
316
+ "warnings": ["OAuth against your Neon account on first use. The server can delete branches and projects: keep destructive calls behind a human."],
317
+ "setupGuide": "Run: claude mcp add --transport http neon https://mcp.neon.tech/mcp"
318
+ }
288
319
  }
289
320
  },
290
- "_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas) stay out of this matrix on purpose — only universal ones are listed.",
321
+ "_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas, neon) stay out of this matrix on purpose — only universal ones are listed.",
291
322
  "phaseMatrix": {
292
323
  "proposal": ["context7", "graphify"],
293
324
  "uiux": ["playwright", "context7", "stitch", "gemini-image", "seedance"],
@@ -12,7 +12,6 @@ stacks:
12
12
 
13
13
  @.morph/framework/standards/infrastructure/docker/coolify-deploy.md
14
14
  @.morph/framework/standards/infrastructure/docker/local-compose-isolation.md
15
- @.morph/framework/standards/infrastructure/docker/local-compose-isolation.md
16
15
 
17
16
  ## Infrastructure Templates
18
17
 
@@ -192,16 +192,21 @@ Every task in `tasks.json` MUST reference its FR(s) in the `description` field s
192
192
 
193
193
  ## Debugging
194
194
 
195
- When a bug or unexpected behavior shows up mid-task, invoke `superpowers:systematic-debugging`
196
- with the `Skill()` tool **before proposing a fix** — root cause first, never a patch on the
197
- symptom. This is MANDATORY; do NOT skip it.
195
+ When a bug or unexpected behavior shows up mid-task, find the **root cause before proposing a
196
+ fix** — never a patch on the symptom. This is MANDATORY:
197
+
198
+ 1. Reproduce it and read the full error, not the first line.
199
+ 2. For a known .NET/Next.js error, run `/morph-troubleshoot <keywords>` first.
200
+ 3. One hypothesis at a time, each tested by the smallest check that could refute it.
201
+ 4. After three failed fixes, stop and question the design instead of trying a fourth.
202
+ 5. Confirm the fix with the same check that reproduced the bug; add a test only when no existing one covers that behavior.
198
203
 
199
204
  Everything else that a rule like this might list is owned by the flow itself, and duplicating it
200
205
  here would put a second, staler copy in permanent context:
201
206
 
202
207
  | Concern | Where it actually lives |
203
208
  |---------|-------------------------|
204
- | TDD before writing code | The feature's `mandate.md` (TDD is built in) — the resident `.claude/CLAUDE.md` says to prefer `morph-*` over the generic `superpowers:*` equivalents |
209
+ | How many tests to write | The test budget copied into the feature's `mandate.md`: one test per postcondition, same-behavior cases in one table, no test that only pins text |
205
210
  | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e), then the `morph-eval` skill for the 0-10 score |
206
211
  | Parallel dispatch | `morph-spec dag {feature}` decides sequential vs parallel; execution and isolation rules are in `morph-apply` §2/§3b |
207
212
  | Closing the phase / opening the PR | `morph-review` for Gate 3, then `morph-spec finish {feature} --pr\|--merge` |
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
4
4
  version: core
5
5
  when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
@@ -176,6 +176,10 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
176
176
  Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
177
177
  acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
178
178
  dependem uma da outra vão no mesmo turno, em paralelo.
179
+ Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
180
+ `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
181
+ da task. Só o porquê que o código não mostra, em uma linha
182
+ (`architecture-code-comments`).
179
183
  Não modifique spec.md, mandate.md.
180
184
 
181
185
  Contrato do relatório final:
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
4
4
  version: core
5
5
  when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
4
4
  version: core
5
5
  when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
6
6
  user-invokable: false
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
4
4
  version: core
5
5
  when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -4,7 +4,7 @@ description: Guia a execução de cada tarefa de implementação com standard e
4
4
  version: core
5
5
  when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
6
  user-invokable: false
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -78,6 +78,11 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
78
78
  acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
79
79
  dependem uma da outra vão no mesmo turno, em paralelo.
80
80
 
81
+ Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
82
+ `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
83
+ da task. Só o porquê que o código não mostra, em uma linha
84
+ (`architecture-code-comments`).
85
+
81
86
  Contrato do relatório final:
82
87
  1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
83
88
  encerrar — é o retorno autoritativo, não a sua mensagem final (que é
@@ -4,7 +4,7 @@ description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo
4
4
  version: core
5
5
  when-to-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs
@@ -4,7 +4,7 @@ description: Guia a produção dos artefatos de planejamento de uma feature (use
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-plan
@@ -220,8 +220,9 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
220
220
  proibidos: o orçamento por task do passo 5 (um teste por pós-condição + um de regressão por
221
221
  bug, justificativa acima disso, tabela antes de cópia, nenhum teste que só fixa texto);
222
222
  fixture compartilhada antes de helper novo; TDD onde paga (bug: regressão primeiro; lógica
223
- pura), teste depois aceito em UI e integração; comentário só com o porquê que o código não
224
- mostra, nunca história de task/UC/ADR. Nos standards obrigatórios, liste
223
+ pura), teste depois aceito em UI e integração; comentário: o padrão é nenhum (nome, tipo e teste
224
+ explicam), só o porquê que o código não mostra, nunca `///`/JSDoc que repete a assinatura
225
+ nem história de task/UC/ADR. Nos standards obrigatórios, liste
225
226
  `architecture-code-comments` e o standard de teste do stack (seção *Test budget*).
226
227
  - **Baseline é um COMANDO, nunca um número.** O mandate congela no Gate 2 e é lido por
227
228
  implementadores durante dias — todo número cravado nele (`Suíte: 2366 passando`, cobertura,
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-proposal
@@ -4,7 +4,7 @@ description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase review, após todas as tasks de tasks.json estarem com status `done`
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-review
@@ -4,7 +4,7 @@ description: Varre o codebase existente, detecta stack atual, compara com o stac
4
4
  version: core
5
5
  when-to-invoke: ao iniciar uma feature em projeto brownfield (codebase já existente)
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-stack-scan
@@ -4,7 +4,7 @@ description: Localiza um standard específico via busca server-side (morph-spec
4
4
  version: core
5
5
  when-to-invoke: quando precisar consultar um standard específico durante a implementação
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-standards
@@ -4,7 +4,7 @@ description: Conduz a fase opcional de UI/UX — design system, mockups, compone
4
4
  version: core
5
5
  when-to-invoke: ao tomar o ramo uiux (morph-spec advance --design), depois do Gate 1 e antes do morph-plan
6
6
  user-invokable: true
7
- cliVersion: "8.38.0"
7
+ cliVersion: "8.40.0"
8
8
  ---
9
9
 
10
10
  # morph-uiux
@@ -32,11 +32,11 @@ Ao tomar o ramo opcional uiux: feature/bug cuja mudança cria ou altera superfí
32
32
  - **Sistemas, não telas isoladas** — mesmo critério da persona `ui-designer`: componentes reutilizáveis antes de composições de uso único.
33
33
  - **Toda tela sai com o checklist de tela preenchido** (template no passo 3) — a superfície, o volume esperado de dados, paginação, ordenação, filtro, os três estados (vazio, carregando, erro), o comportamento no mobile e abas × página longa. "Não se aplica" vale, **desde que escrito**. É o checklist que faz a lista de 2 000 linhas paginar: o que o design não decide não vira `doneCriteria` (`morph-plan` §5d), e o que não é critério ninguém entrega. Tela de dados segue os standards de `admin-app` (lista/tabela, formulário, feedback, estrutura de página), que a persona cita na superfície `admin-app`.
34
34
 
35
- 3. **Despache `morph-ui-designer`** para o trabalho visual — dispatch é o default aqui (domínio diferente do Orchestrator, MORPH.md §6). `morph-ui-designer` tem `Read/Write/Edit/Glob/Grep` + MCPs `stitch`/`gemini-image`/`playwright`/`context7`, mas **não tem Bash** — não peça build, testes nem `morph-spec` a ele; isso é do orquestrador.
35
+ 3. **Despache `morph-ui-designer`** para o trabalho visual — dispatch é o default aqui (domínio diferente do Orchestrator, MORPH.md §6). `morph-ui-designer` tem o escopo das implementadoras (com Bash) + `Skill` + MCPs `stitch`/`gemini-image`/`playwright`/`context7`/`seedance`/`graphify`. Bash serve para `morph-spec standards --find`, `npx`, screenshot e leitura de `git`; build/test da suíte, `verify` e aprovação de gate continuam do orquestrador (cláusula 3, como nas outras personas).
36
36
 
37
37
  **Persona universal** (`ui-designer.stack = ["*"]` em `agents.json`, mesmo mecanismo de `evaluator`/`scout`): UI/UX importa sempre que há superfície de UI, então o subagent está registrado em **todo** projeto — .NET/Blazor incluído, não só Next.js. **Fallback** (caso raro: instalação anterior a essa mudança, `.claude/agents/morph-ui-designer.md` ainda não regenerado): `general-purpose` colando o campo `persona` (Read em `.morph/framework/agents.json`) no prompt, registrando o fallback no relatório — resolvido rodando `morph-spec setup-infra --reinstall`.
38
38
 
39
- Template do prompt (contrato do relatório em forma curta — copia o padrão de `morph-implement` §4, sem a cláusula de build/isolamento, que não se aplica a um agente sem Bash):
39
+ Template do prompt (contrato do relatório em forma curta — copia o padrão de `morph-implement` §4; a cláusula de build/isolamento vira "sem build/test da suíte", porque o design não entrega código a verificar):
40
40
  ```
41
41
  Produzir os artefatos de UI/UX de [feature] em `.morph/features/{feature}/1-design/`.
42
42
 
@@ -82,8 +82,9 @@ Ao tomar o ramo opcional uiux: feature/bug cuja mudança cria ou altera superfí
82
82
  `1-design/reports/[artefato]-report.md` (ex.: `1-design/reports/design-system-report.md`)
83
83
  ANTES de encerrar — é o retorno autoritativo, não a sua mensagem final (cortesia
84
84
  best-effort, pode não chegar inteira). NÃO chame SendMessage.
85
- 2. Você não tem Bash — não rode `morph-spec`, build nem testes; a aprovação do Gate uiux
86
- e qualquer comando CLI são do orquestrador.
85
+ 2. Bash só para consulta (`morph-spec standards --find`, `npx`, screenshot, `git log/diff`):
86
+ NÃO rode build, testes nem `morph-spec verify`/`approve`/`advance` — a verificação e a
87
+ aprovação do Gate uiux são do orquestrador.
87
88
  3. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão.
88
89
 
89
90
  Cada relatório contém: (1) o que foi feito em 2-3 frases, (2) o artefato produzido,
@@ -2689,8 +2689,8 @@
2689
2689
  "tools": "#mcp-providers-by-phase",
2690
2690
  "setup": "#mcp-availability-detection"
2691
2691
  },
2692
- "digest": "MCP tools extend Claude with external data and actions. Tools are synchronous request-response with typed inputSchema. Resources provide read-only data access. Prompts are reusable templates. Register MCP servers in .claude/settings.json. Prefer @context7 for live library docs. Test tools with MCP Inspector before integrating.",
2693
- "verifiedAgainst": "Claude Code MCP tooling — context7, Playwright; GitHub via `gh` CLI; Neon via `neonctl`.",
2692
+ "digest": "MCP tools extend Claude with external data and actions. Tools are synchronous request-response with typed inputSchema. Resources provide read-only data access. Prompts are reusable templates. Register MCP servers in .claude/settings.json. Prefer @context7 for live library docs. Tool names follow where the server is configured: mcp__context7__query-docs from .mcp.json, mcp__plugin_context7_context7__query-docs from the plugin; a deferred tool loads via ToolSearch. Test tools with MCP Inspector before integrating.",
2693
+ "verifiedAgainst": "Claude Code 2.1.282 MCP tooling — context7, Playwright (as plugin and as a project MCP server); GitHub via `gh` CLI; Neon via its MCP or `neonctl`.",
2694
2694
  "provedBy": []
2695
2695
  },
2696
2696
  {
@@ -2848,7 +2848,7 @@
2848
2848
  "not-worth": "#o-que-não-merece",
2849
2849
  "size": "#tamanho"
2850
2850
  },
2851
- "digest": "Comment only the WHY the code cannot show: an invariant the type does not express, an order that matters, an external quirk (third-party API, library bug with its link), a public API contract. Never process history: task, UC, ADR, FR, Gate, evaluator, spec.md and mockup belong in the commit message and decisions.md. Do not restate the code (a good name replaces the comment), do not describe the world outside the file (it goes stale), and turn claims about behavior into test assertions. Ceiling ~3 lines; longer needs a reason. The verify validators node (code-budget) warns with the count of added comment lines that cite process.",
2851
+ "digest": "Default is NO comment: code explains itself through names, types and tests. Before commenting, rename, extract a function or named constant, encode the state in the type, or write a test; comment only what none of these can express: an invariant the type does not express, an order that matters, an external quirk (third-party API, library bug with its link), or the contract of a package published for consumers outside the repo. Never process history (task, UC, ADR, FR, Gate, evaluator, spec.md, mockup: commit message and decisions.md), never restate the code, no XML doc/JSDoc on application members that repeats the signature, no file headers, section banners, #region, commented-out code or loose TODOs, no claims about behavior (make them test assertions). One line is normal, ~3 is the ceiling; more than one comment line per ten code lines means the names are not doing the work. The verify validators node (code-budget) warns on added comments that cite process and on added comment density.",
2852
2852
  "verifiedAgainst": "C#, TypeScript e JavaScript (convenção de linguagem, sem pacote externo).",
2853
2853
  "provedBy": []
2854
2854
  }
@@ -30,8 +30,7 @@ Preciso que o agente saiba X.
30
30
  Plano por fase (instruções + **allow-list de tools** conforme o estado do funil) **não** é caso de provider. É C# puro, montado antes de criar a requisição:
31
31
 
32
32
  ```csharp
33
- // O CÓDIGO decide o modo; o LLM só classifica. A allow-list de tools é a parte
34
- // que um provider não consegue dar: AIContext.Tools ACRESCENTA tools, não remove.
33
+ // A allow-list não cabe num provider: AIContext.Tools ACRESCENTA tools, não remove.
35
34
  public sealed record OperatorPlan(string Instructions, IReadOnlyList<AITool> Tools);
36
35
 
37
36
  public static OperatorPlan PlanFor(FunnelStage stage) => stage switch
@@ -92,10 +91,8 @@ Use um `AIContextProvider` quando o agente precisa de **contexto dinâmico compu
92
91
 
93
92
  **Método a sobrescrever:**
94
93
 
95
- ```csharp
96
- // ProvideAIContextAsync → chamado ANTES do LLM (before-run hook) — injeta contexto
97
- // StoreAIContextAsync → chamado APÓS o LLM (after-run hook) — persiste estado se necessário
98
- ```
94
+ - `ProvideAIContextAsync` → chamado ANTES do LLM (before-run hook) — injeta contexto
95
+ - `StoreAIContextAsync` → chamado APÓS o LLM (after-run hook) — persiste estado se necessário (opcional)
99
96
 
100
97
  ### A invariante de instância — a mesma de `ai-agents-agent-session`
101
98
 
@@ -122,32 +119,33 @@ Consequência prática: **compaction só faz sentido com histórico local**. Com
122
119
 
123
120
  ## Exemplo C# — context provider que injeta data atual e perfil do tenant
124
121
 
122
+ O bloco tem três partes: o provider, o registro do agente com o provider no DI (`Program.cs`) e o uso
123
+ normal. `ITenantContext` é implementado via `IHttpContextAccessor` ou `AsyncLocal` para resolver o
124
+ tenant em runtime, nunca registrado como instância estática. O contexto volta como instrução
125
+ adicional, não como mensagem do usuário, e `StoreAIContextAsync` fica vazio porque o provider é
126
+ stateless. No uso, o provider é invocado a cada `RunAsync`: o agente já sabe a data, o nome do tenant
127
+ e o idioma, sem código extra no caller.
128
+
125
129
  ```csharp
126
130
  using Microsoft.Agents.AI;
127
131
  using Microsoft.Extensions.AI;
128
132
 
129
- // ── 1. Definir o provider ──
130
133
  public sealed class TenantContextProvider : AIContextProvider
131
134
  {
132
135
  private readonly ITenantService _tenantService;
133
136
  private readonly ITenantContext _tenantContext;
134
137
 
135
- // ITenantContext deve ser implementado via IHttpContextAccessor ou AsyncLocal
136
- // para resolver o tenant atual em runtime — não registre como instância estática.
137
- // O AIAgent é singleton, então o provider também é singleton; o tenant corrente
138
- // é lido de forma ambient (IHttpContextAccessor/AsyncLocal) a cada chamada.
138
+ // Singleton como o AIAgent: o tenant corrente é lido ambient a cada chamada, nunca guardado.
139
139
  public TenantContextProvider(ITenantService tenantService, ITenantContext tenantContext)
140
140
  {
141
141
  _tenantService = tenantService;
142
142
  _tenantContext = tenantContext;
143
143
  }
144
144
 
145
- // Sobrescreva: injetado ANTES de cada chamada ao LLM
146
145
  protected override async ValueTask<AIContext> ProvideAIContextAsync(
147
146
  InvokingContext context,
148
147
  CancellationToken cancellationToken = default)
149
148
  {
150
- // Tenant resolvido via serviço injetado (ambient context, ex: IHttpContextAccessor)
151
149
  var tenantId = _tenantContext.TenantId ?? "unknown";
152
150
  var tenant = await _tenantService.GetTenantAsync(tenantId, cancellationToken);
153
151
 
@@ -159,20 +157,16 @@ public sealed class TenantContextProvider : AIContextProvider
159
157
 
160
158
  return new AIContext
161
159
  {
162
- // Injeta como instrução adicional — não como mensagem do usuário
163
160
  Instructions = instructions,
164
161
  };
165
162
  }
166
163
 
167
- // Sobrescreva (opcional): chamado APÓS o LLM — use para persistir estado derivado da resposta
168
164
  protected override ValueTask StoreAIContextAsync(
169
165
  InvokedContext context,
170
166
  CancellationToken cancellationToken = default)
171
- => ValueTask.CompletedTask; // stateless provider — nada a persistir
167
+ => ValueTask.CompletedTask;
172
168
  }
173
169
 
174
- // ── 2. Registrar o agente com o provider no DI ──
175
- // Program.cs
176
170
  builder.Services.AddSingleton<AIAgent>(sp =>
177
171
  {
178
172
  var registry = sp.GetRequiredService<ModelRegistry>();
@@ -187,19 +181,15 @@ builder.Services.AddSingleton<AIAgent>(sp =>
187
181
  });
188
182
  });
189
183
 
190
- // ── Alternativa: pipeline de chat (compacta/injeta SÓ o request em voo) ──
191
- // using Microsoft.Extensions.AI; // a extensão vive na assembly Microsoft.Agents.AI
192
- // IChatClient enriched = chatClient.AsBuilder()
193
- // .UseAIContextProviders(new TenantContextProvider(tenantSvc, tenantContext))
194
- // .Build();
195
-
196
- // ── 3. Uso normal — provider é invocado automaticamente a cada RunAsync ──
197
184
  AgentSession session = await agent.CreateSessionAsync();
198
185
  AgentResponse response = await agent.RunAsync("Quais são meus benefícios do plano?", session);
199
186
  Console.WriteLine(response.Text);
200
- // O agente já sabe a data, o nome do tenant e o idioma — sem código extra no caller
201
187
  ```
202
188
 
189
+ **Alternativa: pipeline de chat**, que compacta/injeta **só** o request em voo: registre o provider
190
+ com `.UseAIContextProviders(...)` no `ChatClientBuilder` (`chatClient.AsBuilder()`). O `using` é
191
+ `Microsoft.Extensions.AI`, mas a extensão vive na assembly `Microsoft.Agents.AI`.
192
+
203
193
  ---
204
194
 
205
195
  ## Context Provider vs Tools vs RAG
@@ -22,12 +22,11 @@ If neither applies, a plain workflow (or no workflow at all — see `ai-agents-s
22
22
 
23
23
  ## Human-in-the-Loop via `RequestPort`
24
24
 
25
- HITL is modeled with `RequestPort` — a special node in the workflow graph that pauses execution and waits for an external (human) response instead of processing automatically.
25
+ HITL is modeled with `RequestPort` — a special node in the workflow graph that pauses execution and waits for an external (human) response instead of processing automatically. Its two type arguments are the request type the port sends out and the response type it expects back.
26
26
 
27
27
  ```csharp
28
28
  using Microsoft.Agents.AI.Workflows;
29
29
 
30
- // Request type the port sends out, response type it expects back.
31
30
  RequestPort<ApprovalRequest, bool> approvalPort =
32
31
  RequestPort.Create<ApprovalRequest, bool>("RefundApproval");
33
32
 
@@ -47,8 +46,7 @@ await foreach (WorkflowEvent evt in run.WatchStreamAsync())
47
46
  switch (evt)
48
47
  {
49
48
  case RequestInfoEvent requestEvt:
50
- // Surface requestEvt.Request to a human (dashboard, email, Slack, ...).
51
- // This is where execution pauses until an external answer arrives.
49
+ // Execution pauses here until the human's answer arrives (dashboard, email, Slack, ...).
52
50
  bool approved = await GetHumanDecisionAsync(requestEvt.Request);
53
51
  await run.SendResponseAsync(requestEvt.Request.CreateResponse(approved));
54
52
  break;
@@ -77,8 +75,14 @@ O caso do agente único é o que a casa realmente tem (MORPH_OS: billing, envio
77
75
 
78
76
  ### O ciclo, medido em `Microsoft.Extensions.AI` 10.9.0
79
77
 
78
+ Quatro passos: (1) embrulhe a tool — `ApprovalRequiredAIFunction : DelegatingAIFunction`; (2) o run
79
+ **termina** pedindo aprovação — não bloqueia, não espera —, e `ToolApprovalRequestContent.ToolCall` é
80
+ um `ToolCallContent` (medido; **não** é `FunctionCallContent`, que aparece em
81
+ `ToolAutoApprovalRuleContext`); (3) responda **na mesma sessão**, com
82
+ `CreateResponse(bool approved, string? reason)`; (4) **repita** o passo 2 até não restar pendência —
83
+ uma volta pode pedir **outra** tool.
84
+
80
85
  ```csharp
81
- // 1. Embrulhe a tool. ApprovalRequiredAIFunction : DelegatingAIFunction.
82
86
  AIFunction charge = AIFunctionFactory.Create(BillingTools.ChargeCustomer);
83
87
  AITool guarded = new ApprovalRequiredAIFunction(charge);
84
88
 
@@ -88,22 +92,16 @@ AIAgent agent = registry.GetChatClient("text-default")
88
92
  AgentSession session = await agent.CreateSessionAsync();
89
93
  AgentResponse response = await agent.RunAsync("Cobre o cliente 42.", session);
90
94
 
91
- // 2. O run TERMINA pedindo aprovação — não bloqueia, não espera.
92
- // ToolApprovalRequestContent.ToolCall é um ToolCallContent (medido; NÃO é
93
- // FunctionCallContent — este último aparece em ToolAutoApprovalRuleContext).
94
95
  var pending = response.Messages
95
96
  .SelectMany(m => m.Contents)
96
97
  .OfType<ToolApprovalRequestContent>()
97
98
  .ToList();
98
99
 
99
- // 3. Responda NA MESMA SESSÃO. CreateResponse(bool approved, string? reason).
100
100
  if (pending.Count > 0)
101
101
  {
102
102
  var approvals = pending.Select(r => (AIContent)r.CreateResponse(approved: true, reason: "aprovado por lucas@…"));
103
103
  response = await agent.RunAsync(new ChatMessage(ChatRole.User, [.. approvals]), session);
104
104
  }
105
-
106
- // 4. REPITA o passo 2 até não restar pendência. Uma volta pode pedir OUTRA tool.
107
105
  ```
108
106
 
109
107
  **Os quatro pontos que erram na primeira tentativa:**
@@ -157,10 +155,11 @@ Checkpointing is part of the **base, GA** `Microsoft.Agents.AI.Workflows` namesp
157
155
  | `CheckpointManager.CreateJson(new FileSystemJsonCheckpointStore(dir))` | Local disk, survives process restart | Single-instance VPS deployments — no Azure, no preview package |
158
156
  | Custom `ICheckpointStore` implementation | Whatever backend you implement it against | **Recommended for production** — implement against the project's own Neon Postgres table, matching the ownership model already used by `ai-agents-rag-custom-pgvector` |
159
157
 
158
+ Local-disk durability, with no Azure dependency:
159
+
160
160
  ```csharp
161
161
  using Microsoft.Agents.AI.Workflows;
162
162
 
163
- // Local-disk durability — no Azure dependency:
164
163
  var checkpointFolder = Directory.CreateDirectory("./checkpoints");
165
164
  CheckpointManager checkpointManager = CheckpointManager.CreateJson(
166
165
  new FileSystemJsonCheckpointStore(checkpointFolder));
@@ -171,13 +170,12 @@ await foreach (WorkflowEvent evt in run.WatchStreamAsync())
171
170
  if (evt is SuperStepCompletedEvent stepEvt)
172
171
  {
173
172
  CheckpointInfo? checkpoint = stepEvt.CompletionInfo?.Checkpoint;
174
- // Persist checkpoint.CheckpointId alongside the business record
175
- // (e.g. the refund request row) so it can be resumed after a restart.
173
+ // Persist checkpoint.CheckpointId with the business record (e.g. the refund row) to resume after a restart.
176
174
  }
177
175
  }
178
176
  ```
179
177
 
180
- Resuming after a restart — rehydrate into a **new** run instance from the last known checkpoint:
178
+ Resuming after a restart — rehydrate into a **new** run instance from the last known checkpoint. A pending `RequestPort` request is re-emitted as a `RequestInfoEvent`, so the paused approval survives the restart:
181
179
 
182
180
  ```csharp
183
181
  StreamingRun resumedRun = await InProcessExecution.ResumeStreamingAsync(
@@ -185,8 +183,6 @@ StreamingRun resumedRun = await InProcessExecution.ResumeStreamingAsync(
185
183
 
186
184
  await foreach (WorkflowEvent evt in resumedRun.WatchStreamAsync())
187
185
  {
188
- // A pending RequestPort request is re-emitted here as a RequestInfoEvent —
189
- // the paused approval survives the restart.
190
186
  if (evt is RequestInfoEvent requestEvt) { /* re-surface to the human */ }
191
187
  }
192
188
  ```
@@ -211,14 +207,12 @@ internal sealed class RefundAnalyzerExecutor() : Executor("RefundAnalyzer")
211
207
 
212
208
  ### `ICheckpointStore` — Neon/Postgres-backed (recommended production pattern)
213
209
 
214
- Implementing `ICheckpointStore` against the project's own Postgres database keeps checkpoint durability inside the same infrastructure the rest of the project already trusts (see `infrastructure-neon-setup`), instead of introducing a new storage dependency:
210
+ Implementing `ICheckpointStore` against the project's own Postgres database keeps checkpoint durability inside the same infrastructure the rest of the project already trusts (see `infrastructure-neon-setup`), instead of introducing a new storage dependency. The store persists and retrieves checkpoint blobs in a `workflow_checkpoints` table (`workflow_id`, `checkpoint_id`, `payload` jsonb/bytea, `created_at`), implemented per the `ICheckpointStore` contract in the `Microsoft.Agents.AI.Workflows` docs:
215
211
 
216
212
  ```csharp
217
213
  public sealed class PostgresCheckpointStore(NpgsqlDataSource dataSource) : ICheckpointStore
218
214
  {
219
- // Persist/retrieve checkpoint blobs in a workflow_checkpoints table
220
- // (workflow_id, checkpoint_id, payload jsonb/bytea, created_at).
221
- // Implement per the ICheckpointStore contract — see Microsoft.Agents.AI.Workflows docs.
215
+ // ICheckpointStore members over workflow_checkpoints — elided.
222
216
  }
223
217
  ```
224
218