@polymorphism-tech/morph-spec 7.9.1 → 7.9.3
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/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +5 -5
- package/docs/QUICKSTART.md +4 -4
- package/framework/CLAUDE.md +1 -1
- package/framework/MORPH.md +2 -2
- package/framework/agents.json +4 -2
- package/framework/evals/rubrics/architecture.md +27 -0
- 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 +19 -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/STANDARDS.json +14 -3
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +350 -19
- package/framework/standards/frontend/nextjs/app-router.md +6 -1
- package/framework/standards/frontend/nextjs/data-fetching.md +17 -3
- package/framework/templates/REGISTRY.json +2 -2
- package/framework/templates/integrations/neon-auth-config.cs +144 -11
- package/package.json +1 -1
- package/src/commands/project/doctor.js +1 -1
- package/src/utils/version-checker.js +2 -2
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Spec-driven development framework for multi-stack projects. Turns feature requests into implementation-ready code through structured, AI-orchestrated phases.
|
|
4
4
|
|
|
5
5
|
**Package:** `@polymorphism-tech/morph-spec`
|
|
6
|
-
**Version:** 7.9.
|
|
6
|
+
**Version:** 7.9.3
|
|
7
7
|
**Requires:** Node.js 22+, Claude Code
|
|
8
8
|
|
|
9
9
|
---
|
|
@@ -29,7 +29,7 @@ It integrates natively with Claude Code: skills become slash commands, agents be
|
|
|
29
29
|
Install the CLI globally:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
npm install -g @polymorphism-tech/morph-spec
|
|
32
|
+
npm install -g @polymorphism-tech/morph-spec@latest --prefer-online
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
Then initialize in your project:
|
|
@@ -340,7 +340,7 @@ Windows may block global npm installs without elevated permissions. Options:
|
|
|
340
340
|
mkdir %APPDATA%\npm-global
|
|
341
341
|
npm config set prefix %APPDATA%\npm-global
|
|
342
342
|
:: Add %APPDATA%\npm-global to your PATH
|
|
343
|
-
npm install -g @polymorphism-tech/morph-spec
|
|
343
|
+
npm install -g @polymorphism-tech/morph-spec@latest --prefer-online
|
|
344
344
|
```
|
|
345
345
|
|
|
346
346
|
1. Open a new terminal (the installer adds npm to your PATH automatically)
|
|
@@ -365,4 +365,4 @@ Code generated by morph-spec (contracts, templates, implementation output) belon
|
|
|
365
365
|
|
|
366
366
|
---
|
|
367
367
|
|
|
368
|
-
*morph-spec v7.9.
|
|
368
|
+
*morph-spec v7.9.3 by [Polymorphism Tech](https://polymorphism.tech)*
|
package/claude-plugin.json
CHANGED
package/docs/CHEATSHEET.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Setup
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install -g @polymorphism-tech/morph-spec # install globally
|
|
6
|
+
npm install -g @polymorphism-tech/morph-spec@latest --prefer-online # install/upgrade globally
|
|
7
7
|
morph-spec init # initialize project
|
|
8
8
|
morph-spec init --wizard # interactive wizard
|
|
9
9
|
morph-spec init --force # overwrite existing
|
|
@@ -12,9 +12,9 @@ morph-spec doctor # health check
|
|
|
12
12
|
morph-spec --version
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
> `
|
|
16
|
-
>
|
|
17
|
-
>
|
|
15
|
+
> `--prefer-online` faz parte do comando canônico: sem ele, o cache local do
|
|
16
|
+
> npm segura o packument velho por ~5 min após uma release e o install falha
|
|
17
|
+
> com `ETARGET` (o CDN do registry também leva alguns minutos para propagar).
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
@@ -200,4 +200,4 @@ These files are never edited directly. Use CLI commands or `morph-spec update` i
|
|
|
200
200
|
|
|
201
201
|
---
|
|
202
202
|
|
|
203
|
-
*morph-spec v7.9.
|
|
203
|
+
*morph-spec v7.9.3 by Polymorphism Tech*
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Install
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install -g @polymorphism-tech/morph-spec
|
|
6
|
+
npm install -g @polymorphism-tech/morph-spec@latest --prefer-online
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
> The installer automatically configures your PowerShell PATH on Windows. If `morph-spec` is not found, open a new terminal window.
|
|
@@ -162,8 +162,8 @@ morph-spec state list
|
|
|
162
162
|
When a new version of `@polymorphism-tech/morph-spec` is published:
|
|
163
163
|
|
|
164
164
|
```bash
|
|
165
|
-
# Update the CLI
|
|
166
|
-
npm install -g @polymorphism-tech/morph-spec@latest
|
|
165
|
+
# Update the CLI (--prefer-online bypasses the ~5 min local packument cache)
|
|
166
|
+
npm install -g @polymorphism-tech/morph-spec@latest --prefer-online
|
|
167
167
|
|
|
168
168
|
# Update framework files in your project
|
|
169
169
|
morph-spec update
|
|
@@ -197,4 +197,4 @@ morph-spec doctor
|
|
|
197
197
|
|
|
198
198
|
---
|
|
199
199
|
|
|
200
|
-
*morph-spec v7.9.
|
|
200
|
+
*morph-spec v7.9.3 by Polymorphism Tech*
|
package/framework/CLAUDE.md
CHANGED
|
@@ -25,7 +25,7 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
25
25
|
- Apresentar gates com o template fixo definido em MORPH.md / morph-plan.
|
|
26
26
|
- Registrar decisões não triviais em `decisions.md`.
|
|
27
27
|
- Aplicar `morph-eval` após cada tarefa; silêncio em score ≥ 9 é o sinal correto. Score < 9 dispara o loop de correção autônomo (re-implementa, sem pausa), não escala ao humano entre tarefas. No Gate 3, o score composto da feature vem do **avaliador independente** despachado pela `morph-review` (persona `evaluator`, contexto fresco) — nunca de auto-avaliação de quem implementou.
|
|
28
|
-
- Incluir as 3 cláusulas de protocolo em todo dispatch de sub-agent (**ato final = relatório via `SendMessage` para `main
|
|
28
|
+
- Incluir as 3 cláusulas de protocolo em todo dispatch de sub-agent (**ato final = relatório via `SendMessage` para `main` como a ÚLTIMA tool call, encerrando imediatamente depois — zero texto extra, zero "aguardando confirmação"** — última mensagem em texto não chega ao orquestrador; não tocar tasks.json/feature.json/board; sem build/test da suíte compartilhada em batch paralelo) — templates com exemplo literal em `morph-implement` §4 e `morph-apply` §3b. O hook `subagent-report-guard` bloqueia uma vez o encerramento de subagent despachado sem SendMessage. **Ao consumir o relatório, libere a sessão do sub-agent com `TaskStop`** — não deixe o idle-detector do harness ser o único a encerrá-la.
|
|
29
29
|
|
|
30
30
|
## Slash commands
|
|
31
31
|
|
package/framework/MORPH.md
CHANGED
|
@@ -236,7 +236,7 @@ Inline (sem dispatch) é aceitável para tasks curtas (effort S/M) **dentro do d
|
|
|
236
236
|
- Auto-score 0-10 com justificativa em uma linha
|
|
237
237
|
|
|
238
238
|
**Protocolo obrigatório do sub-agent** (cláusulas que todo prompt de dispatch inclui — ver templates em `morph-implement` §4 e `morph-apply` §3b):
|
|
239
|
-
1. **ATO FINAL: enviar o relatório completo via `SendMessage` para `main`
|
|
239
|
+
1. **ATO FINAL: enviar o relatório completo via `SendMessage` para `main` como a ÚLTIMA tool call do turno, e encerrar IMEDIATAMENTE depois** — a última mensagem em texto NÃO chega ao orquestrador; só SendMessage chega. Zero texto adicional, zero nova tool call, zero "aguardando confirmação" depois do SendMessage: é o encerramento, não um passo intermediário. Terminar idle sem SendMessage, ou continuar agindo depois dele, é **falha de protocolo**: o hook `subagent-report-guard` bloqueia o encerramento uma vez com a instrução, e a cobrança do orquestrador via SendMessage é apenas o fallback (registrada como falha no recap). Os templates trazem o exemplo literal da chamada.
|
|
240
240
|
2. Não tocar em `tasks.json`, `feature.json`, `state.json` nem no board de sessão (TaskCreate/TaskUpdate) — todo estado é gravado exclusivamente pelo orquestrador.
|
|
241
241
|
3. Em batch paralelo, não rodar build/test da suíte compartilhada — a verificação é do orquestrador, uma vez, pós-batch (alternativa: dispatch com `isolation: "worktree"`, e aí o build roda dentro do worktree).
|
|
242
242
|
|
|
@@ -247,7 +247,7 @@ O sub-agent deve ser autossuficiente com o que você passou. Se precisar de mais
|
|
|
247
247
|
- Quando o feedback do sub-agent precisaria ser discutido em tempo real — dispatch é assíncrono.
|
|
248
248
|
- Quando a tarefa envolve mudanças de arquitetura que o Orchestrator precisa validar antes de executar.
|
|
249
249
|
|
|
250
|
-
**Após receber o retorno do sub-agent:** leia o auto-score — ele é **triagem, não aprovação**. Se for < 7, re-despache com o feedback específico (ou corrija inline) antes de avaliar. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (a barra única do §0); integre o resultado ao recap.md e siga para a próxima tarefa.
|
|
250
|
+
**Após receber o retorno do sub-agent:** leia o auto-score — ele é **triagem, não aprovação**. Se for < 7, re-despache com o feedback específico (ou corrija inline) antes de avaliar. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (a barra única do §0); integre o resultado ao recap.md e siga para a próxima tarefa. **Libere a sessão do sub-agent imediatamente ao consumir o relatório** — `TaskStop(task_id: <id/nome retornado pelo dispatch>)`, tratando falha (agente já finalizado sozinho) como não-fatal — não espere o idle-detector do harness fazer isso sozinho minutos depois.
|
|
251
251
|
|
|
252
252
|
> **Anti-padrão a evitar:** implementar múltiplas tasks de domínios diferentes inline, em sequência, na thread principal — "eu já sei o padrão de cada uma". Isso é exatamente o sinal de que o sistema de delegação foi ignorado. Quando uma feature cruza ≥2 domínios, o caminho default é o Orchestrator despachando especialistas, não o Orchestrator virando faz-tudo.
|
|
253
253
|
|
package/framework/agents.json
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"architecture-vertical-slice-vertical-slice",
|
|
20
20
|
"backend-dotnet-result-pattern",
|
|
21
21
|
"backend-dotnet-vsa-handler-patterns",
|
|
22
|
-
"backend-dotnet-fluent-validation-vsa"
|
|
22
|
+
"backend-dotnet-fluent-validation-vsa",
|
|
23
|
+
"backend-integrations-neon-auth-neon-auth"
|
|
23
24
|
],
|
|
24
25
|
"mcp": ["context7"],
|
|
25
26
|
"persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> já é repository, DbContext já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em decisions.md; nunca uma camada de Service/Manager; nunca repository genérico (IRepository<T>/IUnitOfWork). Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros."
|
|
@@ -81,7 +82,8 @@
|
|
|
81
82
|
"frontend-nextjs-components",
|
|
82
83
|
"frontend-nextjs-data-fetching",
|
|
83
84
|
"frontend-nextjs-naming-conventions",
|
|
84
|
-
"frontend-nextjs-state-management"
|
|
85
|
+
"frontend-nextjs-state-management",
|
|
86
|
+
"backend-integrations-neon-auth-neon-auth"
|
|
85
87
|
],
|
|
86
88
|
"mcp": ["context7"],
|
|
87
89
|
"persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido."
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
Avalia se a implementação segue o padrão arquitetural definido no spec.md e mandate.md.
|
|
4
4
|
|
|
5
|
+
## Verificações mecânicas obrigatórias (auto-reprovação se falhar)
|
|
6
|
+
|
|
7
|
+
Estas duas checagens são objetivas — não dependem de julgamento sobre estilo — e cobrem bugs reais que
|
|
8
|
+
já derrubaram uma app em produção (ver `backend/integrations/neon-auth/neon-auth.md` → "Known Failure
|
|
9
|
+
Modes"). Rode ambas sempre que o diff tocar endpoints minimal API ou fetch de dados cross-camada, mesmo
|
|
10
|
+
que o mandate não as mencione explicitamente. Uma violação em qualquer uma delas é bloqueante — não
|
|
11
|
+
"ressalva" — independente do resto do score de arquitetura.
|
|
12
|
+
|
|
13
|
+
1. **DI de todo serviço injetado em endpoint.** Para cada parâmetro de tipo serviço em uma lambda de
|
|
14
|
+
endpoint minimal API (qualquer tipo que não seja `TRequest`, `CancellationToken`, `ClaimsPrincipal`
|
|
15
|
+
ou um primitivo de rota/query), confirme que existe `AddScoped<T>()` / `AddSingleton<T>()` /
|
|
16
|
+
`AddTransient<T>()` correspondente em `Program.cs` (ou registro via assembly-scanning). Um serviço
|
|
17
|
+
não registrado é inferido como `[FromBody]` pelo Minimal API e derruba a app inteira no startup —
|
|
18
|
+
isso é "Score 1-2", não "Score 5-6 com ressalva", porque não é estilo: é a aplicação não subir.
|
|
19
|
+
2. **Nenhum prefixo de rota reusado para dois propósitos.** Se o projeto tem chamadas server-direct ao
|
|
20
|
+
backend E chamadas client-side via proxy same-origin, confirme que existem DUAS constantes
|
|
21
|
+
nomeadas distintas (uma por propósito) e que nenhuma delas aparece do lado errado (grep: arquivos de
|
|
22
|
+
Server Component só importam a constante server-direct; hooks/Client Component só importam a
|
|
23
|
+
constante de proxy). Uma única constante reusada para os dois quebra silenciosamente um dos dois
|
|
24
|
+
caminhos em runtime, sem sinal em build — também bloqueante.
|
|
25
|
+
|
|
5
26
|
## Score 9-10 — Exemplar
|
|
6
27
|
|
|
7
28
|
- Segue o padrão de feature folder rigorosamente: cada feature tem seus próprios handlers, commands/queries, validators e endpoints.
|
|
@@ -36,6 +57,8 @@ Avalia se a implementação segue o padrão arquitetural definido no spec.md e m
|
|
|
36
57
|
- Implementação plana sem estrutura de feature.
|
|
37
58
|
- Dependências circulares ou acoplamento total entre camadas.
|
|
38
59
|
- Requer refatoração antes de qualquer entrega.
|
|
60
|
+
- Qualquer violação das "Verificações mecânicas obrigatórias" acima (DI faltando, prefixo de rota
|
|
61
|
+
reusado) — teto de score 2 independente de quão bem o resto segue o padrão.
|
|
39
62
|
|
|
40
63
|
## Perguntas de avaliação
|
|
41
64
|
|
|
@@ -44,3 +67,7 @@ Avalia se a implementação segue o padrão arquitetural definido no spec.md e m
|
|
|
44
67
|
3. Objetos de domínio importam de infraestrutura (ORM, HTTP, I/O)?
|
|
45
68
|
4. Se remover esta feature, alguma outra quebra?
|
|
46
69
|
5. O padrão arquitetural descrito no spec.md foi seguido?
|
|
70
|
+
6. Todo serviço injetado numa lambda de endpoint minimal API tem `AddScoped`/`AddSingleton`/
|
|
71
|
+
`AddTransient` correspondente em `Program.cs`?
|
|
72
|
+
7. Se o diff tem chamada server-direct ao backend E chamada client-side via proxy para o mesmo
|
|
73
|
+
recurso, elas usam duas constantes de prefixo distintas — nenhuma reusada para o outro propósito?
|
|
@@ -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: "7.9.
|
|
7
|
+
cliVersion: "7.9.3"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# create-umbraco-lp
|
|
@@ -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: "7.9.
|
|
7
|
+
cliVersion: "7.9.3"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# migrate-lp-to-umbraco
|
|
@@ -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.3"
|
|
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.3"
|
|
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.3"
|
|
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.3"
|
|
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.3"
|
|
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.3"
|
|
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.3"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -33,6 +33,15 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
33
33
|
- Se não atendido: registre como "bloqueante" com descrição do gap.
|
|
34
34
|
- Se parcialmente atendido: registre como "pendência" com o que falta.
|
|
35
35
|
|
|
36
|
+
**Verificações mecânicas sempre-rodar** (independente do mandate mencionar ou não — cobrem bugs
|
|
37
|
+
reais já vistos em produção, ver `framework/evals/rubrics/architecture.md` → "Verificações
|
|
38
|
+
mecânicas obrigatórias"), quando o diff tocar endpoints minimal API ou fetch cross-camada:
|
|
39
|
+
- Todo serviço injetado numa lambda de endpoint tem `AddScoped`/`AddSingleton`/`AddTransient`
|
|
40
|
+
correspondente em `Program.cs`. Falha aqui é bloqueante — a app não sobe.
|
|
41
|
+
- Se há chamada server-direct ao backend e chamada client-side via proxy para o mesmo recurso,
|
|
42
|
+
confirme que usam duas constantes de prefixo nomeadas distintas, nenhuma reusada para o
|
|
43
|
+
outro propósito. Falha aqui é bloqueante — quebra silenciosa em runtime, não em build.
|
|
44
|
+
|
|
36
45
|
4. **Despache o avaliador independente** — o score do Gate 3 nunca é auto-atribuído por quem implementou:
|
|
37
46
|
- Rode a suíte de testes do projeto e capture a **saída real** (não um resumo seu).
|
|
38
47
|
- Gere o **diff da implementação** (`git diff` do range da feature, ou a lista de arquivos do recap.md com seus conteúdos atuais).
|
|
@@ -47,19 +56,22 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
47
56
|
seguindo as bandas 0-10 de cada uma.
|
|
48
57
|
NÃO reescreva código. NÃO toque em tasks.json, feature.json nem no board
|
|
49
58
|
de sessão.
|
|
50
|
-
Protocolo obrigatório — ATO FINAL:
|
|
51
|
-
|
|
52
|
-
mensagem em texto NÃO chega ao orquestrador
|
|
53
|
-
|
|
59
|
+
Protocolo obrigatório — ATO FINAL: chame a tool SendMessage com
|
|
60
|
+
to:"main" e o relatório completo no content como a ÚLTIMA tool call
|
|
61
|
+
do seu turno; sua última mensagem em texto NÃO chega ao orquestrador
|
|
62
|
+
— só SendMessage chega. Encerre IMEDIATAMENTE depois: zero texto
|
|
63
|
+
adicional, zero nova tool call, zero "aguardando confirmação".
|
|
64
|
+
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
54
65
|
SendMessage({ to: "main", content: "Review de {feature}: arch=9.0
|
|
55
66
|
contracts=9.5 quality=9.0 tests=8.5 → composto 9.05. Feedback: ..." })
|
|
56
|
-
Terminar idle sem SendMessage
|
|
67
|
+
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
68
|
+
falha de protocolo.
|
|
57
69
|
Retorne no content: score 0-10 por dimensão, score composto (arch×0.30 +
|
|
58
70
|
contracts×0.25 + quality×0.25 + tests×0.20), e feedback priorizado
|
|
59
71
|
(bloqueantes primeiro) para qualquer dimensão < 9.
|
|
60
72
|
```
|
|
61
73
|
- **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).
|
|
74
|
+
- 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
75
|
|
|
64
76
|
5. Produza `review-report.md` em `.morph/features/{feature}/4-review/` com:
|
|
65
77
|
- 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.3"
|
|
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.3"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|
|
@@ -933,15 +933,26 @@
|
|
|
933
933
|
"authentication",
|
|
934
934
|
"OAuth",
|
|
935
935
|
"JWT",
|
|
936
|
-
"session management"
|
|
936
|
+
"session management",
|
|
937
|
+
"trusted origins",
|
|
938
|
+
"EdDSA",
|
|
939
|
+
"Ed25519",
|
|
940
|
+
"BouncyCastle",
|
|
941
|
+
"signature validator",
|
|
942
|
+
"jwks",
|
|
943
|
+
"middleware runtime",
|
|
944
|
+
"api prefix"
|
|
937
945
|
],
|
|
938
946
|
"anchors": {
|
|
939
947
|
"setup": "#installation--setup",
|
|
948
|
+
"onboarding": "#onboarding-checklist--do-this-before-testing-login-mandatory",
|
|
940
949
|
"middleware": "#route-protection-middleware",
|
|
950
|
+
"api-prefix": "#api-prefix-convention--server-direct-vs-client-proxy",
|
|
941
951
|
"dotnet": "#net-backend-integration",
|
|
942
|
-
"rls": "#row-level-security-integration"
|
|
952
|
+
"rls": "#row-level-security-integration",
|
|
953
|
+
"postmortem": "#known-failure-modes-postmortem"
|
|
943
954
|
},
|
|
944
|
-
"digest": "Use @neondatabase/auth SDK for Next.js. Auth data lives in neon_auth schema — no external provider, no webhooks. Server: createNeonAuth() with NEON_AUTH_BASE_URL + NEON_AUTH_COOKIE_SECRET. Client: createAuthClient(). Pages: AuthView component. Protection: auth.middleware(). .NET:
|
|
955
|
+
"digest": "Use @neondatabase/auth SDK for Next.js. Auth data lives in neon_auth schema — no external provider, no webhooks. Server: createNeonAuth() with NEON_AUTH_BASE_URL + NEON_AUTH_COOKIE_SECRET. Client: createAuthClient(). Pages: AuthView component. Protection: auth.middleware() with runtime='nodejs' (Edge times out minting the session cookie). Register every dev/preview origin in trusted_origins before testing login. Two named prefix constants (BACKEND_API_PREFIX / PROXY_API_PREFIX) — never share one between server-direct and client-proxy calls. .NET: tokens are EdDSA/Ed25519 (OKP) — Microsoft.IdentityModel.Tokens can't verify OKP keys and there's no OIDC discovery; fetch+cache the JWKS yourself and verify signatures manually via BouncyCastle.Cryptography + TokenValidationParameters.SignatureValidator (must return Microsoft.IdentityModel.JsonWebTokens.JsonWebToken, not JwtSecurityToken — else IDX10506). NeonAuth:BaseUrl is mandatory in appsettings.Development.json (public value). RLS: auth.user_id() via pg_session_jwt."
|
|
945
956
|
},
|
|
946
957
|
{
|
|
947
958
|
"id": "backend-integrations-hangfire-hangfire-jobs",
|