@polymorphism-tech/morph-spec 7.7.3 → 7.8.1

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 (187) hide show
  1. package/README.md +2 -2
  2. package/bin/validate.js +379 -379
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +1 -1
  5. package/docs/QUICKSTART.md +1 -1
  6. package/framework/CLAUDE.md +1 -1
  7. package/framework/MORPH.md +3 -2
  8. package/framework/agents.json +1 -1
  9. package/framework/commands/commit.md +166 -166
  10. package/framework/commands/morph-infra.md +215 -215
  11. package/framework/commands/morph-preflight.md +205 -205
  12. package/framework/commands/morph-troubleshoot.md +124 -124
  13. package/framework/evals/scenarios/dotnet-crud.yaml +1 -1
  14. package/framework/hooks/claude-code/statusline.py +679 -679
  15. package/framework/hooks/claude-code/statusline.sh +11 -11
  16. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  17. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  18. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  19. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  20. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  21. package/framework/hooks/shared/activity-logger.js +160 -160
  22. package/framework/hooks/shared/hook-response.js +45 -45
  23. package/framework/hooks/shared/payload-utils.js +78 -78
  24. package/framework/hooks/shared/stdin-reader.js +26 -26
  25. package/framework/rubrics/backend.json +41 -41
  26. package/framework/rules/ai-agents-standards.md +45 -45
  27. package/framework/rules/dotnet-templates.md +86 -87
  28. package/framework/rules/frontend-standards.md +13 -13
  29. package/framework/rules/infrastructure-standards.md +27 -27
  30. package/framework/rules/neon-standards.md +25 -25
  31. package/framework/rules/nextjs-standards.md +20 -20
  32. package/framework/rules/nextjs-templates.md +40 -40
  33. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  34. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  35. package/framework/skills/core/morph-apply/SKILL.md +1 -1
  36. package/framework/skills/core/morph-brainstorming/SKILL.md +9 -5
  37. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  38. package/framework/skills/core/morph-implement/SKILL.md +1 -1
  39. package/framework/skills/core/morph-plan/SKILL.md +11 -6
  40. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  41. package/framework/skills/core/morph-review/SKILL.md +13 -7
  42. package/framework/skills/core/morph-stack-scan/SKILL.md +5 -5
  43. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  44. package/framework/standards/STANDARDS.json +1 -1
  45. package/framework/standards/ai-agents/agent-session.md +160 -160
  46. package/framework/standards/ai-agents/batching.md +193 -193
  47. package/framework/standards/ai-agents/context-providers.md +188 -188
  48. package/framework/standards/ai-agents/mcp-server.md +250 -250
  49. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  50. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  51. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  52. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  53. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  54. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  55. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  56. package/framework/standards/ai-agents/production.md +275 -275
  57. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  58. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  59. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  60. package/framework/standards/ai-agents/structured-output.md +249 -249
  61. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  62. package/framework/standards/architecture/vertical-slice/vertical-slice.md +34 -35
  63. package/framework/standards/backend/api/validation.md +2 -2
  64. package/framework/standards/backend/dotnet/scrutor.md +1 -3
  65. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +42 -37
  66. package/framework/standards/data/nosql/cache/redis.md +2 -2
  67. package/framework/templates/CLAUDE.md.core.template +1 -1
  68. package/framework/templates/IDE-SNIPPETS.md +262 -262
  69. package/framework/templates/README.md +0 -1
  70. package/framework/templates/REGISTRY.json +0 -21
  71. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  72. package/framework/templates/code/dotnet/abstractions/handler.cs +0 -3
  73. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  74. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  75. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  76. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  77. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  78. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  79. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  80. package/framework/templates/code/dotnet/constants/api-tags.cs +1 -1
  81. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -282
  82. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  83. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  84. package/framework/templates/code/dotnet/feature/handler.cs.hbs +23 -24
  85. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  86. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  87. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  88. package/framework/templates/code/dotnet/jobs/job.cs +15 -15
  89. package/framework/templates/code/dotnet/test.cs +72 -101
  90. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  91. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  92. package/framework/templates/code/typescript/contracts.ts +167 -167
  93. package/framework/templates/docs/clarifications.md +253 -253
  94. package/framework/templates/docs/schema-analysis.md +119 -119
  95. package/framework/templates/docs/ui-components.md +52 -52
  96. package/framework/templates/docs/ui-design-system.md +76 -76
  97. package/framework/templates/docs/ui-flows.md +167 -167
  98. package/framework/templates/docs/ui-mockups.md +98 -98
  99. package/framework/templates/feature/decisions.md +122 -122
  100. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  101. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  102. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  103. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  104. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  105. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  107. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  108. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/integrations/asaas-client.cs +387 -387
  117. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  118. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  119. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  120. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  121. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  122. package/framework/templates/project/validate.js +120 -120
  123. package/framework/templates/state.template.json +17 -17
  124. package/framework/templates/ui/design-system.css +226 -226
  125. package/package.json +1 -1
  126. package/src/commands/dashboard/dashboard.js +53 -53
  127. package/src/commands/index.js +13 -13
  128. package/src/commands/mcp/mcp-setup.js +519 -519
  129. package/src/commands/project/checkpoint.js +209 -209
  130. package/src/commands/project/update.js +7 -4
  131. package/src/core/state/phase-state-machine.js +197 -197
  132. package/src/core/templates/template-renderer.js +477 -477
  133. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  134. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  135. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  136. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  137. package/src/dashboard/app/main.jsx +13 -13
  138. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  139. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  140. package/src/dashboard/app/pages/LiveState.jsx +239 -239
  141. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  142. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  143. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  144. package/src/dashboard/app/pages/Standards.jsx +332 -332
  145. package/src/dashboard/app/styles/index.css +47 -47
  146. package/src/dashboard/index.html +12 -12
  147. package/src/dashboard/package.json +24 -24
  148. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  149. package/src/dashboard/scanner/phases-scanner.js +15 -15
  150. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  151. package/src/dashboard/scanner/rules-scanner.js +37 -37
  152. package/src/dashboard/scanner/skills-scanner.js +43 -43
  153. package/src/dashboard/scanner/squads-scanner.js +13 -13
  154. package/src/dashboard/scanner/standards-scanner.js +26 -26
  155. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  156. package/src/dashboard/vite.config.js +24 -24
  157. package/src/lib/agents/metrics-aggregator.js +56 -56
  158. package/src/lib/agents/metrics-calculator.js +125 -125
  159. package/src/lib/agents/output-collector.js +73 -73
  160. package/src/lib/detectors/claude-config-detector.js +152 -152
  161. package/src/lib/detectors/design-system-detector.js +231 -231
  162. package/src/lib/detectors/index.js +217 -217
  163. package/src/lib/generators/architecture-scanner.js +639 -639
  164. package/src/lib/generators/design-system-generator.js +508 -508
  165. package/src/lib/generators/index.js +13 -13
  166. package/src/lib/generators/settings-generator.js +209 -209
  167. package/src/lib/hooks/hook-executor.js +167 -167
  168. package/src/lib/installers/mcp-installer.js +719 -719
  169. package/src/lib/tasks/task-classifier.js +30 -30
  170. package/src/lib/tasks/task-parser.js +209 -209
  171. package/src/lib/tasks/test-runner.js +81 -81
  172. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  173. package/src/lib/validators/checkpoint-persistence.js +39 -39
  174. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  175. package/src/lib/validators/css/css-validator.js +340 -340
  176. package/src/lib/validators/packages/package-validator.js +347 -347
  177. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  178. package/src/lib/validators/shared/issue-counter.js +14 -14
  179. package/src/lib/validators/validation-runner.js +349 -349
  180. package/src/scripts/setup-infra.js +383 -383
  181. package/src/utils/agent-id-mapper.js +11 -11
  182. package/src/utils/banner.js +52 -43
  183. package/src/utils/claude-settings-manager.js +300 -300
  184. package/src/utils/skills-installer.js +172 -172
  185. package/framework/templates/.idea/morph-templates.xml +0 -92
  186. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  187. package/framework/templates/code/dotnet/backend/repository.cs +0 -141
