# Rubrica Condensada — Eval Inline por Task

Versão compacta das 4 rubricas completas de `.morph/framework/evals/rubrics/`, para o eval
**inline por task** (`morph-eval` §2, escopo tarefa única). Mesmas dimensões, mesmos
pesos, mesma régua — só menos texto por banda.

> **O Gate 3 NÃO usa esta condensada.** O avaliador independente da `morph-review`
> (persona `evaluator`, contexto fresco) sempre lê as 4 rubricas completas — a régua
> do juiz de fase não muda. Esta condensada só corta releitura no loop intra-task.

## Verificações mecânicas obrigatórias — auto-reprovação (teto 2)

Se o diff toca endpoint minimal API ou fetch cross-camada, independente do resto:

- Serviço injetado na lambda do endpoint sem `AddScoped`/`AddSingleton`/`AddTransient` em `Program.cs`.
- Chamada server-direct e client-side proxy pro mesmo recurso reusando a mesma constante de prefixo.

## Dimensões e pesos

| Dimensão | Peso |
|---|---|
| Arquitetura | 30% |
| Contratos | 25% |
| Qualidade de código | 25% |
| Cobertura de testes | 20% |

## Bandas por dimensão

| Dimensão | 1-3 | 4-6 | 7-8 | 9-10 |
|---|---|---|---|---|
| **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 |
| **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 |
| **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 | 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 |
| **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 | 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; isolados |

> **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.

> 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`).

> 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).

## Score composto

```
score = (arquitetura × 0.30) + (contratos × 0.25) + (qualidade × 0.25) + (testes × 0.20)
```

Arredonde para uma casa decimal. ≥9 aprova em silêncio; <9 alimenta o loop de correção do `morph-apply`.

## Quando abrir a completa em vez desta

Dúvida de banda, violação mecânica suspeita, ou escopo de fase (Gate 3) — abra
`.morph/framework/evals/rubrics/{dimension}.md`. Esta condensada é o atalho do caso comum.
