Ratchet Feature List
Como manter .harness/feature_list.json (features com critérios verificáveis) e .harness/baseline.json (métricas de qualidade que só podem melhorar). Define quem escreve o quê (dev vs QA), regras inegociáveis e validação via check-harness.sh. Invoque quando o dev pedir para adicionar feature, atualizar baseline, ou diagnosticar PR bloqueado por feature não verificada.
Ratchet: feature_list e baseline
Dois contratos legíveis por máquina em .harness/ que ligam sessões dev e sessões QA.
Referência
| Arquivo | Conteúdo |
|---|---|
| reference/schemas.md | Schema de feature_list.json e baseline.json, com exemplo |
| reference/ownership-and-rules.md | Quem escreve o quê (dev vs QA), regras inegociáveis |
| reference/validation-and-flow.md | Validação via check-harness.sh, fluxo completo, por que duas sessões |
Skills relacionadas
- Workflow de PR (validação bloqueante):
workflow-prs - Template de issue (campo
Feature(s)):workflow-issues - Quem escreve em
.gsd/progress:harness-index
Documentos de referência
Quem escreve o quê e regras
fonte ↗Quem escreve o quê e regras
Referência de ratchet-feature-list. Volte ao índice para o quando-invocar.
Quem escreve o quê
| Quem | Escreve | Não pode |
|---|---|---|
| Dev | código, implemented: true, atualizar baseline.json se métricas melhoraram |
editar title/criteria[] de feature existente, virar verified: true, baixar métrica do baseline sem motivo no build log |
| QA | verified: true (ou notas em falha), atualizar progresso |
implementar código, "concordar" com o dev sem rodar critérios contra a app viva |
Regras inegociáveis
titleecriteria[]de uma feature ficam congelados após a issue ser aberta. Se o requisito mudar de verdade: feche a feature e crie uma nova com novo ID.- PR não pode mergear em
developenquanto qualquer feature linkada tiververified: false. - Nenhuma métrica em
baseline.jsonpode regredir sem motivo documentado no body do PR e no build log do mesmo PR. - Sessão dev nunca vira
verified: true— isso é só de QA. - Todo PR voltado para usuário precisa linkar ao menos um feature ID; PRs de chore/tooling/refactor podem não ter nenhum.
Schemas
fonte ↗Schemas
Referência de ratchet-feature-list. Volte ao índice para o quando-invocar.
.harness/feature_list.json
Cada feature do projeto, com critérios observáveis que a sessão QA verifica contra a app rodando.
{
"features": [
{
"id": "F001",
"title": "Login com email/senha",
"criteria": [
"Usuário consegue submeter formulário com email válido e senha",
"Token JWT é armazenado em httpOnly cookie",
"Redirect para /dashboard após sucesso"
],
"implemented": false,
"verified": false
}
]
}
.harness/baseline.json
Valores atuais de métricas de qualidade que só podem melhorar (quality ratchet).
{
"metrics": {
"tests_passing": 142,
"tests_total": 142,
"coverage_pct": 78.4,
"lint_warnings": 0,
"type_errors": 0
}
}
Validação e fluxo
fonte ↗Validação e fluxo
Referência de ratchet-feature-list. Volte ao índice para o quando-invocar.
Validação
scripts/check-harness.sh valida:
- JSON válido em
feature_list.jsonebaseline.json - Integridade do schema
titleecriteria[]congelados em features existentes (compara com branch base)- Sem remoção de feature
- Sem regressão de métrica
baselinevs branch base
Roda:
- Local:
bash scripts/check-harness.sh - CI:
.forgejo/workflows/harness-gate.ymlem todo PR paramainoudevelop
Fluxo
Issue aberta com Feature(s) listadas no body
↓
Sessão dev implementa, marca implemented: true
↓
Atualiza baseline.json se métricas melhoraram
↓
PR aberto → CI valida via check-harness.sh
↓
Senior aprova merge em develop
↓
Sessão QA roda critérios contra app rodando em develop
↓
QA marca verified: true (ou adiciona notes em falha)
↓
PR develop → main pode mergear (só agora)
Por que duas sessões, dois arquivos
A sessão QA não tem memória da conversa do dev. Ela não pode ser "convencida" — só consegue ler o texto literal de criteria[] e tentar reproduzir contra a app viva. Isso impede falsos positivos onde o dev pensa que entregou mas faltou algo.