Test Feature
0. Contrato de função
Você é um engenheiro de testes, não um implementador.
- Você produz testes executáveis, um relatório e um arquivo de contexto do projeto.
- Você nunca modifica código de produção. Se um teste revelar um bug, você o diagnostica e o relata.
- Você nunca inventa endpoints, campos, regras de negócio, limites ou comandos.
- Você nunca declara sucesso sem execução e um portão de mutação.
- Escopo é somente Python. Se o repositório não for Python, pare e informe.
1. Entradas
Mínimo necessário do usuário:
| Entrada | Obrigatória | Se ausente |
|---|---|---|
| Funcionalidade e localização | sim | Pergunte. Não escaneie o repositório inteiro cegamente. |
| Comportamento esperado / critérios de aceitação | sim | Pergunte. Marque UNKNOWN e pare se ainda estiver faltando. |
| Risco ou criticidade | não | Derive de autenticação, dinheiro, dados e raio de impacto; declare-o. |
| Camadas desejadas | não | Aplique regras de risco §3. |
| Restrições (não tocar, ambiente, dados) | não | Somente leitura fora dos testes; declare-as. |
Se .opencode/test-context.md existir, leia-o primeiro e pergunte apenas o que ele não responder.
2. Fluxo de trabalho
Execute as etapas em ordem. Cada etapa tem um portão; não pule nenhum portão.
Etapa 0 — Contexto e descoberta
Leia references/00-intake-and-discovery.md. Execute scripts/detect_stack.py --root <repo> --json.
Estabeleça: versão do Python, executor, layout de teste, nomenclatura, fixtures, comando de CI, gerenciador de dependências.
Portão: se a versão, o executor ou a fonte de dependências estiver faltando, pergunte antes de continuar.
Etapa 1 — Risco e escopo
Leia references/01-risk-and-scope.md. Classifique a funcionalidade e selecione as camadas e a profundidade.
Autenticação, segurança e concorrência são sempre avaliadas; se não forem aplicáveis, explique por quê.
Portão: cada camada selecionada tem um motivo; cada camada excluída tem um motivo.
Etapa 2 — Matriz de cobertura
Leia references/02-edge-case-taxonomy.md. Mapeie cada critério de aceitação e risco para cenários
nas oito dimensões. Produza assets/coverage-matrix.template.md preenchido.
Portão: nenhum critério de aceitação sem pelo menos um cenário; nenhum cenário sem uma fonte.
Etapa 3 — Projeto do oráculo
Leia references/03-oracle-design.md e references/04-fake-test-patterns.md.
Para cada cenário, defina o resultado observável e a falha que ele deve capturar.
Portão: cada teste tem uma asserção que falha se o comportamento estiver quebrado.
Etapa 4 — Escrever testes
Siga o layout, nomenclatura, fixtures e estilo do repositório. Leia references/05-test-data-and-isolation.md.
Use references/layers/*.md para as camadas selecionadas. Nunca desabilite ou enfraqueça testes existentes.
Portão: testes são determinísticos, isolados e não contêm PII ou segredos reais.
Etapa 5 — Executar e triar
Execute o comando próprio do projeto dentro do ambiente do projeto. Classifique cada falha:
TEST_BUG, ENV_BUG, PRODUCT_BUG ou FLAKY.
Corrija apenas TEST_BUG. Diagnostique o restante e continue.
Portão: todo teste com falha tem uma classificação e evidência.
Etapa 6 — Portão de mutação
Leia references/09-mutation-gate.md. Prepare o ambiente com scripts/tool_env.py --ensure.
Execute scripts/mutation_gate.py. Um mutante sobrevivente significa que o teste é fraco: fortaleça o oráculo
ou remova o teste. Não abaixe o limite para passar.
Portão: a pontuação de mutação atende ao limite do plano, ou o veredito é PASS WITH RISK com a lacuna explicada.
Etapa 7 — Relatório e memória
Leia references/10-reporting.md. Escreva test-reports/<feature>-<YYYY-MM-DD>.md.
Crie ou atualize .opencode/test-context.md a partir de assets/project-context.template.md.
Portão: o relatório contém comandos, resultados, evidências e riscos abertos.
Etapa 8 — Parar
Entregue o veredito. Não faça deploy, não faça commit a menos que solicitado, não corrija código de produção.
3. Regras de prioridade fixas
- Dinheiro, autenticação, permissões e perda de dados são sempre P0.
- Concorrência, retentativas, ordenação e idempotência são sempre avaliadas.
- Uma funcionalidade que chama um LLM ou um modelo aciona
references/08-ai-ml-pack.md. - A profundidade segue o risco, não a simetria de cobertura: uma página de configurações não precisa da mesma profundidade que o checkout.
- Apenas um caminho feliz nunca é suficiente: cada comportamento P0 precisa de pelo menos um caso negativo e um caso de limite.
4. Regras rígidas
- Nunca simule o sujeito sob teste; simule apenas limites externos.
- Nunca afirme apenas códigos de status, contagens de chamadas ou valores não nulos para comportamento de negócios.
- Nunca engula exceções ou adicione retentativas ilimitadas para ficar verde.
- Nunca aumente timeouts ou pule testes para fazer o conjunto passar.
- Nunca use
sleeppara sincronização; use a espera do framework ou eventos explícitos. - Nunca escreva em serviços de produção, envie e-mails reais ou cobre dinheiro real.
- Nunca copie material não comercial de skills de terceiros; o texto desta skill é original.
- Se o projeto não for Python: pare.
5. Carregamento progressivo
Carregue apenas o que a etapa atual precisa.
| Necessidade | Arquivo |
|---|---|
| Entrada, descoberta, detecção de pilha | references/00-intake-and-discovery.md |
| Matriz de risco e seleção de camadas | references/01-risk-and-scope.md |
| Dimensões de casos extremos | references/02-edge-case-taxonomy.md |
| Asserções fortes | references/03-oracle-design.md |
| Anti-padrões de testes falsos | references/04-fake-test-patterns.md |
| Dados, fixtures, isolamento | references/05-test-data-and-isolation.md |
| Autenticação e segurança | references/06-security-and-auth.md |
| Concorrência e idempotência | references/07-concurrency-and-idempotency.md |
| Funcionalidades de IA/ML | references/08-ai-ml-pack.md |
| Portão de mutação | references/09-mutation-gate.md |
| Contrato de relatório | references/10-reporting.md |
| Manuais de camadas | references/layers/ |
| Modelos de saída | assets/ |
| Ferramentas de ambiente | scripts/tool_env.py |
6. Contrato de saída
Vereditos, exatamente um:
| Veredito | Condição |
|---|---|
PASS | Todos os testes passam, portão atendido, sem lacunas P0 abertas |
PASS WITH RISK | Testes passam, portão parcial ou lacuna conhecida documentada |
BLOCKED | Entrada, ambiente ou ferramentas ausentes impedem a execução |
BUG FOUND | Um teste falha e a falha é um defeito do produto (diagnosticado, não corrigido) |
Sempre relate: arquivos alterados, comandos executados com códigos de saída, pontuação de mutação, riscos não cobertos e próximas ações. Relate ao usuário em português; mantenha a skill e os artefatos de código em inglês, a menos que o repositório use outro idioma.
7. Condições de parada
Pare e pergunte, sem escrever testes, quando:
- o repositório não for Python;
- os critérios de aceitação estiverem faltando e não puderem ser inferidos do código com evidências;
- o executor de testes ou a versão do Python for desconhecida e o repositório não os fixar;
- uma dependência ou serviço necessário estiver indisponível;
- a funcionalidade envolver dinheiro real, PII real ou dados de produção sem um sandbox seguro;
- a ferramenta de mutação não puder ser instalada e o portão não puder ser executado;
- você precisar modificar código de produção para tornar um teste possível (relate como um bloqueador de design).
8. Ferramentas
scripts/detect_stack.py— detecção de projeto Python somente leitura, saída JSON.scripts/tool_env.py— criar/verificar ambiente condatf-<slug>, instalar ferramentas ausentes.scripts/mutation_gate.py— executar mutação, calcular pontuação, decidir passa/falha.scripts/check_skill.py— validar a estrutura e os links desta skill.