@polymorphism-tech/morph-spec 8.44.0 → 8.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CLAUDE.md +10 -9
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +10 -10
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/statusline.sh +11 -11
  24. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  25. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  26. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  27. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  28. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  29. package/framework/hooks/shared/build-check.js +1 -1
  30. package/framework/hooks/shared/comment-scanner.js +1 -1
  31. package/framework/hooks/shared/phase-utils.js +0 -5
  32. package/framework/hooks/shared/stdin-reader.js +26 -26
  33. package/framework/phases.json +4 -6
  34. package/framework/rubrics/backend.json +1 -1
  35. package/framework/rubrics/default.json +1 -1
  36. package/framework/rubrics/frontend.json +1 -1
  37. package/framework/rules/morph-workflow.md +6 -6
  38. package/framework/schemas/feature.schema.json +2 -28
  39. package/framework/schemas/tasks.schema.json +6 -2
  40. package/framework/skills/README.md +1 -2
  41. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  42. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  43. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  44. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  45. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  46. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  47. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  48. package/framework/skills/core/morph-media/SKILL.md +1 -1
  49. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  50. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  51. package/framework/skills/core/morph-review/SKILL.md +109 -430
  52. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  53. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  54. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  55. package/framework/standards/STANDARDS.json +10 -10
  56. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  57. package/framework/standards/ai-agents/agent-session.md +1 -1
  58. package/framework/standards/ai-agents/agent-spec.md +1 -1
  59. package/framework/standards/ai-agents/batching.md +1 -1
  60. package/framework/standards/ai-agents/context-providers.md +1 -1
  61. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  62. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  63. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  64. package/framework/standards/ai-agents/guardrails.md +1 -1
  65. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  66. package/framework/standards/ai-agents/mcp-server.md +1 -1
  67. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  68. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  69. package/framework/standards/ai-agents/media-video.md +1 -1
  70. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  71. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  72. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  73. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  74. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  75. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  76. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  77. package/framework/standards/ai-agents/production.md +2 -2
  78. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  79. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  80. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  81. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  82. package/framework/standards/ai-agents/setup.md +1 -1
  83. package/framework/standards/ai-agents/structured-output.md +1 -1
  84. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  85. package/framework/standards/ai-agents/testing-ai.md +1 -1
  86. package/framework/standards/ai-agents/tool-adapters.md +1 -1
  87. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  88. package/framework/standards/ai-agents/workflows.md +1 -1
  89. package/framework/templates/CLAUDE.md.core.template +1 -1
  90. package/framework/templates/IDE-SNIPPETS.md +262 -262
  91. package/framework/templates/README.md +1 -1
  92. package/framework/templates/REGISTRY.json +0 -81
  93. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  94. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  95. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  96. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  97. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  98. package/framework/templates/docs/spec.md +19 -205
  99. package/framework/templates/docs/ui-components.md +52 -52
  100. package/framework/templates/docs/ui-design-system.md +76 -76
  101. package/framework/templates/docs/ui-flows.md +167 -167
  102. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  103. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  104. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  105. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  106. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  107. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  108. package/framework/templates/infrastructure/github/README.md +56 -56
  109. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  110. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  111. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  112. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  113. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  114. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  115. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  116. package/framework/templates/state.template.json +17 -17
  117. package/framework/templates/ui/design-system.css +226 -226
  118. package/package.json +2 -2
  119. package/src/commands/e2e/e2e.js +1 -1
  120. package/src/commands/project/heavy.js +1 -1
  121. package/src/commands/project/status.js +3 -3
  122. package/src/commands/state/approve.js +7 -49
  123. package/src/commands/state/gate-check.js +16 -106
  124. package/src/commands/state/gate-decision.js +1 -1
  125. package/src/commands/state/report-check.js +42 -17
  126. package/src/commands/validation/mutate.js +1 -1
  127. package/src/commands/validation/scout-check.js +28 -0
  128. package/src/commands/validation/validate-feature.js +5 -32
  129. package/src/commands/validation/verify.js +3 -4
  130. package/src/core/paths/output-schema.js +0 -2
  131. package/src/core/state/state-manager.js +1 -2
  132. package/src/core/templates/template-renderer.js +477 -477
  133. package/src/dashboard/app/lib/format.js +5 -0
  134. package/src/dashboard/app/main.jsx +13 -13
  135. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  136. package/src/dashboard/app/pages/Features.jsx +7 -7
  137. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  138. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  139. package/src/dashboard/scanner/docs-scanner.js +1 -2
  140. package/src/dashboard/scanner/features-scanner.js +3 -4
  141. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  142. package/src/dashboard/vite.config.js +24 -24
  143. package/src/lib/agents/output-collector.js +0 -1
  144. package/src/lib/detectors/design-system-detector.js +188 -188
  145. package/src/lib/evaluator-report.js +52 -334
  146. package/src/lib/generators/design-system-generator.js +508 -508
  147. package/src/lib/generators/handoff-generator.js +4 -5
  148. package/src/lib/installers/memory-installer.js +2 -2
  149. package/src/lib/mutation/manifest.js +8 -2
  150. package/src/lib/mutation/report.js +5 -3
  151. package/src/lib/mutation/runner.js +9 -7
  152. package/src/lib/risk-detector.js +60 -122
  153. package/src/lib/scout/scout-check.js +293 -0
  154. package/src/lib/tasks/task-classifier.js +30 -30
  155. package/src/lib/tasks/task-parser.js +209 -209
  156. package/src/lib/tasks/tasks-json-parser.js +7 -5
  157. package/src/lib/tasks/test-nodes.js +1 -1
  158. package/src/lib/tasks/test-runner.js +1 -1
  159. package/src/lib/validators/css/css-validator.js +340 -340
  160. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  161. package/src/lib/validators/verify-runner.js +1 -1
  162. package/src/scripts/setup-infra.js +1 -1
  163. package/src/utils/agent-id-mapper.js +11 -11
  164. package/src/utils/agents-installer.js +5 -9
  165. package/src/utils/claude-settings-manager.js +300 -300
  166. package/src/utils/hooks-installer.js +3 -10
  167. package/src/utils/skills-installer.js +1 -1
  168. package/framework/evals/proof-rubrics/README.md +0 -76
  169. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  170. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  171. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  172. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  173. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  174. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  175. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  176. package/framework/evals/rubrics/README.md +0 -45
  177. package/framework/evals/rubrics/architecture.md +0 -103
  178. package/framework/evals/rubrics/code-quality.md +0 -98
  179. package/framework/evals/rubrics/condensed.md +0 -57
  180. package/framework/evals/rubrics/contracts.md +0 -67
  181. package/framework/evals/rubrics/test-coverage.md +0 -99
  182. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  183. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  184. package/framework/evals/suites/standard.yaml +0 -5
  185. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  186. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  187. package/framework/templates/.idea/morph-templates.xml +0 -92
  188. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  189. package/framework/templates/docs/clarifications.md +0 -253
  190. package/framework/templates/docs/onboarding.md +0 -122
  191. package/framework/templates/docs/schema-analysis.md +0 -119
  192. package/framework/templates/docs/user-stories.md +0 -34
  193. package/src/commands/state/score.js +0 -147