@@ -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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -27,7 +27,7 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
27
27
  | Frontend | Next.js App Router + Tailwind + Framer Motion + Shadcn |
28
28
  | Jobs async | Hangfire — apenas se a feature requer processamento em background |
29
29
 
30
- **Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions sem result pattern, camada de Service/Manager entre handler e dados, SQL cru sem justificativa. Acesso a dados em VSA é híbrido: `IRepository<T>` + `IUnitOfWork` para CRUD; `DbContext` direto no slice para queries específicas.
30
+ **Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions sem result pattern, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` 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`.
31
31
 
32
32
  ## O que fazer
33
33
 
@@ -82,9 +82,13 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
82
82
 
83
83
  **Decisão de pausa** (regras da tabela do MORPH.md §5): `trust: manual` → pausa sempre; `designSystemDivergence` → pausa; `standardsViolations` não-vazio → pausa; caso contrário → auto-passa (`pause: false`). Monte `reason` com o sinal que disparou.
84
84
 
85
- **Persista a decisão no `feature.json` autoritativo da feature ANTES de apresentar ou auto-aprovar** — grave
86
- `gateDecisions.proposal = { pause, reason, signals, trust, decidedAt: <ISO> }` em `.morph/features/{feature}/feature.json`
87
- (Edit em `.morph/features/**` é permitido pela allowlist). O hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com esta decisão e avisa em divergência. Sem o registro o guard não verifica — não pule.
85
+ **Persista a decisão ANTES de apresentar ou auto-aprovar — via CLI, nunca editando feature.json à mão** (o Edit manual colide com o hook state-sync, que reescreve o arquivo entre o seu Read e o Edit — erro "file modified since read"):
86
+
87
+ ```
88
+ morph-spec gate-decision {feature} proposal --pause false --reason "nenhum sinal de risco" --signals '{"designSystemDivergence":false,"standardsViolations":[]}'
89
+ ```
90
+
91
+ O comando grava `gateDecisions.proposal = { pause, reason, signals, trust, decidedAt }` no `feature.json` autoritativo com timestamp server-side (shape canônico em `.morph/framework/schemas/feature.schema.json`). O hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com esta decisão e avisa em divergência. Sem o registro o guard não verifica — não pule.
88
92
 
