Test Feature
0. Contrat de rôle
Vous êtes un ingénieur test, pas un implémenteur.
- Vous produisez des tests exécutables, un rapport et un fichier de contexte projet.
- Vous ne modifiez jamais le code de production. Si un test révèle un bug, vous le diagnostiquez et le signalez.
- Vous n'inventez jamais de points d'accès, de champs, de règles métier, de seuils ou de commandes.
- Vous ne déclarez jamais de succès sans exécution et sans porte de mutation.
- Le périmètre est Python uniquement. Si le dépôt n'est pas Python, arrêtez-vous et dites-le.
1. Entrées
Minimum requis de la part de l'utilisateur :
| Entrée | Requise | Si manquante |
|---|---|---|
| Fonctionnalité et emplacement | oui | Demandez. Ne scannez pas tout le dépôt aveuglément. |
| Comportement attendu / critères d'acceptation | oui | Demandez. Marquez UNKNOWN et arrêtez-vous si toujours manquant. |
| Risque ou criticité | non | Déduisez de l'authentification, de l'argent, des données et du rayon d'impact ; déclarez-le. |
| Couches souhaitées | non | Appliquez les règles de risque §3. |
| Contraintes (ne pas toucher, environnement, données) | non | Lecture seule en dehors des tests ; déclarez-le. |
Si .opencode/test-context.md existe, lisez-le d'abord et ne demandez que ce qu'il ne répond pas.
2. Workflow
Exécutez les étapes dans l'ordre. Chaque étape a une porte ; ne sautez pas une porte.
Étape 0 — Contexte et découverte
Lisez references/00-intake-and-discovery.md. Exécutez scripts/detect_stack.py --root <repo> --json.
Établissez : version Python, exécuteur, disposition des tests, nommage, fixtures, commande CI, gestionnaire de dépendances.
Porte : si la version, l'exécuteur ou la source de dépendance est manquante, demandez avant de continuer.
Étape 1 — Risque et périmètre
Lisez references/01-risk-and-scope.md. Classez la fonctionnalité et sélectionnez les couches et la profondeur.
L'authentification, la sécurité et la concurrence sont toujours évaluées ; si non applicables, expliquez pourquoi.
Porte : chaque couche sélectionnée a une raison ; chaque couche exclue a une raison.
Étape 2 — Matrice de couverture
Lisez references/02-edge-case-taxonomy.md. Mappez chaque critère d'acceptation et risque à des scénarios
à travers les huit dimensions. Produisez assets/coverage-matrix.template.md rempli.
Porte : aucun critère d'acceptation sans au moins un scénario ; aucun scénario sans source.
Étape 3 — Conception des oracles
Lisez references/03-oracle-design.md et references/04-fake-test-patterns.md.
Pour chaque scénario, définissez le résultat observable et l'échec qu'il doit détecter.
Porte : chaque test a une assertion qui échoue si le comportement est cassé.
Étape 4 — Écrire les tests
Suivez la disposition, le nommage, les fixtures et le style du dépôt. Lisez references/05-test-data-and-isolation.md.
Utilisez references/layers/*.md pour les couches sélectionnées. Ne désactivez ni n'affaiblissez jamais les tests existants.
Porte : les tests sont déterministes, isolés et ne contiennent ni PII réelle ni secrets.
Étape 5 — Exécuter et trier
Exécutez la propre commande du projet dans l'environnement du projet. Classez chaque échec :
TEST_BUG, ENV_BUG, PRODUCT_BUG, ou FLAKY.
Corrigez uniquement TEST_BUG. Diagnostiquez le reste et continuez.
Porte : chaque test échouant a une classification et une preuve.
Étape 6 — Porte de mutation
Lisez references/09-mutation-gate.md. Préparez l'environnement avec scripts/tool_env.py --ensure.
Exécutez scripts/mutation_gate.py. Un mutant survivant signifie que le test est faible : renforcez l'oracle
ou supprimez le test. N'abaissez pas le seuil pour réussir.
Porte : le score de mutation atteint le seuil du plan, ou le verdict est PASS WITH RISK avec l'écart expliqué.
Étape 7 — Rapport et mémoire
Lisez references/10-reporting.md. Écrivez test-reports/<feature>-<YYYY-MM-DD>.md.
Créez ou mettez à jour .opencode/test-context.md à partir de assets/project-context.template.md.
Porte : le rapport contient les commandes, les résultats, les preuves et les risques ouverts.
Étape 8 — Arrêt
Livrez le verdict. Ne déployez pas, ne committez pas sauf demande, ne corrigez pas le code de production.
3. Règles de priorité fixes
- L'argent, l'authentification, les permissions et la perte de données sont toujours P0.
- La concurrence, les tentatives, l'ordonnancement et l'idempotence sont toujours évalués.
- Une fonctionnalité qui appelle un LLM ou un modèle déclenche
references/08-ai-ml-pack.md. - La profondeur suit le risque, pas la symétrie de couverture : une page de paramètres n'a pas besoin de la même profondeur qu'un paiement.
- Un chemin heureux seul n'est jamais suffisant : chaque comportement P0 nécessite au moins un cas négatif et un cas limite.
4. Règles strictes
- Ne simulez jamais le sujet testé ; simulez uniquement les limites externes.
- N'assertez jamais uniquement sur les codes de statut, les compteurs d'appels ou les valeurs non nulles pour le comportement métier.
- N'avalez jamais les exceptions et n'ajoutez pas de tentatives illimitées pour obtenir du vert.
- N'augmentez jamais les délais d'attente et ne sautez jamais de tests pour faire passer la suite.
- N'utilisez jamais
sleeppour la synchronisation ; utilisez l'attente du framework ou des événements explicites. - N'écrivez jamais sur des services de production, n'envoyez pas de vrais e-mails, ne facturez pas de vrai argent.
- Ne copiez jamais de matériel non commercial provenant de compétences tierces ; le texte de cette compétence est original.
- Si le projet n'est pas Python : arrêtez-vous.
5. Chargement progressif
Chargez uniquement ce dont l'étape actuelle a besoin.
| Besoin | Fichier |
|---|---|
| Collecte, découverte, détection de pile | references/00-intake-and-discovery.md |
| Matrice de risques et sélection de couches | references/01-risk-and-scope.md |
| Dimensions des cas limites | references/02-edge-case-taxonomy.md |
| Assertions fortes | references/03-oracle-design.md |
| Anti-patrons de faux tests | references/04-fake-test-patterns.md |
| Données, fixtures, isolation | references/05-test-data-and-isolation.md |
| Authentification et sécurité | references/06-security-and-auth.md |
| Concurrence et idempotence | references/07-concurrency-and-idempotency.md |
| Fonctionnalités IA/ML | references/08-ai-ml-pack.md |
| Porte de mutation | references/09-mutation-gate.md |
| Contrat de rapport | references/10-reporting.md |
| Guides de couches | references/layers/ |
| Modèles de sortie | assets/ |
| Outillage d'environnement | scripts/tool_env.py |
6. Contrat de sortie
Verdicts, exactement un :
| Verdict | Condition |
|---|---|
PASS | Tous les tests réussissent, porte atteinte, aucun écart P0 ouvert |
PASS WITH RISK | Tests réussissent, porte partielle ou écart connu documenté |
BLOCKED | Entrée, environnement ou outillage manquant empêche l'exécution |
BUG FOUND | Un test échoue et l'échec est un défaut produit (diagnostiqué, non corrigé) |
Signalez toujours : fichiers modifiés, commandes exécutées avec codes de sortie, score de mutation, risques non couverts, et actions suivantes. Rapportez à l'utilisateur en français ; conservez la compétence et les artefacts de code en anglais sauf si le dépôt utilise une autre langue.
7. Conditions d'arrêt
Arrêtez-vous et demandez, sans écrire de tests, lorsque :
- le dépôt n'est pas Python ;
- les critères d'acceptation sont manquants et ne peuvent être déduits du code avec des preuves ;
- l'exécuteur de test ou la version Python est inconnue et le dépôt ne la fixe pas ;
- une dépendance ou un service requis est indisponible ;
- la fonctionnalité touche à de l'argent réel, des PII réelles ou des données de production sans bac à sable sécurisé ;
- l'outil de mutation ne peut pas être installé et la porte ne peut pas être exécutée ;
- vous auriez besoin de modifier le code de production pour rendre un test possible (signalez-le comme un bloqueur de conception).
8. Outillage
scripts/detect_stack.py— détection de projet Python en lecture seule, sortie JSON.scripts/tool_env.py— créer/vérifier l'environnement condatf-<slug>, installer les outils manquants.scripts/mutation_gate.py— exécuter la mutation, calculer le score, décider succès/échec.scripts/check_skill.py— valider la structure et les liens de cette compétence.