@@ -1,48 +0,0 @@
1
- # Prova: Verde Não É Coberto
2
-
3
- > Escopo: Gate 3 (avaliador independente). Não é dimensão do score composto — impõe **teto** em
4
- > Cobertura de Testes (`evals/rubrics/test-coverage.md`, seção "Tetos de prova").
5
-
6
- ## O que esta prova responde
7
-
8
- Um teste que **nasce verde** nunca teve fase RED: ele afirma uma pós-condição que o backend já
9
- garantia antes da mudança. Ele não está errado — está **vazio**. E é indistinguível, no relatório de
10
- execução, de um teste que protege alguma coisa.
11
-
12
- A pergunta é: **qual asserção deste teste teria falhado ANTES da mudança?** Se nenhuma, o teste
13
- documenta, não cobre — e isso precisa estar **declarado**, não escondido no verde.
14
-
15
- ## Bandas 0-10
16
-
17
- | 0-3 | 4-6 | 7-8 | 9-10 |
18
- |---|---|---|---|
19
- | Testes novos apresentados como cobertura sem que nenhum tenha tido fase RED. Pré-condições afirmadas em prosa/comentário, nunca medidas | Alguns testes nascem verdes e isso não é declarado. `DoesNotContain` de um item só, deixando os irmãos abertos | O relatório reconhece pelo enunciado quais testes nascem verdes e os declara. Falta a asserção positiva no campo novo ao lado do `DoesNotContain` | Cada teste que nasce verde está declarado como tal, com o motivo. Pré-condições medidas (`Assert.NotNull`), listas EXATAS em vez de negativas pontuais, e mudança de semântica coberta pelo par positivo+negativo |
20
-
21
- ## Anti-padrões literais
22
-
23
- - **Pós-condição que o backend já garante apresentada como cobertura nova** — a fase RED não
24
- aconteceu. Reconheça pelo ENUNCIADO ("o campo X nunca vem nulo" num campo `NOT NULL` desde a
25
- migração) e **declare no relatório**. (memória: pós-condição verde-de-nascença numa feature cujo
26
- contrato já a garantia no schema)
27
- - **Comentário que afirma um fato em vez de asserção** — `// aqui o id já existe` não falha nunca.
28
- Comentário que afirma fato vira asserção **ou some**.
29
- - **`DoesNotContain` de UM item** — provar que "banana" sumiu deixa "maçã" e "pera" livres. Quando o
30
- contrato é "só isto e nada mais", asserte a **lista exata**.
31
- - **Pré-condição afirmada em prosa** — "o registro existe neste ponto" precisa ser
32
- `Assert.NotNull(x)`. Sem isso, um teste que passa por vacuidade (coleção vazia, nulo silencioso)
33
- se lê como verde legítimo.
34
- - **Mudar semântica e asserir só o lado novo** — ao trocar o texto/o campo, o par é obrigatório:
35
- asserção **positiva** no campo novo **e** `DoesNotContain` do texto substituído. Sem o negativo, o
36
- teste passa com os dois presentes.
37
-
38
- ## Como registrar no relatório
39
-
40
- Na seção de análise de cobertura, uma linha por teste que nasce verde:
41
-
42
- ```markdown
43
- - `test/x.test.js:41` — nasce VERDE: a pós-condição P3 já era garantida pelo `NOT NULL` da coluna
44
- desde a migração 0007. Documenta, não cobre. Não conta para a faixa 9-10 de Cobertura.
45
- ```
46
-
47
- E no `**Proof-Scores:**`, a chave `verde`. Um relatório que não distingue "cobre" de "documenta"
48
- não pode passar de 8 nesta prova, por mais testes que tenha.
@@ -1,45 +0,0 @@
1
- # Sistema de Avaliação Graduada — morph-spec NLH
2
-
3
- ## Como funciona
4
-
5
- A skill `morph-eval` avalia o output de uma tarefa ou fase usando 4 dimensões.
6
- Cada dimensão tem uma rubrica própria. O score final é ponderado.
7
-
8
- | Dimensão | Peso | Arquivo |
9
- |---------------------|------|----------------------|
10
- | Arquitetura | 30% | architecture.md |
11
- | Contratos | 25% | contracts.md |
12
- | Qualidade de código | 25% | code-quality.md |
13
- | Cobertura de testes | 20% | test-coverage.md |
14
-
15
- ## Escala de scores
16
-
17
- | Score | Ação |
18
- |-------|--------------------------------------------------------------------------------------------|
19
- | 9-10 | Aprovado — sem output no contexto, siga para próxima tarefa |
20
- | < 9 | Feedback priorizado — alimenta o loop de correção autônomo do morph-apply (re-implementa, sem pausa humana, até 3 tentativas) |
21
-
22
- A barra de aprovação por tarefa é **9**. Abaixo disso o modelo corrige sozinho — não escala ao humano entre tarefas. A escalada humana só acontece quando o loop de correção esgota 3 tentativas sem atingir 9 (ver morph-apply/SKILL.md §3a e MORPH.md §0).
23
-
24
- ## Como calcular o score composto
25
-
26
- ```
27
- score = (arquitetura × 0.30) + (contratos × 0.25) + (qualidade × 0.25) + (testes × 0.20)
28
- ```
29
-
30
- Arredonde para uma casa decimal.
31
-
32
- ## Formato de output quando score < 9
33
-
34
- Produza exatamente este bloco (não mais, não menos):
35
-
36
- ```
37
- Score: [X.X/10]
38
- Arquitetura: X | Contratos: X | Qualidade: X | Testes: X
39
- Issues (ordenados por impacto):
40
- - [descrição do problema mais impactante]
41
- - [próximo problema]
42
- Ação: [feedback priorizado — alimenta o loop de correção | escalar (só após 3 tentativas)]
43
- ```
44
-
45
- Quando score ≥ 9: nenhum output. O silêncio é o sinal de aprovação.
@@ -1,103 +0,0 @@
1
- # Rubrica: Arquitetura (Peso 30%)
2
-
3
- Avalia se a implementação segue o padrão arquitetural definido no spec.md e mandate.md.
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
-
26
- ## Score 9-10 — Exemplar
27
-
28
- - Segue o padrão de feature folder rigorosamente: cada feature tem seus próprios handlers, commands/queries, validators e endpoints.
29
- - Zero dependências diretas entre features — comunicação cross-feature via interface, evento ou shared kernel explícito.
30
- - Domain logic completamente isolado de infraestrutura: nenhum import de ORM, HTTP client ou I/O direto em objetos de domínio.
31
- - Inversão de dependência aplicada onde a arquitetura exige.
32
-
33
- ## Score 7-8 — Bom
34
-
35
- - Segue o padrão com desvios menores e justificados.
36
- - Dependências cross-feature existem mas são poucas, documentadas e via abstração.
37
- - Pequenas impurezas de infraestrutura em domain que não afetam testabilidade.
38
- - Estrutura de pastas correta, responsabilidades bem definidas.
39
-
40
- ## Score 5-6 — Aceitável com ressalvas
41
-
42
- - Estrutura de pastas correta mas responsabilidades começam a se misturar.
43
- - Dependências cross-feature sem justificativa clara.
44
- - Domain logic com acoplamento a infraestrutura que dificulta testes unitários.
45
- - Padrão seguido na maior parte, mas com violações perceptíveis.
46
-
47
- ## Score 3-4 — Problemático
48
-
49
- - Desvios significativos do padrão definido no spec.md.
50
- - Múltiplas violações de separação de responsabilidades.
51
- - Feature não isolada — mudanças nela provavelmente afetam outras.
52
- - Difícil de testar sem mocks de infraestrutura.
53
-
54
- ## Score 1-2 — Reprovado
55
-
56
- - Ignora completamente a arquitetura definida.
57
- - Implementação plana sem estrutura de feature.
58
- - Dependências circulares ou acoplamento total entre camadas.
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.
62
-
63
- ## Perguntas de avaliação
64
-
65
- 1. Os arquivos estão nas pastas corretas da feature conforme o padrão do projeto?
66
- 2. Há imports diretos entre features sem passar por abstração?
67
- 3. Objetos de domínio importam de infraestrutura (ORM, HTTP, I/O)?
68
- 4. Se remover esta feature, alguma outra quebra?
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?
74
-
75
- ## Tetos de prova de mídia (Gate 3)
76
-
77
- Quando — e **somente** quando — a feature gera mídia (alguma task de `tasks.json` cita, em
78
- `standards[]`, um dos três standards de mídia de `ai-agents/`), o avaliador independente também
79
- aplica `.morph/framework/evals/proof-rubrics/media-claims.md` e grava ` media={n}` na linha
80
- `**Proof-Scores:**`.
81
-
82
- Ela **não** é uma quinta dimensão do composto — nenhum peso muda por causa dela. Ela entra aqui,
83
- como teto sobre esta dimensão, pelo mesmo mecanismo do teto de prova em Cobertura.
84
-
85
- **Por que aqui e não em Cobertura:** as quatro afirmações que ela cobra — custo, revisão humana,
86
- marcação, hot path não bloqueado — são **propriedades estruturais**: onde a chamada mora, que
87
- estados existem, o que é persistido, o que é publicado. Uma feature que gera mídia dentro do turno
88
- de conversa está arquiteturalmente errada, não mal testada. E há uma consequência técnica: o `min`
89
- que limita Cobertura é calculado sobre a lista explícita das quatro provas de evidência, com `media`
90
- **fora** dela — senão um `media=4` derrubaria o teto de teste por um motivo que não tem nada a ver
91
- com teste.
92
-
93
- | Proof-Score de media | teto nesta dimensão |
94
- |---|---|
95
- | 9 a 10 | sem teto |
96
- | 7 a 8 | 8 |
97
- | 4 a 6 | 6 |
98
- | 0 a 3 | 3, e o item entra como **bloqueante** listado no relatório |
99
-
100
- Sem a chave `media`, não há teto a aplicar. Mas a ausência da seção `## Mídia gerada` num relatório
101
- de feature que gera mídia **pausa o Gate 3** por conta própria (`src/lib/risk-detector.js`), antes
102
- de qualquer discussão de nota. Feature que não gera mídia é isenta automaticamente — a chave não
103
- aparece e o sinal é falso.
@@ -1,98 +0,0 @@
1
- # Rubrica: Qualidade de Código (Peso 25%)
2
-
3
- Avalia naming, ausência de code smells e aderência aos padrões do stack do projeto.
4
-
5
- ## Score 9-10 — Exemplar
6
-
7
- - Nomes de variáveis, funções e classes comunicam intenção sem precisar de comentários.
8
- - Funções com responsabilidade única: cada função faz uma coisa e tem no máximo 20-25 linhas.
9
- - Classes com responsabilidade única: coesas, sem mistura de concerns.
10
- - Zero duplicação óbvia — lógica repetida foi extraída.
11
- - **Nada do que foi criado aqui já existia no projeto**: os conceitos novos batem com o veredito do `reuse-map.md`, e cada `CRIAR` tem justificativa que se sustenta.
12
- - Segue os padrões do stack conforme os standards do projeto (ex: Result pattern para .NET, hooks pattern para React).
13
- - Sem "dead code" — sem variáveis não usadas, sem blocos comentados, sem imports desnecessários.
14
- - Quase nenhum comentário: nome, tipo e teste explicam o código. O que sobra é só o porquê que o código não mostra (`architecture-code-comments`), sem `///`/JSDoc que repete a assinatura, banner de seção nem história de task, UC, ADR, Gate ou avaliador.
15
-
16
- ## Score 7-8 — Bom
17
-
18
- - Nomes claros na maioria dos casos, com raras abreviações não óbvias.
19
- - Funções e classes bem dimensionadas com poucos casos acima do ideal.
20
- - Duplicação mínima e pontual.
21
- - No máximo um conceito recriado que já existia no codebase, com impacto pequeno e localizado.
22
- - Segue padrões do stack com desvios isolados e justificáveis.
23
- - Sem dead code significativo.
24
- - Um ou outro comentário que repete o código ou doc-comment dispensável; nenhum narra o processo.
25
-
26
- ## Score 5-6 — Aceitável com ressalvas
27
-
28
- - Alguns nomes genéricos ou pouco descritivos (`data`, `result`, `temp`).
29
- - Funções longas (>30 linhas) ou com múltiplas responsabilidades.
30
- - Duplicação perceptível que aumenta custo de manutenção.
31
- - Um ou dois tipos/componentes recriados que já existiam em outro arquivo do projeto.
32
- - Desvios dos padrões do stack sem justificativa.
33
- - Dead code pontual.
34
- - Comentário de processo (UC, ADR, `T{n}`, Gate, `spec.md`, mockup), comentário afirmando comportamento que nenhum teste cobra, ou `///`/JSDoc em todo membro de aplicação repetindo a assinatura.
35
-
36
- ## Score 3-4 — Problemático
37
-
38
- - Nomes que exigem contexto externo para entender o que representam.
39
- - Funções com >50 linhas ou classes com >200 linhas sem coesão.
40
- - Duplicação significativa: mesma lógica em múltiplos lugares.
41
- - Conceito central do domínio redeclarado na MESMA feature (o caso `SimpleBuilding`: cinco cópias na mesma pasta, uma já divergindo do resto).
42
- - Não segue os padrões do stack — código parece escrito para outro contexto.
43
- - Blocos longos de comentário contando a história da implementação, em vários arquivos.
44
-
45
- ## Score 1-2 — Reprovado
46
-
47
- - Nomes arbitrários ou gerados automaticamente sem semântica.
48
- - Funções/classes sem separação de responsabilidades — "god objects".
49
- - Duplicação massiva ou copy-paste evidente.
50
- - Ignora por completo o que o projeto já tem: o `reuse-map.md` mandou REUSAR e o código criou do zero.
51
- - Completamente fora dos padrões do stack — exige reescrita.
52
-
53
- > **O escopo desta dimensão é o CODEBASE, não só o diff.** "Duplicação" lê-se
54
- > naturalmente como repetição *dentro do que foi escrito* — e foi assim que
55
- > `SimpleBuilding` foi redefinido cinco vezes na mesma pasta do ProspectPRO sem
56
- > que nenhuma avaliação pegasse: cada diff, sozinho, parecia limpo. Antes de
57
- > pontuar, pergunte de fora do diff. Ferramentas: o `reuse-map.md` da feature
58
- > (`2-plan/reuse-map.md`) diz o que o plano decidiu; `morph-spec graph explain
59
- > <símbolo>` diz o que existe de fato (**sem grafo: `grep -rn "<símbolo>"`**);
60
- > o nó `validators` do `morph-spec verify` já traz os achados do validador
61
- > `reuse`. Um símbolo criado contra um veredito `REUSAR` é achado desta
62
- > dimensão, mesmo que o código esteja impecável por dentro.
63
-
64
- ## Teto de prova de observabilidade GenAI
65
-
66
- Quando a feature **chama LLM**, o avaliador aplica também
67
- `.morph/framework/evals/proof-rubrics/observabilidade-genai.md` e grava a nota sob a chave `obs` na
68
- linha `**Proof-Scores:**`. Ela **não** é dimensão do composto — nenhum peso muda — e entra aqui como
69
- teto sobre esta dimensão:
70
-
71
- | Proof-Score `obs` | teto nesta dimensão |
72
- |---|---|
73
- | 9 a 10 | sem teto |
74
- | 7 a 8 | 9 |
75
- | 4 a 6 | 7 |
76
- | 0 a 3 | 5 |
77
-
78
- A rubrica pergunta a **propriedade** ("dá para reconstruir o que foi ao provedor, e o que ele
79
- respondeu, neste turno?"), não a tecnologia: telemetria própria com teste de fidelidade alcança a
80
- faixa mais alta tanto quanto um span OpenTelemetry.
81
-
82
- **Aplicabilidade tem duas etapas, e ela NÃO se declara determinística** (a versão anterior se
83
- declarava, e errava na primeira feature que encontrou): (1) **filtro mecânico de alta recall** — o
84
- `mandate.md` cita ao menos um standard `ai-agents`; falso ⇒ `not_evaluated`. (2) **determinação
85
- escrita pelo avaliador** — a feature entrega código que **chama um modelo**? — registrada **com o
86
- motivo** no relatório. Tasks com `group` em `{docs, tests}` são **indício** contra, não veredito.
87
- `not_evaluated` **não aplica teto**, e um `not_evaluated` sem motivo escrito não é dispensa. Sem a
88
- chave `obs` no `**Proof-Scores:**`, também não há teto a aplicar.
89
-
90
- ## Perguntas de avaliação
91
-
92
- 1. É possível entender o que uma função faz apenas pelo seu nome e assinatura?
93
- 2. Alguma função tem mais de 30 linhas ou mais de uma responsabilidade clara?
94
- 3. Há lógica duplicada que poderia ser extraída?
95
- 3b. **O que foi criado aqui já existia no projeto?** Confira os tipos, componentes, hooks e serviços novos contra o `reuse-map.md` e contra o grafo — e diga no relatório o que você conferiu.
96
- 4. O código segue os padrões definidos nos standards do projeto?
97
- 5. Há variáveis não usadas, imports desnecessários ou blocos comentados?
98
- 6. Algum comentário existe onde um nome, uma função extraída, um tipo ou um teste bastaria? Algum conta história de processo, repete o código ou a assinatura, ou passa de ~3 linhas sem justificar? O validador `code-budget` do nó `validators` já conta, nas linhas adicionadas, os comentários que citam processo e a densidade de comentário sobre código; leia os arquivos citados antes de pontuar.
@@ -1,57 +0,0 @@
1
- # Rubrica Condensada — Eval Inline por Task
2
-
3
- Versão compacta das 4 rubricas completas de `.morph/framework/evals/rubrics/`, para o eval
4
- **inline por task** (`morph-eval` §2, escopo tarefa única). Mesmas dimensões, mesmos
5
- pesos, mesma régua — só menos texto por banda.
6
-
7
- > **O Gate 3 NÃO usa esta condensada.** O avaliador independente da `morph-review`
8
- > (persona `evaluator`, contexto fresco) sempre lê as 4 rubricas completas — a régua
9
- > do juiz de fase não muda. Esta condensada só corta releitura no loop intra-task.
10
-
11
- ## Verificações mecânicas obrigatórias — auto-reprovação (teto 2)
12
-
13
- Se o diff toca endpoint minimal API ou fetch cross-camada, independente do resto:
14
-
15
- - Serviço injetado na lambda do endpoint sem `AddScoped`/`AddSingleton`/`AddTransient` em `Program.cs`.
16
- - Chamada server-direct e client-side proxy pro mesmo recurso reusando a mesma constante de prefixo.
17
-
18
- ## Dimensões e pesos
19
-
20
- | Dimensão | Peso |
21
- |---|---|
22
- | Arquitetura | 30% |
23
- | Contratos | 25% |
24
- | Qualidade de código | 25% |
25
- | Cobertura de testes | 20% |
26
-
27
- ## Bandas por dimensão
28
-
29
- | Dimensão | 1-3 | 4-6 | 7-8 | 9-10 |
30
- |---|---|---|---|---|
31
- | **Arquitetura** | Ignora a arquitetura do spec.md; sem feature folder; deps circulares; ou violação mecânica acima | Pastas corretas, responsabilidades se misturam; deps cross-feature sem justificativa; domain acoplado a infra | Desvios menores justificados; deps cross-feature via abstração; impurezas de infra pontuais | Feature folder rigoroso; zero deps cross-feature diretas; domain isolado; DI onde exige |
32
- | **Contratos** | Sem tipos ou `any` generalizado; zero validação; sem tratamento de erro; naming arbitrário | `any`/genérico visível; validação parcial; mix exceptions/Result; naming inconsistente | Tipos bem definidos, `any` raro e justificado; validação na maioria; erro consistente | Zero `any`; validação em todos endpoints; Result pattern/discriminated union; naming consistente |
33
- | **Qualidade** | Nomes arbitrários; god objects; duplicação massiva; recria o que o `reuse-map` mandou REUSAR; fora do padrão do stack | Nomes genéricos (`data`,`temp`); funções >30 linhas; duplicação perceptível; conceito da MESMA feature redeclarado; comentário que narra task/UC/ADR ou `///`/JSDoc repetindo a assinatura | Nomes claros, raras exceções; bem dimensionado; duplicação mínima; no máximo um conceito recriado | Nomes comunicam intenção; funções ≤20-25 linhas, 1 responsabilidade; zero duplicação/dead code; nada criado que já existia no projeto; quase nenhum comentário, só o porquê que o código não mostra |
34
- | **Testes** | Sem testes ou sem asserts reais; zero edge case; nomes genéricos | Happy path OK, edge cases parciais; erros só óbvios; testes interdependentes; teste de texto de arquivo sem substituto em runtime; cópias em vez de tabela ou excesso sem justificativa | Happy path completo; maioria dos edge cases; erros nos fluxos principais | Toda pós-condição do `usecase` tem teste; A1/A2 cobertos; edge+erro cobertos, em tabela; isolados; dentro do orçamento |
35
-
36
- > **Qualidade olha o CODEBASE, não só o diff.** Símbolo novo cujo nome já existe no projeto não aparece no diff — é preciso perguntar de fora dele. O nó `validators` do `morph-spec verify` já traz os achados do validador `reuse`; o `2-plan/reuse-map.md` diz o que o plano decidiu por conceito.
37
-
38
- > Task com `usecase: UC-nn`: pós-condição sem teste **impede a faixa 9-10** em Testes, mesmo com o resto da suíte completo (herdado de `test-coverage.md`).
39
-
40
- > Teste que só lê texto de arquivo não cobre pós-condição de comportamento: sem substituto em runtime, ela conta como sem teste (herdado de `test-coverage.md`, pergunta 7).
41
-
42
- > Orçamento por task: um teste por pós-condição + um de regressão por bug, cenários do mesmo comportamento numa tabela; teste que só fixa copy é achado (herdado de `test-coverage.md`, pergunta 8). O validador `code-budget` do nó `validators` avisa sobre teste acima de 1,5× a produção, sobre comentário que cita processo e sobre densidade de comentário acima de 1 linha a cada 10 de código.
43
-
44
- > Task de UI cuja tela tem `### Checklist de tela` no `1-design/mockups.md`: item divergente sem justificativa em `decisions.md` → teto 8 em Contratos; paginação, ordenação ou filtro que o checklist põe no servidor entregue em memória (ou ausente), ou estado vazio/carregando/erro decidido e ausente → teto 6 (herdado de `contracts.md`, "Contrato de tela").
45
-
46
- ## Score composto
47
-
48
- ```
49
- score = (arquitetura × 0.30) + (contratos × 0.25) + (qualidade × 0.25) + (testes × 0.20)
50
- ```
51
-
52
- Arredonde para uma casa decimal. ≥9 aprova em silêncio; <9 alimenta o loop de correção do `morph-apply`.
53
-
54
- ## Quando abrir a completa em vez desta
55
-
56
- Dúvida de banda, violação mecânica suspeita, ou escopo de fase (Gate 3) — abra
57
- `.morph/framework/evals/rubrics/{dimension}.md`. Esta condensada é o atalho do caso comum.
@@ -1,67 +0,0 @@
1
- # Rubrica: Contratos (Peso 25%)
2
-
3
- Avalia a qualidade dos tipos, validações, tratamento de erros e naming dos contratos públicos.
4
-
5
- ## Score 9-10 — Exemplar
6
-
7
- - Todos os tipos explícitos — zero `any`, zero `object` genérico onde um tipo específico cabe.
8
- - Campos opcionais (`?`) usados apenas onde o dado é genuinamente opcional; campos obrigatórios sem nullable desnecessário.
9
- - Validação de input declarada em todos os endpoints/handlers (FluentValidation, Zod, ou equivalente do stack).
10
- - Error handling explícito via Result pattern, discriminated union ou equivalente — sem exceptions para fluxo de negócio.
11
- - Nomes seguem a convenção do projeto: PascalCase para tipos, camelCase para propriedades, verbos para comandos.
12
-
13
- ## Score 7-8 — Bom
14
-
15
- - Tipos bem definidos com pouquíssimos `any` ou genéricos desnecessários — e onde existem, são justificados.
16
- - Validação presente na maioria dos endpoints, com poucos casos sem cobertura.
17
- - Error handling consistente com o padrão do projeto, com desvios pontuais.
18
- - Nomes claros e consistentes, com raras exceções.
19
-
20
- ## Score 5-6 — Aceitável com ressalvas
21
-
22
- - Uso de `any` ou tipos genéricos em pontos visíveis da API.
23
- - Validação parcial — alguns endpoints sem validação de input.
24
- - Mix de estratégias de error handling (exceptions e Result no mesmo módulo).
25
- - Nomes inconsistentes em algumas partes.
26
-
27
- ## Score 3-4 — Problemático
28
-
29
- - Tipos amplamente genéricos ou ausentes onde deveriam ser específicos.
30
- - Validação de input ausente em múltiplos pontos de entrada.
31
- - Error handling imprevisível — sem padrão claro, exceptions misturadas com retornos especiais.
32
- - Nomes que não comunicam intenção.
33
-
34
- ## Score 1-2 — Reprovado
35
-
36
- - Contratos sem tipos definidos ou com `any` generalizado.
37
- - Nenhuma validação de input.
38
- - Sem tratamento de erro — falhas em runtime sem diagnóstico útil.
39
- - Naming arbitrário ou genérico (`data`, `obj`, `result` sem qualificador).
40
-
41
- ## Contrato de tela (feature com UI)
42
-
43
- Quando o `1-design/mockups.md` declara telas (`## Tela:`) com `### Checklist de tela`, o checklist é
44
- um contrato como os tipos da spec: cada item decidido (volume, paginação, ordenação, filtro, os três
45
- estados, mobile, abas) é conferido contra a tela **entregue** e registrado na seção `## Checklist de
46
- tela` do `evaluator-report.md` — uma linha por item, com o planejado, o observado e o veredito
47
- (`cumpre` / `diverge` / `não verificável`, com o motivo).
48
-
49
- | Achado | Teto em Contratos |
50
- |---|---|
51
- | Item `diverge` sem justificativa registrada em `decisions.md` | 8 |
52
- | Paginação, ordenação ou filtro que o checklist põe no servidor, entregue em memória no cliente ou ausente | 6 |
53
- | Estado vazio, carregando ou de erro que o checklist decide e a tela não tem | 6 |
54
-
55
- `não verificável` (stack fora do ar) não é divergência: o avaliador lê o código — a query recebe
56
- página e ordenação? o estado vazio existe? — e diz no veredito por onde conferiu. Itens "não se
57
- aplica" e a superfície não precisam de linha. Sem a seção, ou com item decidido sem linha, o
58
- `morph-spec gate-check` pausa o Gate 3 por conta própria, antes de qualquer nota.
59
-
60
- ## Perguntas de avaliação
61
-
62
- 1. Há `any` ou tipos genéricos onde um tipo específico seria possível?
63
- 2. Todos os endpoints/handlers têm validação de input declarada?
64
- 3. O tratamento de erros segue o padrão do projeto (Result, exceções, etc.)?
65
- 4. Os nomes dos tipos e propriedades comunicam claramente o que representam?
66
- 5. Campos opcionais fazem sentido semântico, ou são opcionais por comodidade?
67
- 6. Em feature com UI: cada item decidido do checklist de tela foi conferido contra a tela entregue, e toda divergência tem justificativa?
@@ -1,99 +0,0 @@
1
- # Rubrica: Cobertura de Testes (Peso 20%)
2
-
3
- Avalia se os testes cobrem os comportamentos esperados, são isolados e têm nomes úteis.
4
-
5
- ## Score 9-10 — Exemplar
6
-
7
- - **Cada pós-condição do use case referenciado tem teste correspondente.** Se a task traz `usecase: "UC-07"`, abra `2-plan/usecases/UC-07-*.md` e percorra as pós-condições (P1, P2…): cada uma precisa de ao menos um teste que a verifique. Pós-condição sem teste **impede a faixa 9-10**, por mais completa que a suíte pareça no resto.
8
- - Happy path coberto para todos os casos de uso relevantes — "relevantes" são os use cases referenciados pelas tasks da feature, não uma lista implícita.
9
- - Fluxos alternativos do use case (A1, A2…) cobertos: são os edge cases de **comportamento** e foram declarados justamente para serem testados.
10
- - Edge cases críticos cobertos: null/undefined, string vazia, boundary values, coleção vazia — como linhas da tabela do comportamento (`[Theory]`/`it.each`), não como cópias do mesmo teste.
11
- - **Dentro do orçamento da task**: um teste por pós-condição, mais um de regressão por bug; o que passa disso tem justificativa escrita na task.
12
- - Casos de erro cobertos: o que acontece quando a operação falha, quando a dependência retorna erro.
13
- - Testes completamente isolados — cada teste pode rodar sozinho em qualquer ordem.
14
- - Nomes de teste descrevem o comportamento esperado: `"deve retornar erro quando email já existe"` (não `"testEmail"`).
15
- - Testes testam comportamento, não implementação — refatorar sem mudar comportamento não quebra testes.
16
-
17
- ## Score 7-8 — Bom
18
-
19
- - Happy path coberto em todos os casos relevantes.
20
- - Maioria dos edge cases cobertos, com poucos gaps identificáveis.
21
- - Casos de erro cobertos para os fluxos principais.
22
- - Isolamento correto na maioria dos testes.
23
- - Nomes descritivos com raras exceções genéricas.
24
-
25
- ## Score 5-6 — Aceitável com ressalvas
26
-
27
- - Happy path coberto, mas edge cases com cobertura parcial.
28
- - Casos de erro não cobertos sistematicamente — só os mais óbvios.
29
- - Alguns testes com dependências entre si (ordem importa).
30
- - Nomes misturados: alguns descritivos, outros genéricos.
31
- - Testes que testam implementação (dependentes de detalhes internos).
32
- - Cenários do mesmo comportamento copiados em N testes em vez de uma tabela, ou testes além do orçamento da task sem justificativa.
33
-
34
- ## Score 3-4 — Problemático
35
-
36
- - Apenas happy path coberto, sem edge cases.
37
- - Testes interdependentes ou com estado compartilhado.
38
- - Nomes que não descrevem o comportamento testado.
39
- - Cobertura presente mas superficial — testes passam mas não protegem contra regressão.
40
- - Suíte inflada: a maior parte dos testes novos fixa texto ou repete o mesmo comportamento.
41
-
42
- ## Score 1-2 — Reprovado
43
-
44
- - Ausência de testes ou testes que não verificam nada significativo.
45
- - Testes que sempre passam independente do comportamento (sem asserts reais).
46
- - Sem cobertura de qualquer edge case ou caminho de erro.
47
- - Nomes completamente genéricos ou numerados.
48
-
49
- ## Perguntas de avaliação
50
-
51
- 0. A task referencia um `usecase`? Se sim: **toda** pós-condição daquele use case tem teste correspondente? (Sem isso, o teto é 8.)
52
- 1. O happy path está coberto para todos os casos de uso da tarefa?
53
- 2. Os edge cases críticos (null, vazio, boundary) estão cobertos?
54
- 3. O que acontece quando uma dependência falha — isso está testado?
55
- 4. Os testes podem rodar em qualquer ordem sem interferir entre si?
56
- 5. Os nomes dos testes descrevem o comportamento esperado sem precisar ler o corpo?
57
- 6. **Esta mudança é uma CORREÇÃO? Então: o que ela abriu?** Que comportamento antes correto pode ter
58
- regredido por causa dela, e existe teste que pegaria essa regressão? Toda pergunta acima olha para
59
- frente (o que a mudança deve fazer); esta olha para os lados. Numa feature real, três de três
60
- rodadas de correção abriram um problema novo — o fix de um shadow abriu um laço de LLM a cada 15
61
- min; o fecho de um fail-open abriu um P1; a correção desse P1 saiu com meio predicado. Nenhuma
62
- apareceu no score, porque score não pergunta isso. **Sem resposta a esta pergunta numa correção,
63
- o teto de Cobertura é 8.**
64
- 7. **Quantos testes desta task asseram sobre TEXTO DE ARQUIVO** (prompt, migration, config,
65
- markdown, código-fonte lido como string, copy de UI, config de tenant)? **Cada um tem
66
- substituto em runtime** — um teste que exercita o sistema ou, em critério sobre saída de LLM,
67
- a evidência em `3-implement/evidencias/{taskId}.md` apontando um eval? Teste de texto prova a
68
- VERSÃO do arquivo, não o comportamento: quando é o único teste de uma pós-condição, **a
69
- pós-condição conta como sem teste** (pergunta 0 — teto 8). Exceções: pós-condição com
70
- `> [!note] Por que artefato:` e o único teste de estrutura por fonte de prompt
71
- (`ai-agents-testing-ai`). Medido: 12 suítes, 106 testes sobre versões superadas do prompt.
72
- Teste cuja asserção é só a presença ou ausência de uma string de copy é **achado** mesmo quando
73
- há teste de runtime ao lado: essa checagem é analyzer, lint ou validação no publish.
74
- 8. **A task cabe no orçamento?** Um teste por pós-condição, mais um de regressão por bug; o
75
- excesso tem justificativa na task? Cenários do mesmo comportamento estão numa tabela, e a
76
- fixture é a compartilhada, não uma refeita? O validador `code-budget` do nó `validators` avisa
77
- quando as linhas de teste adicionadas passam de 1,5× as de produção. Mutante sobrevivente da
78
- prova de mutação se fecha apertando asserção ou somando linha de tabela: um teste novo por
79
- mutante é excesso, não cobertura.
80
-
81
- ## Tetos de prova (Gate 3)
82
-
83
- No Gate 3 o avaliador independente pontua **a própria evidência** 0-10 nas cinco rubricas de
84
- `.morph/framework/evals/proof-rubrics/` (`mutation-proof.md`, `verde-nao-e-coberto.md`,
85
- `fiacao.md`, `guard-cego.md`, `eval-de-modelo.md`) e grava a linha `**Proof-Scores:**` no `evaluator-report.md`.
86
-
87
- Elas **não** são dimensões do composto — nenhum peso muda por causa delas. Elas entram aqui, como
88
- teto sobre esta dimensão, pelo mesmo mecanismo que "pós-condição sem teste impede a faixa 9-10":
89
-
90
- | menor Proof-Score das cinco | teto nesta dimensão |
91
- |---|---|
92
- | 9 a 10 | sem teto |
93
- | 7 a 8 | 8 |
94
- | 4 a 6 | 6 |
95
- | 0 a 3 | 3, e o item entra como **bloqueante** listado no relatório |
96
-
97
- Sem a linha `**Proof-Scores:**`, não há teto a aplicar — mas a ausência da seção `## Mutações` num
98
- relatório de feature com código de produção **pausa o Gate 3** por conta própria
99
- (`src/lib/risk-detector.js`), antes de qualquer discussão de nota.
@@ -1,42 +0,0 @@
1
- name: dotnet-crud
2
- description: CRUD operations for product catalog in .NET 10 VSA application with Neon PostgreSQL
3
- stack: dotnet-neon
4
-
5
- request: |
6
- Add CRUD operations for a product catalog to the .NET 10 application.
7
- Products have: name, description, price (decimal), category, imageUrl, isActive.
8
- Implement using Vertical Slice Architecture with IHandler<TRequest, TResponse>,
9
- Result<T> railway-oriented error handling (no exceptions in handlers),
10
- sealed records for DTOs, and FluentValidation via Scrutor decorators.
11
- Use IApiEndpoint auto-discovery for Minimal API route registration.
12
- Include pagination for the list endpoint with TanStack Query-compatible
13
- response format, search by name/category, and soft-delete (isActive flag).
14
- Database is Neon PostgreSQL via EF Core + Npgsql.
15
- API docs via Scalar UI.
16
-
17
- phases_to_eval:
18
- - proposal
19
- - spec
20
- - tasks
21
-
22
- skip_implementation: true
23
-
24
- dimensions:
25
- proposal:
26
- completeness: "Covers all CRUD operations plus pagination, search, soft-delete, Scalar UI docs"
27
- scope: "Product catalog only — no cart, orders, or user management"
28
- spec:
29
- specificity: "API contracts with sealed record DTOs, Result<T> return types, FluentValidation rules, specific HTTP status codes"
30
- data_model: "Product entity with all fields, EF Core configuration, Neon PostgreSQL constraints"
31
- architecture: "VSA feature folders, IHandler pattern, Scrutor pipeline, IApiEndpoint discovery, ApplicationDbContext direto no slice (sem repository genérico)"
32
- completeness: "All CRUD endpoints, pagination params (page/pageSize), search filters, error responses via Result<T>"
33
- tasks:
34
- granularity: "Each task 15-60 minutes, no mega-tasks"
35
- coverage: "All spec FRs mapped to at least one task"
36
- ordering: "Entity/migration first, then handlers, then validation decorators, then API endpoints, then tests"
37
- cross_phase:
38
- fr_coverage_threshold: 0.95
39
- mandate_completeness: 0.9
40
-
41
- threshold: 8.0
42
- max_iterations: 3
@@ -1,38 +0,0 @@
1
- name: nextjs-auth
2
- description: OAuth2 authentication feature for Next.js + shadcn/ui application with Neon Auth
3
- stack: nextjs-neon
4
-
5
- request: |
6
- Add user authentication to the Next.js application using Neon Auth (Better Auth).
7
- Users should be able to sign in with Google OAuth, view their profile page
8
- showing name, email, and avatar using shadcn/ui Card and Avatar components,
9
- and sign out. Use TanStack Query for data fetching and cache management.
10
- Protect authenticated routes with Next.js middleware.
11
- Session data lives in the Neon PostgreSQL database.
12
-
13
- phases_to_eval:
14
- - proposal
15
- - spec
16
- - tasks
17
-
18
- skip_implementation: true
19
-
20
- dimensions:
21
- proposal:
22
- completeness: "Covers sign-in, profile with shadcn/ui components, sign-out, Neon Auth session storage, middleware route protection"
23
- scope: "Appropriately scoped — no admin dashboard, no multi-provider auth beyond Google"
24
- spec:
25
- specificity: "Each FR has testable acceptance criteria with specific status codes, Neon Auth config, TanStack Query hooks"
26
- data_model: "User and Session entities defined with Prisma schema or Drizzle schema for Neon PostgreSQL"
27
- architecture: "Next.js App Router structure, API routes, middleware, shadcn/ui component boundaries, TanStack Query patterns"
28
- completeness: "OAuth flow via Neon Auth, token refresh, error handling, logout flow, loading states with Framer Motion"
29
- tasks:
30
- granularity: "Each task 15-60 minutes, no mega-tasks"
31
- coverage: "All spec FRs mapped to at least one task"
32
- ordering: "Dependencies respected — Neon Auth setup before routes, routes before UI, UI before tests"
33
- cross_phase:
34
- fr_coverage_threshold: 0.95
35
- mandate_completeness: 0.9
36
-
37
- threshold: 8.0
38
- max_iterations: 3
@@ -1,5 +0,0 @@
1
- name: standard
2
- description: Core eval suite — one scenario per major stack
3
- scenarios:
4
- - nextjs-auth
5
- - dotnet-crud