@polymorphism-tech/morph-spec 7.9.0 → 7.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +6 -2
- package/docs/QUICKSTART.md +4 -4
- package/framework/CLAUDE.md +1 -1
- package/framework/MORPH.md +2 -2
- package/framework/commands/commit.md +166 -166
- package/framework/commands/morph-infra.md +215 -215
- package/framework/commands/morph-preflight.md +205 -205
- package/framework/commands/morph-troubleshoot.md +124 -124
- package/framework/hooks/claude-code/statusline.py +679 -679
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/activity-logger.js +160 -160
- package/framework/hooks/shared/hook-response.js +45 -45
- package/framework/hooks/shared/payload-utils.js +78 -78
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rubrics/backend.json +41 -41
- package/framework/rules/ai-agents-standards.md +45 -45
- package/framework/rules/dotnet-templates.md +86 -86
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +27 -27
- package/framework/rules/neon-standards.md +25 -25
- package/framework/rules/nextjs-standards.md +20 -20
- package/framework/rules/nextjs-templates.md +40 -40
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +13 -8
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-implement/SKILL.md +13 -8
- package/framework/skills/core/morph-plan/SKILL.md +1 -1
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +10 -7
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +275 -275
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +2 -1
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/index.js +13 -13
- package/src/commands/mcp/mcp-setup.js +519 -519
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +1 -1
- package/src/commands/project/update.js +4 -1
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/LiveState.jsx +239 -239
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/hooks-scanner.js +41 -41
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/scanner/standards-scanner.js +26 -26
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/metrics-aggregator.js +56 -56
- package/src/lib/agents/metrics-calculator.js +125 -125
- package/src/lib/agents/output-collector.js +73 -73
- package/src/lib/detectors/claude-config-detector.js +152 -152
- package/src/lib/detectors/design-system-detector.js +231 -231
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +639 -639
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/index.js +13 -13
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-runner.js +81 -81
- package/src/lib/validators/architecture/architecture-validator.js +259 -259
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/packages/package-validator.js +347 -347
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +349 -349
- package/src/scripts/setup-infra.js +385 -385
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/skills-installer.js +174 -174
- package/src/utils/version-checker.js +2 -2
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
|
@@ -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: "7.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
@@ -122,15 +122,20 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
122
122
|
Não modifique spec.md, mandate.md.
|
|
123
123
|
|
|
124
124
|
Protocolo obrigatório:
|
|
125
|
-
1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage:
|
|
126
|
-
|
|
127
|
-
Sua última mensagem em texto NÃO chega
|
|
128
|
-
|
|
129
|
-
|
|
125
|
+
1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage: chame a tool
|
|
126
|
+
SendMessage com to:"main" e o relatório completo no content como a
|
|
127
|
+
ÚLTIMA tool call do seu turno. Sua última mensagem em texto NÃO chega
|
|
128
|
+
ao orquestrador — só SendMessage chega. Encerre IMEDIATAMENTE depois
|
|
129
|
+
da chamada: zero texto adicional, zero nova tool call, zero "aguardando
|
|
130
|
+
confirmação" — o SendMessage É o encerramento, não um passo
|
|
131
|
+
intermediário.
|
|
132
|
+
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
130
133
|
SendMessage({ to: "main", content: "Fluxo backend concluído (T2→T7).
|
|
131
134
|
Sumário: ... Arquivos: src/... Standards: vsa-handler-patterns.
|
|
132
135
|
Auto-score: 9/10" })
|
|
133
|
-
Terminar idle sem SendMessage
|
|
136
|
+
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
137
|
+
falha de protocolo — cada segundo entre o SendMessage e o fim real do
|
|
138
|
+
turno é cauda que o orquestrador espera sem necessidade.
|
|
134
139
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
135
140
|
(TaskCreate/TaskUpdate) — todo estado (status de task, scores, gates) é
|
|
136
141
|
gravado exclusivamente pelo orquestrador.
|
|
@@ -149,7 +154,7 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
149
154
|
|
|
150
155
|
> **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): despache com `isolation: "worktree"` — cada agente trabalha numa working tree própria e o orquestrador integra ao final. Nesse caso a cláusula 3 vira "rode build/test apenas dentro do seu worktree".
|
|
151
156
|
|
|
152
|
-
Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/SubagentStop) bloqueia uma vez o encerramento de um subagent despachado que não chamou SendMessage, com a instrução da cláusula 1 — o ciclo cobrar-esperar deixa de ser o caminho normal. **Fallback: se mesmo assim um agente ficar idle sem entregar o relatório, cobre-o via SendMessage e registre a falha de protocolo no recap.** Depois, sequencialmente:
|
|
157
|
+
Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/SubagentStop) bloqueia uma vez o encerramento de um subagent despachado que não chamou SendMessage, com a instrução da cláusula 1 — o ciclo cobrar-esperar deixa de ser o caminho normal. **Fallback: se mesmo assim um agente ficar idle sem entregar o relatório, cobre-o via SendMessage e registre a falha de protocolo no recap.** Assim que o relatório de um agente chegar (SendMessage como teammate-message), **libere a sessão imediatamente** — chame `TaskStop(task_id: <id/nome do agente retornado pelo dispatch>)` antes de seguir para o próximo agente. Não espere o idle-detector do harness: sem esse `TaskStop`, a sessão fica pendurada minutos até o harness marcá-la idle sozinho e injetar um `idle_notification` vazio de volta nesta sessão. Trate falha do TaskStop (agente já finalizado sozinho) como não-fatal. Depois, sequencialmente:
|
|
153
158
|
- **Rodar a verificação compartilhada uma única vez** (build + suíte de testes do projeto) — os agentes não a rodaram (cláusula 3 do protocolo).
|
|
154
159
|
- Para cada relatório retornado:
|
|
155
160
|
- Aplicar `Skill(morph-eval)`.
|
|
@@ -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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
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: "7.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
@@ -59,15 +59,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
59
59
|
Done quando: [doneCriteria do tasks.json]
|
|
60
60
|
|
|
61
61
|
Protocolo obrigatório:
|
|
62
|
-
1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage:
|
|
63
|
-
|
|
64
|
-
Sua última mensagem em texto NÃO chega
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage: chame a tool
|
|
63
|
+
SendMessage com to:"main" e o relatório completo no content como a
|
|
64
|
+
ÚLTIMA tool call do seu turno. Sua última mensagem em texto NÃO chega
|
|
65
|
+
ao orquestrador — só SendMessage chega. Encerre IMEDIATAMENTE depois
|
|
66
|
+
da chamada: zero texto adicional, zero nova tool call, zero "aguardando
|
|
67
|
+
confirmação" — o SendMessage É o encerramento, não um passo
|
|
68
|
+
intermediário antes de um encerramento "de verdade".
|
|
69
|
+
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
67
70
|
SendMessage({ to: "main", content: "T{N} concluída. (1) O que foi feito:
|
|
68
71
|
handler + validator do slice X. (2) Arquivos: src/Features/X/Handler.cs,
|
|
69
72
|
tests/X/HandlerTests.cs. (3) Problemas: nenhum. (4) Auto-score: 9/10" })
|
|
70
|
-
Terminar idle sem SendMessage
|
|
73
|
+
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
74
|
+
falha de protocolo — cada segundo entre o SendMessage e o fim real do
|
|
75
|
+
turno é cauda que o orquestrador espera sem necessidade.
|
|
71
76
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
72
77
|
(TaskCreate/TaskUpdate) — todo estado é gravado exclusivamente pelo
|
|
73
78
|
orquestrador.
|
|
@@ -78,7 +83,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
78
83
|
(2) arquivos modificados, (3) problemas encontrados e como foram resolvidos,
|
|
79
84
|
(4) auto-score 0-10.
|
|
80
85
|
```
|
|
81
|
-
Após receber o retorno: o auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (barra única do MORPH.md §0). Integre o relatório ao recap.md e vá para o passo 7.
|
|
86
|
+
Após receber o retorno: o auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (barra única do MORPH.md §0). **Libere a sessão do sub-agent imediatamente após consumir o relatório** — chame `TaskStop(task_id: <id/nome retornado pelo dispatch>)`. Isso evita que o idle-detector do harness dispare minutos depois e injete um `idle_notification` como teammate-message vazio na sua sessão; trate falha do TaskStop (agente já finalizado sozinho) como não-fatal. Integre o relatório ao recap.md e vá para o passo 7.
|
|
82
87
|
|
|
83
88
|
**Se não — siga para o passo 5.**
|
|
84
89
|
|
|
@@ -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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -47,19 +47,22 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
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
49
|
de sessão.
|
|
50
|
-
Protocolo obrigatório — ATO FINAL:
|
|
51
|
-
|
|
52
|
-
mensagem em texto NÃO chega ao orquestrador
|
|
53
|
-
|
|
50
|
+
Protocolo obrigatório — ATO FINAL: chame a tool SendMessage com
|
|
51
|
+
to:"main" e o relatório completo no content como a ÚLTIMA tool call
|
|
52
|
+
do seu turno; sua última mensagem em texto NÃO chega ao orquestrador
|
|
53
|
+
— só SendMessage chega. Encerre IMEDIATAMENTE depois: zero texto
|
|
54
|
+
adicional, zero nova tool call, zero "aguardando confirmação".
|
|
55
|
+
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
54
56
|
SendMessage({ to: "main", content: "Review de {feature}: arch=9.0
|
|
55
57
|
contracts=9.5 quality=9.0 tests=8.5 → composto 9.05. Feedback: ..." })
|
|
56
|
-
Terminar idle sem SendMessage
|
|
58
|
+
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
59
|
+
falha de protocolo.
|
|
57
60
|
Retorne no content: score 0-10 por dimensão, score composto (arch×0.30 +
|
|
58
61
|
contracts×0.25 + quality×0.25 + tests×0.20), e feedback priorizado
|
|
59
62
|
(bloqueantes primeiro) para qualquer dimensão < 9.
|
|
60
63
|
```
|
|
61
64
|
- **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).
|
|
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).
|
|
65
|
+
- 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). **Assim que o relatório chegar, libere a sessão do avaliador** — `TaskStop(task_id: <id/nome retornado pelo dispatch>)` — para não deixá-lo pendurado até o idle-detector do harness disparar um `idle_notification` de volta a esta sessão.
|
|
63
66
|
|
|
64
67
|
5. Produza `review-report.md` em `.morph/features/{feature}/4-review/` com:
|
|
65
68
|
- 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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-stack-scan
|
|
@@ -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.9.
|
|
7
|
+
cliVersion: "7.9.2"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|
|
@@ -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)*
|