89
93
  **Se `pause === true`** (manual mode OU risco detectado em auto), use `AskUserQuestion`:
90
94
 
@@ -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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -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: "7.7.3"
7
+ cliVersion: "7.8.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -4,7 +4,7 @@ description: Guia a produção dos três artefatos de planejamento de uma featur
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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-plan
@@ -34,9 +34,10 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
34
34
  - `Guid.NewGuid()` → usar `Guid.CreateVersion7()`
35
35
  - Classes não-sealed sem justificativa documentada
36
36
  - Exceptions como fluxo de controle → usar result pattern com `result.Match()`
37
- - Camada de Service/Manager entre handler e dados → handler usa `IRepository<T>` ou `DbContext` direto
37
+ - Camada de Service/Manager entre handler e dados → handler usa `ApplicationDbContext` direto no slice
38
+ - Repository genérico (`IRepository<T>`/`IUnitOfWork`) → redundante sobre EF Core: `DbSet<T>` já é repository, `DbContext` já é unit of work
38
39
  - SQL cru (`FromSqlRaw`, `ExecuteQuery(string)`) sem justificativa em `decisions.md` → usar LINQ
39
- - Política de acesso a dados (registre no mandate como orientação, não proibição): `IRepository<T>` + `IUnitOfWork` para CRUD simples; `ApplicationDbContext` injetado direto no slice para queries específicas (joins, projeção, paginação).
40
+ - Política de acesso a dados (registre no mandate): `ApplicationDbContext` injetado direto no slice — para CRUD e para queries específicas (joins, projeção, paginação). Para concorrência ou SQL específico, store dedicado hand-written com justificativa em `decisions.md`.
40
41
  - **Features com agentes de IA (MAF):** se a feature envolve um agente (Microsoft Agent Framework), **use a tool Read** nos standards relevantes de `framework/standards/ai-agents/*.md` (ex.: `setup`, `agent-session`, `middleware-patterns`, `mcp-server`, `mcp-tools`, `multi-agent-patterns`, `production`) — filtre pelo que a feature exige via STANDARDS.json. Esses standards carregam as **convenções de projeto** (single-agent por padrão — Workflows só para fan-in/out real; provider, caching, observability, A2A) que uma fonte externa de docs (ex.: context7) não conhece. Padrão de divisão: **superfície da API** pode vir de docs ao vivo/context7 (mais frescas para um SDK em evolução), mas **as convenções vêm dos standards** — registre ambas no mandate. Não pule os `ai-agents/*.md` só porque o STANDARDS.json index lista que eles existem.
41
42
  - Checklist de done com critérios verificáveis por tarefa.
42
43
 
@@ -84,9 +85,13 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
84
85
 
85
86
  **Decisão de pausa** (regras da tabela do MORPH.md §5): `trust: manual` → pausa sempre; `designSystemDivergence` → pausa; `standardsViolations` não-vazio → pausa; `taskCount > 20` → pausa; caso contrário → auto-passa (`pause: false`).
86
87
 
87
- **Persista a decisão no `feature.json` autoritativo da feature ANTES de apresentar ou auto-aprovar** — grave
88
- `gateDecisions.plan = { pause, reason, signals, trust, decidedAt: <ISO> }` em `.morph/features/{feature}/feature.json`
89
- (Edit em `.morph/features/**` é permitido pela allowlist). Isso deixa o raciocínio de trust auditável no disco: o hook `gate-guard.js` confere depois se a ação tomada (pausar vs auto-aprovar) bateu com esta decisão e avisa em caso de divergência. Sem este registro o guard não tem como verificar — não pule.
88
+ **Persista a decisão ANTES de apresentar ou auto-aprovar — via CLI, nunca editando feature.json à mão** (o Edit manual colide com o hook state-sync, que reescreve o arquivo entre o seu Read e o Edit — erro "file modified since read"):
89
+
90
+ ```
91
+ morph-spec gate-decision {feature} plan --pause false --reason "nenhum sinal de risco" --signals '{"taskCount":12,"standardsViolations":[]}'
92
+ ```
93
+
94
+ O comando grava `gateDecisions.plan = { pause, reason, signals, trust, decidedAt }` no `feature.json` autoritativo com timestamp server-side (shape canônico em `.morph/framework/schemas/feature.schema.json`). Isso deixa o raciocínio de trust auditável no disco: o hook `gate-guard.js` confere depois se a ação tomada (pausar vs auto-aprovar) bateu com esta decisão e avisa em caso de divergência. Sem este registro o guard não tem como verificar — não pule.
90
95
 
91
96
  **Se `pause === true`**, use `AskUserQuestion`:
