# Rubricas de prova (`proof-rubrics/`)

Sete rubricas pontuáveis **0-10** que o avaliador independente do **Gate 3** aplica sobre a
EVIDÊNCIA que ele mesmo produziu — não sobre o produto.

**Elas não são dimensões do score composto.** O composto continua sendo
`arquitetura + contratos + qualidade + testes`, com os pesos declarados em `../rubrics/`.

São de dois tipos, e a diferença está em **onde** cada uma impõe teto:

| Tipo | Quando se aplica | Onde impõe teto |
|---|---|---|
| **Universais** — `mutation-proof`, `verde-nao-e-coberto`, `fiacao`, `guard-cego`, `eval-de-modelo` | sempre | *Cobertura de Testes* (`../rubrics/test-coverage.md`, seção "Tetos de prova (Gate 3)"). O **menor das cinco** é o que vale — todas perguntam a mesma coisa: *a evidência é real?* |
| **Condicional** — `media-claims` | só em feature que **gera mídia** | *Arquitetura* (`../rubrics/architecture.md`, seção "Tetos de prova de mídia"). Entra **sozinha**, fora do menor-das-cinco |
| **Condicional** — `observabilidade-genai` | só em feature que **chama LLM**. Duas etapas, e ela **não** se declara determinística: filtro mecânico de alta recall (o mandate cita um standard `ai-agents`) **+** determinação escrita pelo avaliador, com o motivo. `not_evaluated` sem motivo não é dispensa | *Qualidade de Código* (`../rubrics/code-quality.md`, seção "Teto de prova de observabilidade GenAI"). Entra **sozinha**, fora do menor-das-cinco |

As duas condicionais ficam **fora** do mínimo de propósito: as afirmações que elas cobram são
**propriedades estruturais** — onde a chamada mora, que estados existem, o que é persistido, o que é
instrumentado —, não perguntas sobre a evidência ser real. Somá-las faria um `media=4` ou um `obs=4`
derrubar o teto de TESTE por um motivo que não tem nada a ver com teste.

## Por que num diretório próprio

`scripts/check-rubric-parity.js` varre **todo** `.md` de `../rubrics/` (exceto `README.md` e
`condensed.md`) e exige o H1 `# Rubrica: {Nome} (Peso {N}%)`, com a soma dos pesos em 100. Um
arquivo destes largado lá reprova o `npm run validate` com um erro de extração — e "consertar"
dando-lhe um peso obrigaria a rebalancear os quatro pesos em oito lugares, mudando o significado de
todo score histórico da base.

Por isso o H1 daqui é deliberadamente **`# Prova: {Nome}`**: se alguém mover um destes arquivos
para `../rubrics/`, o erro é imediato e nomeado, nunca um desvio silencioso de peso.

## Consumidores (cada rubrica nasce com dono)

| Rubrica | Quem lê | Quem cobra |
|---|---|---|
| `mutation-proof.md` | prompt de dispatch do avaliador — `skills/core/morph-review/SKILL.md` §4 | `src/lib/risk-detector.js` (Gate 3 pausa sem a seção `## Mutações`) + teto em `../rubrics/test-coverage.md` |
| `verde-nao-e-coberto.md` | prompt de dispatch do avaliador — `morph-review` §4 | teto em `../rubrics/test-coverage.md` |
| `fiacao.md` | prompt de dispatch do avaliador — `morph-review` §4 | teto em `../rubrics/test-coverage.md`; cita `verify` `nodes.tests.runs[].count` por `id` |
| `guard-cego.md` | prompt de dispatch do avaliador — `morph-review` §4 | teto em `../rubrics/test-coverage.md` |
| `eval-de-modelo.md` | prompt de dispatch do avaliador — `morph-review` §4 | teto em `../rubrics/test-coverage.md`; a superfície que build e teste unitário não leem |
| `media-claims.md` | prompt de dispatch do avaliador — `morph-review` §4, **só quando a feature gera mídia** | `src/lib/risk-detector.js` (Gate 3 pausa sem a seção `## Mídia gerada`) + teto em `../rubrics/architecture.md` |
| `observabilidade-genai.md` | prompt de dispatch do avaliador — `morph-review` §4, sob a condição de aplicabilidade | teto em `../rubrics/code-quality.md`; a régua da propriedade está em `standards/ai-agents/observability-patterns.md` |

`test/framework/proof-rubrics.test.js` é o canário: nenhuma rubrica de prova pode ficar **órfã**
(citada por ninguém), nem migrar para o diretório de dimensões.

## Como o avaliador reporta

Duas coisas, no `4-review/evaluator-report.md`:

1. A seção `## Mutações` — obrigatória quando a feature tem código de produção (ao menos uma task
   com `group` diferente de `docs`). Sem ela, o `morph-spec gate-check {feature} review` **pausa**.
2. A seção `## Mídia gerada` — obrigatória **só** quando a feature gera mídia (ao menos uma task
   cujo `standards[]` cite um dos três standards de mídia). Sem ela, o `gate-check` também **pausa**;
   feature que não gera mídia é isenta automaticamente, sem ninguém precisar lembrar.
3. A linha machine-readable, no mesmo estilo do `**Composite-Score:**`:

   ```
   **Proof-Scores:** mutation=9 verde=8 fiacao=9 guard=7 eval=8 media=9
   ```

   E, quando a feature chama LLM, a mesma linha carrega também a chave `obs`:

   ```
   **Proof-Scores:** mutation=9 verde=8 fiacao=9 guard=7 obs=8
   ```

O **menor** de `mutation`/`verde`/`fiacao`/`guard`/`eval` é o que impõe o teto em Cobertura —
as cinco perguntam a mesma coisa: *a evidência é real?*. Chave ausente não vira zero: o mínimo é
tirado sobre as chaves PRESENTES, para que um relatório antigo de quatro chaves continue legível.

As chaves `media` e `obs` são lidas **à parte** e não entram naquele mínimo: `media` limita
**Arquitetura** e só aparece quando a feature gera mídia; `obs` limita **Qualidade de Código** e só
aparece quando a feature chama LLM. Ausente a chave (ou com `obs=not_evaluated`), não há teto
daquela família a aplicar.
