Leitura executiva · ~60 segundos
Especificação, contrato de API, teste, cobertura e eval respondem a perguntas distintas. Um pipeline verificável liga cada propriedade ao subject, ao mecanismo, à evidência e à decisão que o resultado pode liberar; proximidade entre checks não cria equivalência semântica.
Equipes que adotam IA aprendem rapidamente a pedir evidência antes de aceitar uma mudança. O problema começa quando evidências diferentes são comprimidas em uma única palavra: “verde”. A suíte passou, a cobertura subiu, o contrato existe, o schema é válido e o eval melhorou. Logo, conclui-se que o sistema está correto.
Essa conclusão não acompanha as premissas. Cada mecanismo responde a uma pergunta diferente. Quando tratamos proximidade no pipeline como equivalência semântica, construímos um painel bonito para uma certeza que nunca foi produzida.
Spec-driven não significa escrever uma especificação e confiar nela. Significa manter uma cadeia rastreável entre intenção, propriedades, mecanismos de verificação, evidências e decisão de aceite.
Resumo executivo
Uma descrição OpenAPI informa como consumidores e ferramentas podem compreender uma interface HTTP; um diff de compatibilidade procura mudanças estruturais; um teste executado observa comportamento; uma métrica de cobertura informa o que foi exercitado; e um eval mede uma propriedade comportamental sob um conjunto de tarefas e graders. São camadas complementares, não substitutas. [API31-C1]
Mesmo dentro de uma única camada existem limites. O oasdiff documenta comparação de OpenAPI 3.1 e regras de breaking change, mas um diff verde não certifica compatibilidade de negócio. Percentual de cobertura, por sua vez, não prova relevância dos testes, correção nem cobertura de risco. [API31-C2] [API31-C4]
O desenho responsável começa por uma pergunta simples: qual propriedade este verde realmente autoriza afirmar? A resposta deve estar explícita antes do pipeline rodar.
Cinco mecanismos, cinco perguntas
| Mecanismo | Pergunta que responde | Não autoriza concluir |
|---|---|---|
| Spec | o comportamento desejado foi declarado? | que a implementação o cumpre |
| Contrato de API | a interface tem forma versionada e compreensível? | que a regra de negócio está correta |
| Teste | este exemplo executado produziu o resultado esperado? | que todos os riscos foram cobertos |
| Cobertura | quais partes foram exercitadas? | que os testes são relevantes ou suficientes |
| Eval | como o sistema se comportou neste banco, grader e ambiente? | que o comportamento generaliza universalmente |
A tabela não cria uma hierarquia fixa. Em uma biblioteca pura, contrato e teste unitário podem ser o centro. Em um agente que altera dados, policy, sandbox, eval e observabilidade podem ser mais importantes. A composição depende do risco.
Comece pela propriedade, não pela ferramenta
“Adicionar eval” não é um requisito verificável. “Em cem cenários representativos, o agente nunca envia uma mensagem sem consentimento válido e toda tentativa bloqueada gera evidência atribuível” é uma propriedade candidata.
Para cada propriedade, registre:
- subject — qual versão do sistema está sendo examinada;
- estímulo — tarefa, entrada e ambiente;
- oráculo — quem ou o que decide o resultado;
- limite — qual condição precisa ser satisfeita;
- evidência — onde o resultado imutável pode ser inspecionado;
- autoridade — qual decisão o verde pode liberar.
Sem subject, um relatório pode pertencer ao commit errado. Sem oráculo, a saída vira opinião. Sem limite, qualquer número pode ser chamado de melhora. Sem autoridade, o verde existe mas ninguém sabe o que ele desbloqueia.
OpenAPI é descrição; compatibilidade é uma decisão maior
A especificação OpenAPI define uma descrição de interface independente de linguagem para que pessoas e computadores compreendam capacidades de um serviço. Isso reduz ambiguidade na integração, mas não carrega toda a semântica de negócio.
Considere um campo limite_aprovado que continua numérico e obrigatório. A API pode permanecer estruturalmente compatível enquanto uma mudança de unidade, política ou arredondamento quebra a operação. O diff estrutural merece ficar verde; o teste de invariant de negócio merece falhar. São resultados coerentes porque examinam propriedades diferentes.
O erro não está na ferramenta. Está em apresentar “sem breaking change” como “sem impacto”.
Cobertura é mapa, não veredito
Cobertura mostra áreas visitadas durante a execução. Ela ajuda a localizar silêncio: branches nunca exercitados, módulos esquecidos, deltas sem teste. Mas uma linha executada pode estar mal verificada; um teste pode reproduzir a implementação em vez do requisito; um caso crítico pode representar uma fração pequena do código.
Na FORGE, a leitura útil separa ao menos linha, branch, escopo, delta e threshold. Ainda assim, esses campos são sinais de teste, não de risco resolvido. [API31-C4]
Para não transformar porcentagem em teatro:
- ligue cenários críticos às propriedades que protegem;
- use cobertura para descobrir lacunas, não para declarar correção;
- trate código novo e risco alto de forma diferente do histórico;
- exija evidência do teste que falha quando a propriedade é violada.
Eval é um experimento versionado
Um eval precisa de banco de tarefas, ambiente, configuração do sistema, grader, regra de agregação e baseline. Alterar qualquer um desses elementos muda o experimento.
Um número agregado pode esconder classes de falha. Um agente pode melhorar a média e piorar casos irreversíveis. Um grader por modelo pode preferir estilo e perder fatos. Um benchmark pode conter tarefas quebradas. Por isso, eval não é uma medalha; é uma infraestrutura de decisão.
O painel mínimo registra:
| Campo | Exemplo |
|---|---|
| Banco | 120 tarefas versionadas por domínio e risco |
| Ambiente | ferramentas, dados sintéticos e políticas disponíveis |
| Sistema | modelo, prompt, harness e commit |
| Graders | determinístico, modelo e revisão humana amostral |
| Métricas | sucesso por classe, falha crítica, custo e latência |
| Decisão | promover, manter shadow, corrigir ou bloquear |
O teste mais importante: violar a propriedade
Um gate só demonstra força quando a condição proibida o faz falhar. Antes de confiar no pipeline, execute um caso negativo deliberado:
- remova um campo obrigatório e confirme a falha de contrato;
- introduza uma mudança incompatível e confirme o diff;
- apague o teste de uma branch crítica e observe a cobertura;
- faça o agente tentar ultrapassar uma authority e confirme o bloqueio;
- troque o subject da evidência e confirme que o binding falha.
O caso negativo distingue mecanismo executável de documentação aspiracional.
Uma matriz de evidência para o PR
| Propriedade | Mecanismo | Evidência | Limite | Decisão |
|---|---|---|---|---|
| interface não perde campo obrigatório | contract diff | relatório ligado ao spec digest | zero ruptura classificada como blocking | merge bloqueado |
| regra calcula valor correto | testes de exemplo e propriedade | suíte ligada ao commit | todos os invariants críticos passam | merge liberado |
| comportamento do agente preserva policy | eval + casos adversariais | resultados por tarefa e trace | zero ação externa sem grant | promoção bloqueada |
| regressão não volta | teste negativo | caso reproduz a falha anterior | vermelho antes, verde depois | incidente encerrável |
A matriz não precisa cobrir cada linha do produto. Precisa cobrir as propriedades que sustentam a decisão sendo tomada.
O que este artigo prova — e o que não prova
As fontes e os contratos da FORGE sustentam a separação entre descrição, diff, execução, cobertura e eval. Elas não definem uma receita universal de ferramentas, thresholds ou número de testes. Um produto regulado e um protótipo interno precisam de perfis diferentes.
Também não existe independência automática porque um segundo modelo avaliou o primeiro. Se ambos compartilham contexto, incentivo, erro ou autoridade, há separação de chamadas, não necessariamente separação de controle.
Conclusão
Spec-driven é uma disciplina de rastreabilidade, não um selo.
Uma especificação declara intenção. Um contrato estrutura uma interface. Um teste observa exemplos. Cobertura revela áreas exercitadas. Um eval mede comportamento em um experimento. Quando cada verde mantém sua pergunta, seu subject e seu limite, o conjunto pode sustentar uma decisão defensável.
Quando todos viram apenas “CI passou”, o sistema perde exatamente a precisão que a engenharia deveria criar.
Leitura anterior: Engineering harness na prática. Próxima leitura: *Autonomia proporcional ao risco*, em 18/08 na Trustyu Forge.
Nota editorial e de responsabilidade
- Corte da pesquisa
- Última revisão
- Correções registradas
- Nenhuma correção registrada.
Este artigo combina fontes citadas, análise e experiência profissional do autor. Dados e afirmações factuais verificáveis estão vinculados às respectivas fontes. Interpretações, hipóteses, projeções, recomendações e opiniões representam o ponto de vista profissional do autor no momento da publicação; não constituem fatos comprovados, promessa de resultado nem aconselhamento jurídico, financeiro ou técnico aplicável a um caso específico. Consulte as fontes originais e profissionais habilitados antes de tomar decisões.
Claims e fontes
API31-C1
A versioned API description, a compatibility diff and an executed request specification are separate evidence layers; FORGE should keep them distinct and bind each result to the same contract version.
Limite: The selected positive intake covers official AsyncAPI 3.1.0 repository and schema artifacts, not the normative spec/asyncapi.md source of truth. OpenAPI 3.1.2 also remains a candidate not admitted by the v1 fetch policy, so this claim asserts neither AsyncAPI nor OpenAPI conformance. This is a source-bound design input; it does not prove product adoption, operational maturity, independent attestation, search ranking, AI citation or outcome.
- AsyncAPI Initiative — AsyncAPI Initiative, Apache-2.0
- AsyncAPI Initiative — AsyncAPI Initiative, Apache-2.0
- oasdiff — oasdiff, Apache-2.0
- rswag — rswag, MIT
API31-C2
oasdiff v1.27.0 documents OpenAPI 3.1 comparison and breaking-change rules; this is a useful CI control, not proof of semantic or business compatibility.
Limite: This claim describes oasdiff only. Rule coverage can lag a specification or miss domain invariants, and a green diff cannot certify business compatibility. This is a source-bound design input; it does not prove product adoption, operational maturity, independent attestation, search ranking, AI citation or outcome.
API31-C4
FORGE coverage evidence should be tool-neutral and normalize at least line, branch, scope, delta and threshold fields; SimpleCov and coverage.py remain language adapters, while an interchange report is not a quality verdict.
Limite: The exact normalized FORGE schema remains a framework decision. Coverage percentage cannot prove test relevance, correctness, risk coverage or absence of defects. This is a source-bound design input; it does not prove product adoption, operational maturity, independent attestation, search ranking, AI citation or outcome.
- Ruby — Ruby, Ruby-License-or-BSD-2-Clause
- SimpleCov — SimpleCov, MIT
- coverage.py — coverage.py, Apache-2.0
- GitHub — GitHub, CC-BY-4.0
- Cobertura — Cobertura, GPL-2.0