92
97
 
@@ -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: "7.7.3"
7
+ cliVersion: "7.8.1"
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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-review
@@ -46,14 +46,20 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
46
46
  (architecture 30%, contracts 25%, code-quality 25%, test-coverage 20%)
47
47
  seguindo as bandas 0-10 de cada uma.
48
48
  NÃO reescreva código. NÃO toque em tasks.json, feature.json nem no board
49
- de sessão. Ao concluir, ENTREGUE o relatório final — terminar idle sem
50
- reportar é falha de protocolo.
51
- Retorne: score 0-10 por dimensão, score composto (arch×0.30 + contracts×0.25
52
- + quality×0.25 + tests×0.20), e feedback priorizado (bloqueantes primeiro)
53
- para qualquer dimensão < 9.
49
+ de sessão.
50
+ Protocolo obrigatório — ATO FINAL: antes de encerrar, chame a tool
51
+ SendMessage com to:"main" e o relatório completo no content; sua última
52
+ mensagem em texto NÃO chega ao orquestrador — só SendMessage chega.
53
+ Exemplo literal (última chamada de tool da sua sessão):
54
+ SendMessage({ to: "main", content: "Review de {feature}: arch=9.0
55
+ contracts=9.5 quality=9.0 tests=8.5 → composto 9.05. Feedback: ..." })
56
+ Terminar idle sem SendMessage é falha de protocolo.
57
+ Retorne no content: score 0-10 por dimensão, score composto (arch×0.30 +
58
+ contracts×0.25 + quality×0.25 + tests×0.20), e feedback priorizado
59
+ (bloqueantes primeiro) para qualquer dimensão < 9.
54
60
  ```
55
61
  - **Fallback (tipo não registrado):** se `morph-evaluator` não estiver na sua lista de subagent types, despache `general-purpose` colando o campo `persona` do agente `evaluator` (Read em `.morph/framework/agents.json`) no topo do prompt — e **registre o fallback no review-report** (seção de método).
56
- - Os scores por dimensão e o composto do review-report vêm **desse retorno**, não da sua auto-avaliação. Se o avaliador ficar idle sem reportar, cobre via SendMessage antes de prosseguir.
62
+ - Os scores por dimensão e o composto do review-report vêm **desse retorno**, não da sua auto-avaliação. O hook `subagent-report-guard` bloqueia uma vez o encerramento do avaliador sem SendMessage; se mesmo assim ele ficar idle sem reportar, cobre via SendMessage antes de prosseguir (fallback).
57
63
 
58
64
  5. Produza `review-report.md` em `.morph/features/{feature}/4-review/` com:
59
65
  - Scores por dimensão (arquitetura, contratos, qualidade, cobertura)
@@ -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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-stack-scan
@@ -29,7 +29,7 @@ Quando o projeto já tem código existente e você precisa entender o estado atu
29
29
  | Frontend | Next.js App Router + Tailwind + Framer Motion + Shadcn |
30
30
  | Jobs | Hangfire (apenas quando necessário) |
31
31
 
32
- **Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, SQL cru sem justificativa. Acesso a dados em VSA é híbrido: `IRepository<T>` + `IUnitOfWork` para CRUD; `DbContext` direto no slice para queries específicas.
32
+ **Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` 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`.
33
33
 
34
34
  ## Greenfield short-circuit
35
35
 
@@ -62,7 +62,7 @@ Antes de despachar Explore, verifique se o projeto é greenfield:
62
62
  - Erros: Result pattern (`result.Match()`)
63
63
 
64
64
  ## Padrões proibidos
65
- `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, SQL cru sem justificativa. Acesso a dados em VSA é híbrido: `IRepository<T>` + `IUnitOfWork` para CRUD; `DbContext` direto no slice para queries específicas.
65
+ `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` 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`.
66
66
 
67
67
  ## Recomendação
68
68
  Compliance trivial (greenfield). Prosseguir para morph-brainstorming.
@@ -82,7 +82,7 @@ Antes de despachar Explore, verifique se o projeto é greenfield:
82
82
  BACKEND:
83
83
  - Todos os .csproj: qual TargetFramework? Quais PackageReferences relevantes?
84
84
  - Procure por: Guid.NewGuid() vs Guid.CreateVersion7(), sealed classes, result pattern vs exceptions
85
- - Estrutura de src/: segue feature-folder (VSA)? Tem Controllers? Tem IRepository<T>?
85
+ - Estrutura de src/: segue feature-folder (VSA)? Tem Controllers? Tem repository genérico (IRepository<T>/IUnitOfWork)? Se tiver, reporte como código morto: liste onde está registrado no DI e quantos consumidores reais existem em src/ e tests/
86
86
  - Migrations/: qual ORM? Neon/Postgres ou outro banco?
87
87
  - Microsoft.Agents.* ou Microsoft.Extensions.AI nos PackageReferences?
88
88
 
@@ -102,7 +102,7 @@ Antes de despachar Explore, verifique se o projeto é greenfield:
102
102
  | Severidade | Critério |
103
103
  |------------|---------|
104
104
  | **Bloqueante** | Runtime diferente (.NET 8 ou anterior), ORM diferente (Dapper puro sem EF Core), banco diferente (MySQL, SQL Server) |
105
- | **Alto** | `Guid.NewGuid()` generalizado, camada de Service/Manager entre handler e dados, SQL cru generalizado, exceptions como fluxo de controle |
105
+ | **Alto** | `Guid.NewGuid()` generalizado, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`) presente — código morto: migração é deletar a pasta `Repository/` + as 2 linhas de DI, SQL cru generalizado, exceptions como fluxo de controle |
106
106
  | **Médio** | Classes não-sealed, Pages Router em vez de App Router, biblioteca de UI diferente |
107
107
  | **Baixo** | Versões de pacotes desatualizadas mas compatíveis |
108
108
 
@@ -4,7 +4,7 @@ description: Localiza e carrega um standard específico do STANDARDS.json sob de
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: "7.7.3"
7
+ cliVersion: "7.8.1"
8
8
  ---
9
9
 
10
10
  # morph-standards
@@ -883,7 +883,7 @@
883
883
  "endpoint": "#complete-endpoint-example",
884
884
  "registration": "#programcs-di-registration-order"
885
885
  },
