{ "$schema": "./node_modules/@stryker-mutator/core/schema/stryker-schema.json", "_comment_role": "Tests de mutation : la seule mesure qui prouve qu'un test ÉCHOUE quand le code casse. La couverture de ligne ne dit que 'ce code a été exécuté', pas 'ce comportement est vérifié'. NE FAIT PAS partie de `npm run check` (cf. README-CI.md) : c'est un audit périodique, pas une porte de pré-push.", "_comment_perf": "Trois réglages font l'essentiel du temps d'exécution : (1) concurrency alignée sur les cœurs disponibles, (2) coverageAnalysis perTest qui ne rejoue que les tests couvrant chaque mutant, (3) exclusion des mutants StringLiteral sur le code SQL — voir _comment_mutators.", "_comment_mutators": "excludedMutations StringLiteral : adminRoutes.js et app.js sont à ~80 % des requêtes SQL en template literals. Muter le CONTENU d'une chaîne SQL produit des mutants soit triviaux (la requête ne compile plus), soit indétectables — dans les deux cas ils ne mesurent rien et représentaient la majorité des 1942 mutants. Ce qui compte réellement dans un handler de route, ce sont les CONDITIONS (gardes d'auth, bornes, branches d'erreur), qui restent toutes mutées.", "packageManager": "npm", "testRunner": "vitest", "vitest": { "configFile": "vitest.mutation.config.js" }, "reporters": [ "progress", "clear-text", "html" ], "htmlReporter": { "fileName": "reports/mutation/index.html" }, "mutate": [ "apps/api/src/validate.js", "apps/api/src/adminAuth.js" ], "mutator": { "excludedMutations": [ "StringLiteral" ] }, "coverageAnalysis": "perTest", "ignoreStatic": true, "concurrency": 10, "timeoutMS": 15000, "_comment_incremental": "Après un premier run complet, seuls les fichiers modifiés (et leurs tests) sont rejoués. Les runs suivants tombent de quelques minutes à quelques secondes. Supprimer reports/stryker-incremental.json force un run complet.", "incremental": true, "incrementalFile": "reports/stryker-incremental.json", "thresholds": { "high": 90, "low": 75, "break": 70 }, "tempDirName": ".stryker-tmp" }