harness-kit wiki

Evals (feedback inferential)

Evals são o controle de feedback inferential, baseado em LLM. Onde um sensor checa estrutura de forma determinística, um eval julga significado: esse PRD está claro, o trade-off desse design é real, esse plan de fato decorre do PRP. Um eval é um LLM-judge pontuado de 0 a 10 contra uma rubric, com threshold de aprovação de 8.0 e até 3 retries.

Por que você precisa de controles inferential

Nenhum regex te diz que a definição do problema está vaga, que a hipótese é infalsificável, ou que um design escondeu o trade-off mais difícil. Isso é julgamento semântico, e só um modelo de linguagem consegue fazer nessa granularidade. O custo: é probabilístico, então você calibra com uma rubric e pesos em vez de confiar num "dê uma nota de 1 a 10" solto.

Anatomia de um eval

Uma rubric é um arquivo markdown: dimensões com peso, cada uma com âncoras em 0/5/10, um threshold, e um formato de saída estrito.

# Eval: Design Quality
Type: LLM-judge
Mode: quality gate
Threshold: weighted total >= 8.0

## Rubric
### Requirements rigor (weight 15%)
Numeric targets + back-of-envelope math?
- 10: numeric targets + sizing math
- 5: some numbers, no math
- 0: prose only
...

## On failure (total below 8.0)
Retry. Regenerate lowest-scoring sections only. Max 3 attempts.

## Output format
{ "scores": {...}, "weighted_total": 0.0, "feedback": ["dimension: issue with line ref"] }

weighted_total = sum(score x weight%) / 100. O judge precisa citar uma linha ou seção sempre que pontuar uma dimensão abaixo de 7, para que o feedback seja acionável e não um chute de sensação.

O loop de retry

generate -> sensors (hard gate) -> eval (score)
   ^                                   |
   |          below 8.0                v
   +------ regenerate weak sections ---+   (max 3 attempts, then blocker)

O ponto crítico: o retry regenera só as dimensões com nota baixa, não o artefato inteiro, e o feedback por dimensão do judge diz quais são. Depois de 3 tentativas falhas, a stage devolve um blocker em vez de entregar algo abaixo do threshold.

Os pesos codificam o que importa

Os pesos são onde você expressa prioridades. Na rubric de qualidade de PRD, completude de métricas e clareza carregam o maior peso, porque um PRD vive ou morre por um problema nítido e um sucesso mensurável. Na rubric de qualidade de design, arquitetura + deep dives e disciplina de trade-off dominam, porque é isso que separa um design de staff de um diagrama de caixinhas. Ajustar pesos é uma ação de "human on the loop": você muda com o que a gate se importa uma vez, e isso vale para todo artefato futuro.

Calibração e anti-carimbo

Um eval que sempre passa não vale nada. Duas práticas mantêm ele honesto:

Evals no harness-kit

Stage Evals
prd prd-quality, prd-readiness
prp prp-quality, prp-context-readiness
plan plan-quality
dev dev-quality
pr pr-quality
system design design-quality, design-review-depth

A variante PASS/FAIL: spec-satisfied

O loop spec-driven (/sse:sdd) usa outro formato de eval. Em vez de uma nota de 0 a 10, o spec-satisfied devolve PASS/FAIL contra o Success criteria (verifiable) e os Validation gates do PRP. Um FAIL reentra no loop dev↔test com uma dica em next_iter_focus; o loop roda no máximo 3 iterações. Ele roda numa sessão nova, sem contexto do worker, para que o judge não seja enviesado pela narrativa de quem implementou. Esse é um eval usado como predicado de objetivo em vez de nota de qualidade.

Sensor primeiro, eval depois

A ordem importa: sensors rodam antes dos evals. Não faz sentido gastar uma chamada de LLM pontuando a prosa de um artefato que está sem metade das seções. A gate determinística limpa primeiro as falhas baratas e objetivas; o eval julga só artefatos bem formados.

Veja também

O que a nota não é

O judge devolve notas por dimensão e um total ponderado, e até pouco tempo atrás nada checava se o total decorria das notas. Agora checa: passe o JSON do judge pelo verificador de nota, que lê os pesos da rubric e recalcula.

.claude/scripts/eval-score.py --rubric evals/prd-quality.md --scores judge.json

Exit 0 imprime o número que o marker de aprovação deve carregar. Exit 2 significa que o judge inflou o total, pontuou uma dimensão que a rubric não pesa, ou pulou uma que ela pesa, e nesse caso a nota não significa nada e você não aprova em cima dela.

Isso resolve só a metade computável. Duas limitações continuam de pé, e vale ser direto sobre elas:

Leia o feedback, não só o número. A nota é um sinal que pega artefatos fracos, não uma medição.

Tradução manual de Evals (feedback inferential), a página original em inglês na wiki.