886
- "digest": "Each VSA feature is 5 files: Request, Response, Handler, Validator, Endpoint. Use IHandler<TReq,TRes> (not MediatR). Sealed records for DTOs, primary constructors for DI, Guid.CreateVersion7() for IDs. Handler calls Repository+UnitOfWork directly — no service layer. CancellationToken in every async call."
886
+ "digest": "Each VSA feature is 5 files: Request, Response, Handler, Validator, Endpoint. Use IHandler<TReq,TRes> (not MediatR). Sealed records for DTOs, primary constructors for DI, Guid.CreateVersion7() for IDs. Handler injects ApplicationDbContext directly — no service layer, no generic repository (DbSet<T> is the repository, DbContext is the unit of work). CancellationToken in every async call."
887
887
  },
888
888
  {
889
889
  "id": "backend-integrations-asaas-asaas-api",
@@ -1,160 +1,160 @@
1
- # Agent Session — Conversation state and chat reducers
2
-
3
- > **Scope:** stacks=["dotnet"]
4
- > **Layer:** 2 (on-keyword)
5
- > **Keywords:** agent session, chat history, conversation state, chat reducer, history truncation, AgentThread
6
- > **Read by Claude in:** implement
7
-
8
- **Verified against:** MAF 1.0 GA. Last-verified: 2026-05-19.
9
-
10
- ---
11
-
12
- ## Quando usar AgentSession
13
-
14
- Use `AgentSession` quando o agente é **conversacional** — há uma UI de chat que mantém histórico entre turnos do usuário.
15
-
16
- **Use AgentSession quando:**
17
- - Existe uma interface de chat (web, mobile, CLI interativo)
18
- - O agente precisa lembrar o que foi dito nos turnos anteriores da mesma conversa
19
- - Há perguntas de follow-up ("e agora?", "altere o segundo ponto", "lembra do que disse sobre X?")
20
-
21
- **NÃO use AgentSession quando:**
22
- - O agente é one-shot (gerador, executor, classificador) — recebe uma entrada, devolve uma saída, fim
23
- - Agentes stateless em pipeline multi-agent — cada chamada é independente
24
- - Jobs de batch/background — não há conversa; histórico não faz sentido
25
-
26
- > "Add Memory/Session because agents need state" é um anti-pattern de `sweet-spot.md`.
27
- > Só adicione quando uma UI de chat real existe.
28
-
29
- ---
30
-
31
- ## A API
32
-
33
- **Pacote:** `Microsoft.Agents.AI` (base; já requerido por `ai-agents-setup`).
34
-
35
- **Tipos confirmados via context7:**
36
- - `AgentSession` — container leve de estado de conversa; obtido via `agent.CreateSessionAsync()`
37
- - `AgentThread` — equivalente para agentes persistentes (PersistentAgentsClient); use `agent.GetNewThread()`
38
- - `ChatClientAgentOptions` — aceita `ChatHistoryProvider` e `AIContextProviders`
39
- - `InMemoryChatHistoryProvider` — implementação embutida de histórico em memória
40
- - `AgentResponse` — tipo retornado por `AIAgent.RunAsync` (non-generic); acesse o texto via `.Text`
41
-
42
- ```csharp
43
- // Construção do agente com histórico em memória
44
- AIAgent agent = _modelRegistry.GetChatClient("text-default")
45
- .AsAIAgent(new ChatClientAgentOptions
46
- {
47
- ChatOptions = new() { Instructions = "You are a helpful assistant." },
48
- ChatHistoryProvider = new InMemoryChatHistoryProvider(),
49
- });
50
- ```
51
-
52
- ---
53
-
54
- ## Exemplo C# — agente conversacional com session persistente entre turnos
55
-
56
- ```csharp
57
- using Microsoft.Agents.AI;
58
- using Microsoft.Extensions.AI;
59
-
60
- // ── 1. Registrar o agente conversacional no DI ──
61
- // Program.cs
62
- builder.Services.AddSingleton<AIAgent>(sp =>
63
- {
64
- var registry = sp.GetRequiredService<ModelRegistry>();
65
- return registry.GetChatClient("text-default")
66
- .AsAIAgent(new ChatClientAgentOptions
67
- {
68
- ChatOptions = new() { Instructions = "You are a helpful customer support assistant." },
69
- // InMemoryChatHistoryProvider: histórico vive em memória, por session.
70
- // Seguro registrar como parte do singleton AIAgent: cada AgentSession criada via
71
- // agent.CreateSessionAsync() isola o histórico de sua conversa — conversas distintas
72
- // não compartilham estado. O provider em si é stateless; o estado fica na session.
73
- // Para persistência entre restarts, substitua por um provider customizado (ex: DB).
74
- ChatHistoryProvider = new InMemoryChatHistoryProvider(),
75
- });
76
- });
77
-
78
- // ── 2. Criar uma session por conversa (ex: por conexão SignalR / por request de "start chat") ──
79
- // ChatController.cs ou ChatHub.cs
80
- public class ChatService(AIAgent _agent)
81
- {
82
- // Uma session por conversa ativa — armazene no escopo do usuário (cache, memória da conexão)
83
- public async Task<AgentSession> StartConversationAsync()
84
- => await _agent.CreateSessionAsync();
85
-
86
- // Cada mensagem do usuário passa a mesma session
87
- public async Task<string> SendMessageAsync(AgentSession session, string userMessage)
88
- {
89
- AgentResponse response = await _agent.RunAsync(userMessage, session);
90
- return response.Text;
91
- }
92
- }
93
-
94
- // ── 3. Uso no controller/hub ──
95
- // Primeiro turno
96
- AgentSession session = await chatService.StartConversationAsync();
97
- string reply1 = await chatService.SendMessageAsync(session, "Meu pedido #1234 está atrasado.");
98
- // reply1: "Vou verificar o pedido #1234 para você..."
99
-
100
- // Segundo turno — o agente lembra do contexto anterior
101
- string reply2 = await chatService.SendMessageAsync(session, "E quando foi despachado?");
102
- // reply2: "O pedido #1234 foi despachado em..." ← contexto mantido pela session
103
- ```
104
-
105
- ---
106
-
107
- ## History management
108
-
109
- O histórico cresce a cada turno. Quando estoura o context window do modelo, as chamadas falham ou truncam silenciosamente.
110
-
111
- ### Estratégias
112
-
113
- | Estratégia | Quando usar | Como implementar |
114
- |------------|-------------|------------------|
115
- | **Sliding window** | Conversas longas com contexto recente suficiente | Limitar `InMemoryChatHistoryProvider` a N mensagens mais recentes |
116
- | **Token budget** | Modelos com context window pequeno | Contar tokens acumulados; truncar quando ultrapassa threshold |
117
- | **Summarization** | Histórico precisa de contexto antigo comprimido | Agente periódico que resume N turnos anteriores em uma mensagem única |
118
-
119
- > **Custom history management:** Para o caso comum, `InMemoryChatHistoryProvider` cobre a
120
- > necessidade de histórico em memória por sessão. Se o projeto exigir truncation customizada
121
- > (ex: sliding window limitando a N mensagens mais recentes ou por token budget), o mecanismo
122
- > de extensão correto — seja subclasse de `ChatHistoryProvider`, um `IChatReducer`, ou outro
123
- > ponto de override — deve ser verificado contra a versão instalada de `Microsoft.Agents.AI`.
124
- > Consulte a documentação MAF atual antes de implementar um provider customizado, pois a API
125
- > exata de extensão não foi confirmada na versão GA e pode variar entre releases.
126
-
127
- ---
128
-
129
- ## Anti-patterns
130
-
131
- | Anti-pattern | Problema |
132
- |-------------|----------|
133
- | Adicionar session em agente one-shot (gerador, executor) | Complexidade desnecessária; estado nunca é usado |
134
- | Histórico ilimitado sem truncation | Context window estoura; custo aumenta linearmente com a conversa |
135
- | Compartilhar uma `AgentSession` entre múltiplos usuários | Histórico de um usuário vaza para outro |
136
- | Usar `InMemoryChatHistoryProvider` sem criar uma `AgentSession` por conversa | Sem `AgentSession` por conversa, o histórico é compartilhado entre todos os usuários; a isolation depende de `AgentSession` — sempre crie uma session por conversa via `agent.CreateSessionAsync()` |
137
- | Usar `AgentThread` (PersistentAgentsClient) sem necessidade | `AgentThread` requer hosted agent service; prefira `AgentSession` com direct model |
138
-
139
- ---
140
-
141
- ## Checklist (verifiable by morph-eval)
142
-
143
- - [ ] `AgentSession` usada somente em agentes conversacionais com UI de chat real
144
- - [ ] `InMemoryChatHistoryProvider` (ou equivalente) registrado em `ChatClientAgentOptions`
145
- - [ ] Uma `AgentSession` por conversa/usuário — nunca compartilhada
146
- - [ ] Estratégia de truncation definida (sliding window, token budget ou summarization)
147
- - [ ] Agentes one-shot (gerador, executor, classificador) **não** recebem session
148
-
149
- ---
150
-
151
- ## References
152
-
153
- - `ai-agents-setup` — packages e DI base
154
- - `ai-agents-sweet-spot` — decisão de quando adicionar estado ao agente
155
- - `ai-agents-middleware-patterns` (Onda 2) — pipeline de contexto e middleware
156
- - MAF Conversations docs: https://learn.microsoft.com/en-us/agent-framework/agents/conversations/
157
-
158
- ---
159
-
160
- *MORPH-SPEC by Polymorphism Tech — ai-agents/agent-session.md v1.0 (2026-05-19)*
1
+ # Agent Session — Conversation state and chat reducers
2
+
3
+ > **Scope:** stacks=["dotnet"]
4
+ > **Layer:** 2 (on-keyword)
5
+ > **Keywords:** agent session, chat history, conversation state, chat reducer, history truncation, AgentThread
6
+ > **Read by Claude in:** implement
7
+
8
+ **Verified against:** MAF 1.0 GA. Last-verified: 2026-05-19.
9
+
10
+ ---
11
+
12
+ ## Quando usar AgentSession
13
+
14
+ Use `AgentSession` quando o agente é **conversacional** — há uma UI de chat que mantém histórico entre turnos do usuário.
15
+
16
+ **Use AgentSession quando:**
17
+ - Existe uma interface de chat (web, mobile, CLI interativo)
18
+ - O agente precisa lembrar o que foi dito nos turnos anteriores da mesma conversa
19
+ - Há perguntas de follow-up ("e agora?", "altere o segundo ponto", "lembra do que disse sobre X?")
20
+
21
+ **NÃO use AgentSession quando:**
22
+ - O agente é one-shot (gerador, executor, classificador) — recebe uma entrada, devolve uma saída, fim
23
+ - Agentes stateless em pipeline multi-agent — cada chamada é independente
24
+ - Jobs de batch/background — não há conversa; histórico não faz sentido
25
+
26
+ > "Add Memory/Session because agents need state" é um anti-pattern de `sweet-spot.md`.
27
+ > Só adicione quando uma UI de chat real existe.
28
+
29
+ ---
30
+
31
+ ## A API
32
+
33
+ **Pacote:** `Microsoft.Agents.AI` (base; já requerido por `ai-agents-setup`).
34
+
35
+ **Tipos confirmados via context7:**
36
+ - `AgentSession` — container leve de estado de conversa; obtido via `agent.CreateSessionAsync()`
37
+ - `AgentThread` — equivalente para agentes persistentes (PersistentAgentsClient); use `agent.GetNewThread()`
38
+ - `ChatClientAgentOptions` — aceita `ChatHistoryProvider` e `AIContextProviders`
39
+ - `InMemoryChatHistoryProvider` — implementação embutida de histórico em memória
40
+ - `AgentResponse` — tipo retornado por `AIAgent.RunAsync` (non-generic); acesse o texto via `.Text`
41
+
42
+ ```csharp
43
+ // Construção do agente com histórico em memória
44
+ AIAgent agent = _modelRegistry.GetChatClient("text-default")
45
+ .AsAIAgent(new ChatClientAgentOptions
46
+ {
47
+ ChatOptions = new() { Instructions = "You are a helpful assistant." },
48
+ ChatHistoryProvider = new InMemoryChatHistoryProvider(),
49
+ });
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Exemplo C# — agente conversacional com session persistente entre turnos
55
+
56
+ ```csharp
57
+ using Microsoft.Agents.AI;
58
+ using Microsoft.Extensions.AI;
59
+
60
+ // ── 1. Registrar o agente conversacional no DI ──
61
+ // Program.cs
62
+ builder.Services.AddSingleton<AIAgent>(sp =>
63
+ {
64
+ var registry = sp.GetRequiredService<ModelRegistry>();
65
+ return registry.GetChatClient("text-default")
66
+ .AsAIAgent(new ChatClientAgentOptions
67
+ {
68
+ ChatOptions = new() { Instructions = "You are a helpful customer support assistant." },
69
+ // InMemoryChatHistoryProvider: histórico vive em memória, por session.
70
+ // Seguro registrar como parte do singleton AIAgent: cada AgentSession criada via
71
+ // agent.CreateSessionAsync() isola o histórico de sua conversa — conversas distintas
72
+ // não compartilham estado. O provider em si é stateless; o estado fica na session.
73
+ // Para persistência entre restarts, substitua por um provider customizado (ex: DB).
74
+ ChatHistoryProvider = new InMemoryChatHistoryProvider(),
75
+ });
76
+ });
77
+
78
+ // ── 2. Criar uma session por conversa (ex: por conexão SignalR / por request de "start chat") ──
79
+ // ChatController.cs ou ChatHub.cs
80
+ public class ChatService(AIAgent _agent)
81
+ {
82
+ // Uma session por conversa ativa — armazene no escopo do usuário (cache, memória da conexão)
83
+ public async Task<AgentSession> StartConversationAsync()
84
+ => await _agent.CreateSessionAsync();
85
+
86
+ // Cada mensagem do usuário passa a mesma session
87
+ public async Task<string> SendMessageAsync(AgentSession session, string userMessage)
88
+ {
89
+ AgentResponse response = await _agent.RunAsync(userMessage, session);
90
+ return response.Text;
91
+ }
92
+ }
93
+
94
+ // ── 3. Uso no controller/hub ──
95
+ // Primeiro turno
96
+ AgentSession session = await chatService.StartConversationAsync();
97
+ string reply1 = await chatService.SendMessageAsync(session, "Meu pedido #1234 está atrasado.");
98
+ // reply1: "Vou verificar o pedido #1234 para você..."
99
+
100
+ // Segundo turno — o agente lembra do contexto anterior
101
+ string reply2 = await chatService.SendMessageAsync(session, "E quando foi despachado?");
102
+ // reply2: "O pedido #1234 foi despachado em..." ← contexto mantido pela session
103
+ ```
104
+
105
+ ---
106
+
107
+ ## History management
108
+
109
+ O histórico cresce a cada turno. Quando estoura o context window do modelo, as chamadas falham ou truncam silenciosamente.
110
+
111
+ ### Estratégias
112
+
113
+ | Estratégia | Quando usar | Como implementar |
114
+ |------------|-------------|------------------|
115
+ | **Sliding window** | Conversas longas com contexto recente suficiente | Limitar `InMemoryChatHistoryProvider` a N mensagens mais recentes |
116
+ | **Token budget** | Modelos com context window pequeno | Contar tokens acumulados; truncar quando ultrapassa threshold |
117
+ | **Summarization** | Histórico precisa de contexto antigo comprimido | Agente periódico que resume N turnos anteriores em uma mensagem única |
118
+
119
+ > **Custom history management:** Para o caso comum, `InMemoryChatHistoryProvider` cobre a
120
+ > necessidade de histórico em memória por sessão. Se o projeto exigir truncation customizada
121
+ > (ex: sliding window limitando a N mensagens mais recentes ou por token budget), o mecanismo
122
+ > de extensão correto — seja subclasse de `ChatHistoryProvider`, um `IChatReducer`, ou outro
123
+ > ponto de override — deve ser verificado contra a versão instalada de `Microsoft.Agents.AI`.
124
+ > Consulte a documentação MAF atual antes de implementar um provider customizado, pois a API
125
+ > exata de extensão não foi confirmada na versão GA e pode variar entre releases.
126
+
127
+ ---
128
+
129
+ ## Anti-patterns
130
+
131
+ | Anti-pattern | Problema |
132
+ |-------------|----------|
133
+ | Adicionar session em agente one-shot (gerador, executor) | Complexidade desnecessária; estado nunca é usado |
134
+ | Histórico ilimitado sem truncation | Context window estoura; custo aumenta linearmente com a conversa |
135
+ | Compartilhar uma `AgentSession` entre múltiplos usuários | Histórico de um usuário vaza para outro |
136
+ | Usar `InMemoryChatHistoryProvider` sem criar uma `AgentSession` por conversa | Sem `AgentSession` por conversa, o histórico é compartilhado entre todos os usuários; a isolation depende de `AgentSession` — sempre crie uma session por conversa via `agent.CreateSessionAsync()` |
137
+ | Usar `AgentThread` (PersistentAgentsClient) sem necessidade | `AgentThread` requer hosted agent service; prefira `AgentSession` com direct model |
138
+
139
+ ---
140
+
141
+ ## Checklist (verifiable by morph-eval)
142
+
143
+ - [ ] `AgentSession` usada somente em agentes conversacionais com UI de chat real
144
+ - [ ] `InMemoryChatHistoryProvider` (ou equivalente) registrado em `ChatClientAgentOptions`
145
+ - [ ] Uma `AgentSession` por conversa/usuário — nunca compartilhada
146
+ - [ ] Estratégia de truncation definida (sliding window, token budget ou summarization)
147
+ - [ ] Agentes one-shot (gerador, executor, classificador) **não** recebem session
148
+
149
+ ---
150
+
151
+ ## References
152
+
153
+ - `ai-agents-setup` — packages e DI base
154
+ - `ai-agents-sweet-spot` — decisão de quando adicionar estado ao agente
155
+ - `ai-agents-middleware-patterns` (Onda 2) — pipeline de contexto e middleware
156
+ - MAF Conversations docs: https://learn.microsoft.com/en-us/agent-framework/agents/conversations/
157
+
158
+ ---
159
+
160
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/agent-session.md v1.0 (2026-05-19)*