gestion_table_tournante_libre/audit/mutation-moteur.md
Mathieu Benoit aaa2c1a3a7 [IMP] mutation: count long-series kills apart, test the audit end to end
A mutant the node series missed but the long series killed was still
counted as a survivor, so the committed audit overstated what escapes
the tests. It now has its own column: 15 of the 137 survivors move
there, leaving 122; the committed files are regenerated from their own
results, without a rerun. The audit itself now runs in the long series
on a small fixture tree: long-series replay, exit code 0 with
survivors, exit 2 and nothing written when the baseline fails. The
committed audit files are read back and must match what rediger writes.
Checked: 3868 node and 105 long tests from the index alone.

--- FR ---

[IMP] mutation : tués par la série longue à part, audit éprouvé entier

Un mutant que la série node manquait et que la série longue tuait
comptait encore comme survivant : l'audit commis surestimait ce qui
échappe aux épreuves. Il a sa colonne : 15 des 137 survivants y passent,
il en reste 122 ; les fichiers commis sont réengendrés de leurs propres
résultats, sans rejeu. L'audit tourne entier dans la série longue sur un
petit arbre : rejeu long, sortie 0 avec survivants, sortie 2 et rien
d'écrit quand la ligne de base tombe. Les fichiers commis sont relus et
doivent égaler ce que rediger écrit.
Vérifié : 3868 node et 105 longues depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 18:51:43 -04:00

45 KiB
Raw Blame History

Audit par mutation du moteur

Écrit par make mutation (scripts/mutation/audit.js, § 14.13) ; ne se modifie pas à la main.

version 2026.10.05.01
périmètre src/moteur
sources et épreuves du périmètre (SHA-256) 03c4a69b22d817acb42df47fd69ad536ed9c59cec709217ba3d165300f404715
Node v26.10.0

Chaque mutant se joue contre les épreuves de la série node qui atteignent son module, sous node --test. Un survivant se rejoue contre les épreuves longues qui atteignent son module avant d’être compté : tué par elles, il se compte à part. Un survivant sur une ligne couverte désigne une épreuve qui exécute sans affirmer.

Bilan

mutants tués tués par la série longue survivants équivalents délais erreurs
2576 2171 15 122 61 207 0

Par fichier

fichier total tués tués par la série longue survivants équivalents délais erreurs
src/moteur/classement.js 45 38 0 0 5 2 0
src/moteur/configuration.js 407 365 0 11 0 31 0
src/moteur/conflits.js 24 24 0 0 0 0 0
src/moteur/diagnostic.js 383 312 0 45 0 26 0
src/moteur/indicateurs.js 325 281 0 0 18 26 0
src/moteur/manque.js 162 148 0 0 9 5 0
src/moteur/plafond.js 397 305 2 0 29 61 0
src/moteur/recherche.js 648 530 13 56 0 49 0
src/moteur/verification.js 185 168 0 10 0 7 0

Par opérateur

opérateur total tués tués par la série longue survivants équivalents délais erreurs
arithmetique 287 270 0 8 7 2 0
frontiere 165 113 2 29 20 1 0
negation 343 314 0 5 0 24 0
logique 77 71 0 3 0 3 0
retrait-non 36 36 0 0 0 0 0
mise-a-jour 158 84 2 0 0 72 0
nombre-plus-un 540 469 9 38 20 4 0
nombre-zero 291 184 0 6 5 96 0
booleen 22 22 0 0 0 0 0
si-vrai 186 170 2 7 6 1 0
si-faux 186 174 0 9 1 2 0
ternaire-vrai 39 35 0 4 0 0 0
ternaire-faux 39 37 0 2 0 0 0
min-max 21 19 0 1 1 0 0
corps-si 186 173 0 10 1 2 0

Survivants (122), lignes couvertes d’abord

lieu opérateur avant après ligne couverte série longue
src/moteur/configuration.js:58:20 nombre-plus-un 2 3 oui survit
src/moteur/configuration.js:76:37 ternaire-vrai typeof valeur === 'string' true oui survit
src/moteur/configuration.js:108:7 si-faux typeof contraintes !== 'object' || contraintes === null false oui survit
src/moteur/configuration.js:108:39 logique typeof contraintes !== 'object' || contraintes === null ((typeof contraintes !== 'object' )&&( contraintes === null… oui survit
src/moteur/configuration.js:108:64 corps-si { throw new TypeError('configuration.contraintes : objet at… {} oui survit
src/moteur/configuration.js:204:21 frontiere < <= oui survit
src/moteur/configuration.js:207:11 si-vrai t !== LIBRE true oui survit
src/moteur/configuration.js:210:21 frontiere < <= oui survit
src/moteur/configuration.js:242:17 corps-si { statut[p] = STATUT.MOBILE; } {} oui survit
src/moteur/configuration.js:307:27 arithmetique - + oui survit
src/moteur/configuration.js:431:23 frontiere < <= oui survit
src/moteur/diagnostic.js:91:7 si-faux T === 0 false oui survit
src/moteur/diagnostic.js:91:13 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:91:16 corps-si return 0; {} oui survit
src/moteur/diagnostic.js:91:23 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:95:18 nombre-zero 1 0 oui survit
src/moteur/diagnostic.js:95:23 frontiere < <= oui survit
src/moteur/diagnostic.js:95:51 frontiere < <= oui survit
src/moteur/diagnostic.js:123:22 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:162:31 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:174:21 frontiere < <= oui survit
src/moteur/diagnostic.js:195:25 nombre-plus-un 2 3 oui survit
src/moteur/diagnostic.js:205:53 arithmetique - + oui survit
src/moteur/diagnostic.js:232:7 si-faux lignes.length === 0 false oui survit
src/moteur/diagnostic.js:232:28 corps-si return lignes; {} oui survit
src/moteur/diagnostic.js:234:109 frontiere <= < oui survit
src/moteur/diagnostic.js:235:25 min-max max min oui survit
src/moteur/diagnostic.js:236:55 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:239:39 arithmetique - + oui survit
src/moteur/diagnostic.js:239:41 nombre-zero 1 0 oui survit
src/moteur/diagnostic.js:239:80 arithmetique + - oui survit
src/moteur/diagnostic.js:243:43 logique ligne.tablesManquantes === null && !sansRemede.has(ligne.gr… ((ligne.tablesManquantes === null )||( !sansRemede.has(lign… oui survit
src/moteur/diagnostic.js:243:76 logique ligne.tablesManquantes === null && !sansRemede.has(ligne.gr… ((ligne.tablesManquantes === null && !sansRemede.has(ligne.… oui survit
src/moteur/diagnostic.js:243:81 frontiere <= < oui survit
src/moteur/diagnostic.js:258:22 arithmetique - + oui survit
src/moteur/diagnostic.js:258:24 nombre-zero 1 0 oui survit
src/moteur/diagnostic.js:258:33 frontiere >= > oui survit
src/moteur/diagnostic.js:258:36 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:258:48 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:286:16 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:286:21 frontiere < <= oui survit
src/moteur/diagnostic.js:286:85 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:288:21 frontiere < <= oui survit
src/moteur/diagnostic.js:288:31 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:336:7 si-faux mobile === -1 false oui survit
src/moteur/diagnostic.js:336:19 nombre-plus-un 1 2 oui survit
src/moteur/diagnostic.js:336:22 corps-si return null; {} oui survit
src/moteur/diagnostic.js:348:9 si-vrai passant === undefined true oui survit
src/moteur/diagnostic.js:355:45 frontiere < <= oui survit
src/moteur/diagnostic.js:365:21 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:366:21 nombre-plus-un 0 1 oui survit
src/moteur/diagnostic.js:368:16 frontiere < <= oui survit
src/moteur/diagnostic.js:369:9 si-vrai valeur > max true oui survit
src/moteur/diagnostic.js:369:9 si-faux valeur > max false oui survit
src/moteur/diagnostic.js:369:16 frontiere > >= oui survit
src/moteur/diagnostic.js:369:23 corps-si max = valeur; {} oui survit
src/moteur/recherche.js:143:18 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:160:20 nombre-plus-un 0xffff 65536 oui survit
src/moteur/recherche.js:160:20 nombre-zero 0xffff 0 oui survit
src/moteur/recherche.js:165:3 ternaire-vrai typeof valeur === 'number' true oui survit
src/moteur/recherche.js:165:3 ternaire-faux typeof valeur === 'number' false oui survit
src/moteur/recherche.js:165:17 negation === !== oui survit
src/moteur/recherche.js:200:36 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:201:21 frontiere < <= oui survit
src/moteur/recherche.js:204:16 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:204:21 frontiere < <= oui survit
src/moteur/recherche.js:204:75 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:214:21 frontiere < <= oui survit
src/moteur/recherche.js:217:23 frontiere < <= oui survit
src/moteur/recherche.js:241:21 frontiere < <= oui survit
src/moteur/recherche.js:247:21 frontiere < <= oui survit
src/moteur/recherche.js:252:19 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:269:37 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:285:13 frontiere > >= oui survit
src/moteur/recherche.js:301:23 frontiere > >= oui survit
src/moteur/recherche.js:317:15 frontiere < <= oui survit
src/moteur/recherche.js:317:15 negation < >= oui survit
src/moteur/recherche.js:325:13 frontiere > >= oui survit
src/moteur/recherche.js:351:9 si-faux s === exclu false oui survit
src/moteur/recherche.js:351:22 corps-si continue; {} oui survit
src/moteur/recherche.js:417:13 ternaire-vrai R <= UINT16_MAX true oui survit
src/moteur/recherche.js:417:13 ternaire-faux R <= UINT16_MAX false oui survit
src/moteur/recherche.js:417:15 frontiere <= < oui survit
src/moteur/recherche.js:417:15 negation <= > oui survit
src/moteur/recherche.js:417:74 arithmetique * / oui survit
src/moteur/recherche.js:424:31 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:452:13 si-vrai q !== FANTOME true oui survit
src/moteur/recherche.js:491:17 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:494:16 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:494:42 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:535:18 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:536:16 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:542:18 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:547:9 si-vrai mouvement !== null true oui survit
src/moteur/recherche.js:560:34 nombre-plus-un 1 2 oui survit
src/moteur/recherche.js:664:23 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:670:16 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:721:16 nombre-plus-un 0 1 oui survit
src/moteur/recherche.js:779:21 frontiere < <= oui survit
src/moteur/recherche.js:782:11 si-vrai t !== RESERVE true oui survit
src/moteur/recherche.js:813:7 si-faux m < 2 false oui survit
src/moteur/recherche.js:813:9 frontiere < <= oui survit
src/moteur/recherche.js:813:11 nombre-plus-un 2 3 oui survit
src/moteur/recherche.js:813:11 nombre-zero 2 0 oui survit
src/moteur/recherche.js:813:14 corps-si return null; {} oui survit
src/moteur/recherche.js:818:7 si-faux siege[base + a] === FANTOME && siege[base + b] === FANTOME false oui survit
src/moteur/recherche.js:818:18 arithmetique + - oui survit
src/moteur/recherche.js:818:23 negation === !== oui survit
src/moteur/recherche.js:818:49 arithmetique + - oui survit
src/moteur/recherche.js:818:54 negation === !== oui survit
src/moteur/recherche.js:818:67 corps-si return null; {} oui survit
src/moteur/recherche.js:832:7 si-vrai mouvement !== null true oui survit
src/moteur/verification.js:25:21 nombre-plus-un 2 3 oui survit
src/moteur/verification.js:157:17 nombre-plus-un 1 2 oui survit
src/moteur/verification.js:157:17 nombre-zero 1 0 oui survit
src/moteur/verification.js:164:17 ternaire-vrai i < tableDeListe.length true oui survit
src/moteur/verification.js:164:19 frontiere < <= oui survit
src/moteur/verification.js:167:13 si-faux p < 0 false oui survit
src/moteur/verification.js:167:20 corps-si continue; {} oui survit
src/moteur/verification.js:168:24 nombre-plus-un 1 2 oui survit
src/moteur/verification.js:169:50 nombre-plus-un 1 2 oui survit
src/moteur/verification.js:174:44 frontiere < <= oui survit

Tués par la série longue (15)

Survivants de la série node que les épreuves longues tuent : la série node exécute leur ligne sans l’affirmer.

lieu opérateur avant après ligne couverte
src/moteur/plafond.js:268:9 si-vrai plafond === undefined true oui
src/moteur/plafond.js:285:16 frontiere > >= oui
src/moteur/recherche.js:215:18 nombre-plus-un 0 1 oui
src/moteur/recherche.js:223:23 nombre-plus-un 1 2 oui
src/moteur/recherche.js:241:31 nombre-plus-un 1 2 oui
src/moteur/recherche.js:242:23 frontiere < <= oui
src/moteur/recherche.js:253:16 nombre-plus-un 0 1 oui
src/moteur/recherche.js:253:31 nombre-plus-un 1 2 oui
src/moteur/recherche.js:299:20 mise-a-jour += -= oui
src/moteur/recherche.js:302:31 mise-a-jour += -= oui
src/moteur/recherche.js:353:9 si-vrai q !== FANTOME true oui
src/moteur/recherche.js:551:50 nombre-plus-un 0 1 oui
src/moteur/recherche.js:551:62 nombre-plus-un 0 1 oui
src/moteur/recherche.js:551:69 nombre-plus-un 0 1 oui
src/moteur/recherche.js:772:34 nombre-plus-un 0 1 oui

Mutants équivalents (61)

Déclarés dans audit/mutants-equivalents.json, avec leur raison.

lieu opérateur avant après raison
src/moteur/classement.js:43:61 frontiere > >= classement.js, plusGrand, valeur >= plus : à égalité, l'affectation écrit la valeur déjà retenue.
src/moteur/classement.js:95:21 frontiere < <= classement.js, comparerCles, i <= a.length : a[length] et b[length] sont tous deux undefined, donc égaux ; la boucle finit et rend 0, comme sans le tour de trop.
src/moteur/classement.js:96:36 frontiere < <= classement.js, comparerCles, a[i] <= b[i] sous a[i] !== b[i] : pour deux nombres différents, <= et < coïncident. Une clé ne mêle jamais null et nombre : le premier critère vaut null pour une liste d'écarts vide, et toutes les entrées ont des listes de même longueur (exigerMemeTaille), toutes vides ou aucune.
src/moteur/classement.js:96:46 nombre-plus-un 1 2 classement.js, comparerCles, −2 au lieu de −1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant.
src/moteur/classement.js:96:50 nombre-plus-un 1 2 classement.js, comparerCles, 2 au lieu de 1 : le résultat ne se lit que par son signe, dans sort et dans le || du départage par identifiant.
src/moteur/indicateurs.js:136:21 nombre-plus-un 1 2 indicateurs.js, parcourirTours, visites[t] += 2 au lieu de 1 : visites[t] ne se lit que par visites[t] > 0 et se remet à 0 après chaque personne ; un pas de 2 garde le signe, aucune sortie ne change.
src/moteur/indicateurs.js:137:40 nombre-plus-un 1 2 indicateurs.js, parcourirTours, reserveeAvant[t] = 2 au lieu de 1 : la marque ne se lit que par reserveeAvant[t] === 0.
src/moteur/indicateurs.js:139:23 frontiere < <= indicateurs.js, parcourirTours, remise à zéro jusqu'à r <= R : le tour de trop lit la première case de la personne suivante, dont la table vaut 0 dans visites et reserveeAvant sauf si la personne courante l'a visitée, auquel cas la boucle la remet à 0 de toute façon ; pour la dernière personne la case est undefined, et une écriture à l'index undefined pose une propriété hors des éléments du tableau typé, que rien ne lit.
src/moteur/indicateurs.js:141:11 si-faux t === RESERVE false indicateurs.js, parcourirTours, remise à zéro sans le continue des cases RESERVE : la case −1 écrit visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien.
src/moteur/indicateurs.js:141:26 corps-si continue; {} indicateurs.js, parcourirTours, if (t === RESERVE) {} : même effet que le mutant si-faux du même if — visites[−1] et reserveeAvant[−1] ; un index hors des éléments d'un tableau typé n'écrit rien.
src/moteur/indicateurs.js:169:25 frontiere < <= indicateurs.js, parcourirTours, i <= liste.length : le tour de trop lit a = undefined ; revenu[NaN] et fixe[NaN] sont undefined, rien n'est poussé, et la boucle intérieure part de j = length + 1, au-delà de la liste.
src/moteur/indicateurs.js:174:31 frontiere < <= indicateurs.js, parcourirTours, j <= liste.length : le tour de trop lit b = undefined ; k = rangPaire(N, a, undefined) vaut NaN, parPaire[NaN] et libre[NaN] n'écrivent rien sur un tableau typé, groupe[undefined] n'égale aucun groupe et parPaire[NaN] >= 2 est faux : ni collègue ni revue n'est poussé.
src/moteur/indicateurs.js:212:23 nombre-plus-un 1 2 indicateurs.js, lirePaires, vu[p * G + g] = 2 au lieu de 1 : la marque ne se lit que par === 0.
src/moteur/indicateurs.js:218:21 frontiere < <= indicateurs.js, lirePaires, a <= N : pour a = N, la boucle intérieure (b de N + 1 à N − 1) ne tourne pas, et k n'avance pas.
src/moteur/indicateurs.js:224:13 frontiere > >= indicateurs.js, lirePaires, n >= maxRencontresPaire : à égalité, l'affectation écrit la valeur déjà retenue.
src/moteur/indicateurs.js:237:32 arithmetique - + indicateurs.js, lireTours, nombrePaires = N(N + 1)/2 : ne dimensionne que collegueVu et revueVue, indexés par rangPaire, toujours < N(N − 1)/2 ; un tableau plus long garde les mêmes cases utiles, les autres ne se lisent jamais.
src/moteur/indicateurs.js:237:34 nombre-zero 1 0 indicateurs.js, lireTours, nombrePaires = N·N/2 : même raison que N(N + 1)/2 — une longueur au moins égale (tronquée à l'entier par le constructeur du tableau typé) pour des index rangPaire < N(N − 1)/2.
src/moteur/indicateurs.js:237:38 arithmetique / * indicateurs.js, lireTours, nombrePaires = 2N(N − 1) : longueur au moins égale à N(N − 1)/2, mêmes cases utiles, les autres jamais lues.
src/moteur/indicateurs.js:251:27 nombre-plus-un 1 2 indicateurs.js, lireTours, collegueVu[k] = 2 au lieu de 1 : la marque ne se lit que par === 0.
src/moteur/indicateurs.js:258:25 nombre-plus-un 1 2 indicateurs.js, lireTours, revueVue[k] = 2 au lieu de 1 : la marque ne se lit que par === 0.
src/moteur/indicateurs.js:274:31 frontiere < <= indicateurs.js, ajouter, valeur <= min : à égalité, le minimum retenu est la même valeur.
src/moteur/indicateurs.js:324:21 frontiere < <= indicateurs.js, mesurer, p <= N au compte des effectifs : groupe[N] est undefined, différent de SANS_GROUPE ; effectifs[undefined] += 1 pose une propriété « undefined » sur un tableau ordinaire, et parGroupe ne lit que les index 0 à G − 1.
src/moteur/indicateurs.js:325:9 si-vrai groupe[p] !== SANS_GROUPE true indicateurs.js, mesurer, if (true) au compte des effectifs : une personne sans appartenance incrémente effectifs[SANS_GROUPE], soit effectifs[−1], propriété hors des index d'un tableau ordinaire ; parGroupe ne lit que les index 0 à G − 1.
src/moteur/manque.js:91:64 frontiere > >= manque.js, plusGrand, valeur >= cumul : à égalité, le cumul retenu est la même valeur.
src/moteur/manque.js:231:82 arithmetique - + manque.js, profilManque, départage a.id + b.id : à manque et plafond réalisé égaux, le comparateur rend un nombre positif. Le tri de V8 ne lit que « < 0 » et est stable : un positif s'y lit comme 0, et l'ordre reçu reste, celui de instance.ids, que normaliser trie par identifiant croissant et sans doublon — l'ordre de a.id − b.id. Une liste reçue dans un autre ordre ne peut pas se construire : profilManque parcourt instance.ids.
src/moteur/manque.js:287:34 frontiere < <= manque.js, comparerProfils, difference <= 0 : la ligne ne s'atteint que pour difference !== 0, où <= 0 et < 0 coïncident.
src/moteur/manque.js:287:36 nombre-plus-un 0 1 manque.js, comparerProfils, difference < 1 : un manque est un entier (plafond réalisé − rencontres, deux comptes), et la ligne ne s'atteint que pour difference !== 0 : < 1 et < 0 coïncident.
src/moteur/manque.js:287:41 nombre-plus-un 1 2 manque.js, comparerProfils, signeRang = −2 au lieu de −1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas.
src/moteur/manque.js:287:45 nombre-plus-un 1 2 manque.js, comparerProfils, signeRang = 2 au lieu de 1 : signeRang ne se lit que par < 0 et par comparaison à signe, qui reçoit les mêmes valeurs ; signe ne se rend pas.
src/moteur/manque.js:288:19 frontiere < <= manque.js, comparerProfils, signeRang <= 0 : signeRang vaut −1 ou 1, jamais 0.
src/moteur/manque.js:288:21 nombre-plus-un 0 1 manque.js, comparerProfils, signeRang < 1 : signeRang vaut −1 ou 1 ; < 1 et < 0 coïncident.
src/moteur/manque.js:292:11 si-vrai changements === 1 true manque.js, comparerProfils, bascule posée à chaque changement : rangBascule ne la rend que pour changements === 1, où la première et la dernière affectation sont la même.
src/moteur/plafond.js:55:30 arithmetique - + plafond.js, borne, min(N + 1, …) : le terme Σ a_t + min(n_p, S) ne dépasse jamais N − 1. Les ancrés des tables distinctes, p exclu, sont au plus k − 1 pour un ancré et k sinon ; n_p vaut n pour un ancré et n − 1 sinon ; la somme vaut au plus k + n − 1 = N − 1 (n = N − k, configuration.js). Le min extérieur ne mord jamais, que sa borne soit N − 1 ou plus.
src/moteur/plafond.js:55:32 nombre-zero 1 0 plafond.js, borne, min(N − 0, …) : même raison que min(N + 1, …) — le terme intérieur vaut au plus N − 1.
src/moteur/plafond.js:65:74 nombre-plus-un 1 2 plafond.js, ancrageDe, −2 au lieu de −1 pour un non-ancré : l'ancrage ne sert qu'à t === ancrage, où t est un index de table ≥ 0, et à la clé de signature, où −2 remplace −1 pour tous les non-ancrés à la fois : aucune comparaison ni aucun regroupement ne change.
src/moteur/plafond.js:74:21 frontiere < <= plafond.js, tablesAdmissibles, t <= T : ancresParTable[T] et capacite[T] sont undefined, undefined < undefined est faux, rien ne s'ajoute.
src/moteur/plafond.js:160:21 frontiere < <= plafond.js, plafondsRealises, p <= N : la case N × R + r est hors du plan (undefined, différent de RESERVE) ; occupation[NaN] += 1 n'écrit rien sur un Int32Array.
src/moteur/plafond.js:163:11 si-vrai t !== RESERVE true plafond.js, plafondsRealises, if (true) : une case RESERVE (−1) écrit occupation[−R + r], index négatif puisque r < R ; un index hors des éléments d'un tableau typé n'écrit rien.
src/moteur/plafond.js:180:38 si-vrai fixe[p * R + r] !== LIBRE true plafond.js, signature, chaque case poussée, LIBRE comprise : le nombre de cases LIBRE vaut R moins le nombre de tours fixés, que le multiensemble des tables fixées donne déjà ; deux clés sont égales sous le mutant si et seulement si elles le sont sans lui.
src/moteur/plafond.js:181:27 arithmetique - + plafond.js, signature, tri par x + y : le tri ne sert qu'à rendre la clé indépendante de l'ordre des tours. Un ordre faux peut séparer deux rangées de même multiensemble en deux clés, jamais réunir deux multiensembles distincts — la clé garde ses éléments — : la valeur mémoïsée reste exacte, seul le partage se perd.
src/moteur/plafond.js:223:14 nombre-plus-un 0 1 plafond.js, maximiser, vMax part de 1 : vMax ne sert qu'à W, qui grandit ou reste. Tout W' ≥ W rend le même plafond : sans écrêtage (W' ≥ f·vMax) la programmation dynamique est exacte, et un écrêtage à W' ≥ cap ne fond que des états où min(n_p, sieges0 + w) vaut déjà n_p.
src/moteur/plafond.js:225:18 min-max min max plafond.js, maximiser, W = max(cap, f·vMax) : W grandit ou reste ; même raison que vMax partant de 1 — tout W' ≥ W rend le même plafond.
src/moteur/plafond.js:225:31 nombre-plus-un 0 1 plafond.js, maximiser, cap = max(1, n_p − sieges0) : W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1).
src/moteur/plafond.js:225:37 arithmetique - + plafond.js, maximiser, cap = max(0, n_p + sieges0) : sieges0 ≥ 0 (v ≥ 0 pour toute table qu'un plan valide fixe), donc W grandit ou reste ; tout W' ≥ W rend le même plafond (voir vMax partant de 1).
src/moteur/plafond.js:226:23 nombre-plus-un 1 2 plafond.js, maximiser, largeur = W + 2 : une colonne de plus par rangée, jamais écrite (cible ≤ W) ni lue (w ≤ W) ; chaque état garde une case distincte.
src/moteur/plafond.js:227:38 nombre-plus-un 1 2 plafond.js, maximiser, (f + 2) × largeur cases : une rangée de plus en fin de tableau, jamais lue ni écrite (s + m ≤ f).
src/moteur/plafond.js:227:58 nombre-plus-un 1 2 plafond.js, maximiser, fill(−2) : le marqueur d'état inatteignable ne se lit que par < 0 et >= 0, et tout atteint + gain ≥ 0 le dépasse ; −2 se comporte comme −1.
src/moteur/plafond.js:233:23 frontiere < <= plafond.js, maximiser, s <= f : à s = f, la boucle sur m (s + m ≤ f) ne tourne pas.
src/moteur/plafond.js:239:30 frontiere > >= plafond.js, maximiser, atteint + gain >= suivant[cible] : à égalité, l'affectation écrit la valeur déjà présente.
src/moteur/plafond.js:245:18 nombre-plus-un 1 2 plafond.js, maximiser, plafond part de −2 : l'état (f, W) est toujours atteint — la table de plus grand v prise f fois — avec une somme d'ancrés ≥ 0, et sa borne vaut au moins 0 ; le maximum ne dépend pas de la valeur initiale, pourvu qu'elle ne dépasse pas 0.
src/moteur/plafond.js:245:18 nombre-zero 1 0 plafond.js, maximiser, plafond part de −0 : même raison que −2 — un état atteint donne une borne x ≥ 0, et Math.max(−0, x) = x.
src/moteur/plafond.js:248:9 si-vrai ajout >= 0 true plafond.js, maximiser, if (true) sur ajout >= 0 : un état inatteignable porte −1, soit ancres0 − 1, à un w ≤ W ; l'état (f, W) est atteint avec une somme ≥ 0, et la borne, croissante en ses deux termes, y vaut au moins autant : un état inatteignable ne l'emporte jamais.
src/moteur/plafond.js:299:21 frontiere < <= plafond.js, enumerer, r <= R : itineraire[R] est undefined, qui n'égale pas LIBRE ; aucun tour libre ne s'ajoute.
src/moteur/plafond.js:316:18 nombre-plus-un 1 2 plafond.js, enumerer, plafond part de −2 : au moins un itinéraire s'évalue (f > 0 et A > 0), et son plafond est ≥ 0 ; la valeur initiale ne l'emporte jamais.
src/moteur/plafond.js:316:18 nombre-zero 1 0 plafond.js, enumerer, plafond part de −0 : au moins un itinéraire s'évalue, de plafond x ≥ 0, et Math.max(−0, x) = x.
src/moteur/plafond.js:318:23 frontiere < <= plafond.js, enumerer, i <= f : libres[f] est undefined ; itineraire[undefined] = … pose une propriété hors des index de l'Int32Array, que plafondItineraire ne lit pas (il lit length et les index 0 à R − 1).
src/moteur/plafond.js:324:22 nombre-zero 1 0 plafond.js, enumerer, j = i + 0 : le premier tour écrit choix[i] = choix[i], sans effet ; les tours suivants sont ceux du code.
src/moteur/plafond.js:324:27 frontiere < <= plafond.js, enumerer, j <= f : choix[f] est hors d'un Int32Array de f cases ; un index hors des éléments d'un tableau typé n'écrit rien.
src/moteur/plafond.js:350:33 arithmetique * / plafond.js, plafondsAPrioriParEnumeration, clé subarray(p / R, …) : l'index de début se tronque, et la clé devient une tranche qui finit par la rangée de p. Pour R ≥ 2 sa longueur, (p + 1)R − ⌊p/R⌋, croît strictement avec p : aucune clé n'est partagée, chaque plafond se calcule et reste exact ; pour R = 1, la tranche est la rangée même.
src/moteur/plafond.js:350:43 nombre-plus-un 1 2 plafond.js, plafondsAPrioriParEnumeration, clé subarray(pR, (p + 2)R) : la clé ajoute la rangée suivante (rien pour la dernière personne, dont la clé a R cases contre 2R) ; deux clés égales ont même longueur et même début, donc même rangée : le regroupement se fait plus fin, jamais plus large.
src/moteur/plafond.js:352:9 si-vrai plafond === undefined true plafond.js, plafondsAPrioriParEnumeration, if (true) : le plafond se recalcule pour chaque personne au lieu d'être repris de sa rangée ; même valeur, seule la mémoïsation de l'oracle se perd, et l'oracle n'a pas de budget de temps.

Délais et erreurs (207)

lieu opérateur avant après issue
src/moteur/classement.js:95:35 mise-a-jour += -= délai
src/moteur/classement.js:95:38 nombre-zero 1 0 délai
src/moteur/configuration.js:129:45 nombre-zero 1 0 délai
src/moteur/configuration.js:153:49 nombre-zero 1 0 délai
src/moteur/configuration.js:182:46 nombre-zero 1 0 délai
src/moteur/configuration.js:204:21 negation < >= délai
src/moteur/configuration.js:204:28 mise-a-jour += -= délai
src/moteur/configuration.js:204:31 nombre-zero 1 0 délai
src/moteur/configuration.js:205:30 mise-a-jour += -= délai
src/moteur/configuration.js:205:33 nombre-zero 1 0 délai
src/moteur/configuration.js:210:21 negation < >= délai
src/moteur/configuration.js:210:28 mise-a-jour += -= délai
src/moteur/configuration.js:210:31 nombre-zero 1 0 délai
src/moteur/configuration.js:211:30 mise-a-jour += -= délai
src/moteur/configuration.js:211:33 nombre-zero 1 0 délai
src/moteur/configuration.js:233:21 negation < >= délai
src/moteur/configuration.js:233:28 mise-a-jour += -= délai
src/moteur/configuration.js:233:31 nombre-zero 1 0 délai
src/moteur/configuration.js:237:30 mise-a-jour += -= délai
src/moteur/configuration.js:237:33 nombre-zero 1 0 délai
src/moteur/configuration.js:418:31 nombre-zero 1 0 délai
src/moteur/configuration.js:427:45 nombre-zero 1 0 délai
src/moteur/configuration.js:431:23 negation < >= délai
src/moteur/configuration.js:431:30 mise-a-jour += -= délai
src/moteur/configuration.js:431:33 nombre-zero 1 0 délai
src/moteur/configuration.js:460:44 nombre-zero 1 0 délai
src/moteur/configuration.js:485:31 nombre-zero 1 0 délai
src/moteur/configuration.js:490:33 nombre-zero 1 0 délai
src/moteur/configuration.js:511:28 mise-a-jour += -= délai
src/moteur/configuration.js:511:31 nombre-zero 1 0 délai
src/moteur/configuration.js:551:21 negation < >= délai
src/moteur/configuration.js:551:41 mise-a-jour += -= délai
src/moteur/configuration.js:551:44 nombre-zero 1 0 délai
src/moteur/diagnostic.js:93:21 negation < >= délai
src/moteur/diagnostic.js:93:33 mise-a-jour += -= délai
src/moteur/diagnostic.js:93:36 nombre-zero 1 0 délai
src/moteur/diagnostic.js:95:30 mise-a-jour += -= délai
src/moteur/diagnostic.js:95:33 nombre-zero 1 0 délai
src/moteur/diagnostic.js:99:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:99:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:119:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:121:44 nombre-zero 1 0 délai
src/moteur/diagnostic.js:124:30 mise-a-jour += -= délai
src/moteur/diagnostic.js:124:33 nombre-zero 1 0 délai
src/moteur/diagnostic.js:160:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:160:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:162:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:162:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:174:21 negation < >= délai
src/moteur/diagnostic.js:174:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:174:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:258:45 mise-a-jour -= += délai
src/moteur/diagnostic.js:258:48 nombre-zero 1 0 délai
src/moteur/diagnostic.js:286:21 negation < >= délai
src/moteur/diagnostic.js:286:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:286:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:288:28 mise-a-jour += -= délai
src/moteur/diagnostic.js:288:31 nombre-zero 1 0 délai
src/moteur/diagnostic.js:341:31 nombre-zero 1 0 délai
src/moteur/indicateurs.js:126:21 negation < >= délai
src/moteur/indicateurs.js:126:28 mise-a-jour += -= délai
src/moteur/indicateurs.js:126:31 nombre-zero 1 0 délai
src/moteur/indicateurs.js:127:30 mise-a-jour += -= délai
src/moteur/indicateurs.js:127:33 nombre-zero 1 0 délai
src/moteur/indicateurs.js:139:30 mise-a-jour += -= délai
src/moteur/indicateurs.js:139:33 nombre-zero 1 0 délai
src/moteur/indicateurs.js:157:28 mise-a-jour += -= délai
src/moteur/indicateurs.js:157:31 nombre-zero 1 0 délai
src/moteur/indicateurs.js:159:33 nombre-zero 1 0 délai
src/moteur/indicateurs.js:164:33 nombre-zero 1 0 délai
src/moteur/indicateurs.js:169:25 negation < >= délai
src/moteur/indicateurs.js:169:43 mise-a-jour += -= délai
src/moteur/indicateurs.js:169:46 nombre-zero 1 0 délai
src/moteur/indicateurs.js:174:31 negation < >= délai
src/moteur/indicateurs.js:174:49 mise-a-jour += -= délai
src/moteur/indicateurs.js:174:52 nombre-zero 1 0 délai
src/moteur/indicateurs.js:218:21 negation < >= délai
src/moteur/indicateurs.js:218:28 mise-a-jour += -= délai
src/moteur/indicateurs.js:218:31 nombre-zero 1 0 délai
src/moteur/indicateurs.js:219:27 negation < >= délai
src/moteur/indicateurs.js:219:34 mise-a-jour += -= délai
src/moteur/indicateurs.js:219:37 nombre-zero 1 0 délai
src/moteur/indicateurs.js:324:21 negation < >= délai
src/moteur/indicateurs.js:324:28 mise-a-jour += -= délai
src/moteur/indicateurs.js:324:31 nombre-zero 1 0 délai
src/moteur/manque.js:80:40 mise-a-jour += -= délai
src/moteur/manque.js:80:43 nombre-zero 1 0 délai
src/moteur/manque.js:227:28 mise-a-jour += -= délai
src/moteur/manque.js:227:31 nombre-zero 1 0 délai
src/moteur/manque.js:281:44 nombre-zero 1 0 délai
src/moteur/plafond.js:74:21 negation < >= délai
src/moteur/plafond.js:74:28 mise-a-jour += -= délai
src/moteur/plafond.js:74:31 nombre-zero 1 0 délai
src/moteur/plafond.js:81:28 mise-a-jour += -= délai
src/moteur/plafond.js:81:31 nombre-zero 1 0 délai
src/moteur/plafond.js:93:28 mise-a-jour += -= délai
src/moteur/plafond.js:93:31 nombre-zero 1 0 délai
src/moteur/plafond.js:107:47 nombre-zero 1 0 délai
src/moteur/plafond.js:160:21 negation < >= délai
src/moteur/plafond.js:160:28 mise-a-jour += -= délai
src/moteur/plafond.js:160:31 nombre-zero 1 0 délai
src/moteur/plafond.js:161:30 mise-a-jour += -= délai
src/moteur/plafond.js:161:33 nombre-zero 1 0 délai
src/moteur/plafond.js:167:21 negation < >= délai
src/moteur/plafond.js:167:28 mise-a-jour += -= délai
src/moteur/plafond.js:167:31 nombre-zero 1 0 délai
src/moteur/plafond.js:180:28 mise-a-jour += -= délai
src/moteur/plafond.js:180:31 nombre-zero 1 0 délai
src/moteur/plafond.js:205:28 mise-a-jour += -= délai
src/moteur/plafond.js:205:31 nombre-zero 1 0 délai
src/moteur/plafond.js:233:30 mise-a-jour += -= délai
src/moteur/plafond.js:233:33 nombre-zero 1 0 délai
src/moteur/plafond.js:234:33 mise-a-jour += -= délai
src/moteur/plafond.js:234:36 nombre-zero 1 0 délai
src/moteur/plafond.js:237:27 arithmetique + - délai
src/moteur/plafond.js:237:39 mise-a-jour += -= délai
src/moteur/plafond.js:237:42 nombre-zero 1 0 délai
src/moteur/plafond.js:246:29 mise-a-jour += -= délai
src/moteur/plafond.js:246:32 nombre-zero 1 0 délai
src/moteur/plafond.js:265:21 negation < >= délai
src/moteur/plafond.js:265:37 mise-a-jour += -= délai
src/moteur/plafond.js:265:40 nombre-zero 1 0 délai
src/moteur/plafond.js:283:29 mise-a-jour += -= délai
src/moteur/plafond.js:283:32 nombre-zero 1 0 délai
src/moteur/plafond.js:299:28 mise-a-jour += -= délai
src/moteur/plafond.js:299:31 nombre-zero 1 0 délai
src/moteur/plafond.js:303:7 si-faux f === 0 || A === 0 false délai
src/moteur/plafond.js:303:15 logique f === 0 || A === 0 ((f === 0 )&&( A === 0)) délai
src/moteur/plafond.js:303:20 negation === !== délai
src/moteur/plafond.js:303:24 nombre-plus-un 0 1 délai
src/moteur/plafond.js:303:27 corps-si return plafondItineraire(instance, p, itineraire); {} délai
src/moteur/plafond.js:318:30 mise-a-jour += -= délai
src/moteur/plafond.js:318:33 nombre-zero 1 0 délai
src/moteur/plafond.js:320:15 arithmetique - + délai
src/moteur/plafond.js:320:17 nombre-zero 1 0 délai
src/moteur/plafond.js:321:14 frontiere >= > délai
src/moteur/plafond.js:321:14 negation >= < délai
src/moteur/plafond.js:321:17 nombre-plus-un 0 1 délai
src/moteur/plafond.js:321:39 nombre-plus-un 1 2 délai
src/moteur/plafond.js:321:44 mise-a-jour -= += délai
src/moteur/plafond.js:321:47 nombre-zero 1 0 délai
src/moteur/plafond.js:322:9 si-faux i < 0 false délai
src/moteur/plafond.js:322:11 negation < >= délai
src/moteur/plafond.js:322:16 corps-si return plafond; {} délai
src/moteur/plafond.js:323:14 mise-a-jour += -= délai
src/moteur/plafond.js:323:17 nombre-plus-un 1 2 délai
src/moteur/plafond.js:323:17 nombre-zero 1 0 délai
src/moteur/plafond.js:324:27 negation < >= délai
src/moteur/plafond.js:324:34 mise-a-jour += -= délai
src/moteur/plafond.js:324:37 nombre-zero 1 0 délai
src/moteur/plafond.js:349:31 nombre-zero 1 0 délai
src/moteur/recherche.js:156:18 nombre-zero 10 0 délai
src/moteur/recherche.js:201:28 mise-a-jour += -= délai
src/moteur/recherche.js:201:31 nombre-zero 1 0 délai
src/moteur/recherche.js:204:28 mise-a-jour += -= délai
src/moteur/recherche.js:204:31 nombre-zero 1 0 délai
src/moteur/recherche.js:214:28 mise-a-jour += -= délai
src/moteur/recherche.js:214:31 nombre-zero 1 0 délai
src/moteur/recherche.js:217:30 mise-a-jour += -= délai
src/moteur/recherche.js:217:33 nombre-zero 1 0 délai
src/moteur/recherche.js:228:30 mise-a-jour += -= délai
src/moteur/recherche.js:228:33 nombre-zero 1 0 délai
src/moteur/recherche.js:241:28 mise-a-jour += -= délai
src/moteur/recherche.js:241:31 nombre-zero 1 0 délai
src/moteur/recherche.js:242:30 mise-a-jour += -= délai
src/moteur/recherche.js:242:33 nombre-zero 1 0 délai
src/moteur/recherche.js:247:45 mise-a-jour += -= délai
src/moteur/recherche.js:247:48 nombre-zero 1 0 délai
src/moteur/recherche.js:253:28 mise-a-jour += -= délai
src/moteur/recherche.js:253:31 nombre-zero 1 0 délai
src/moteur/recherche.js:350:57 mise-a-jour += -= délai
src/moteur/recherche.js:350:60 nombre-zero 1 0 délai
src/moteur/recherche.js:432:28 mise-a-jour += -= délai
src/moteur/recherche.js:432:31 nombre-zero 1 0 délai
src/moteur/recherche.js:438:31 nombre-zero 1 0 délai
src/moteur/recherche.js:440:44 mise-a-jour += -= délai
src/moteur/recherche.js:440:47 nombre-zero 1 0 délai
src/moteur/recherche.js:442:28 mise-a-jour += -= délai
src/moteur/recherche.js:442:31 nombre-zero 1 0 délai
src/moteur/recherche.js:444:30 mise-a-jour += -= délai
src/moteur/recherche.js:444:33 nombre-zero 1 0 délai
src/moteur/recherche.js:450:42 negation < >= délai
src/moteur/recherche.js:450:54 mise-a-jour += -= délai
src/moteur/recherche.js:450:57 nombre-zero 1 0 délai
src/moteur/recherche.js:478:42 nombre-zero 1 0 délai
src/moteur/recherche.js:494:42 nombre-zero 1 0 délai
src/moteur/recherche.js:536:29 logique i < arret && !estNul(courant) ((i < arret )||( !estNul(courant))) délai
src/moteur/recherche.js:536:52 mise-a-jour += -= délai
src/moteur/recherche.js:536:55 nombre-zero 1 0 délai
src/moteur/recherche.js:537:9 si-vrai immobile >= patience && ordre === ORDRE_CONTRAINTES true délai
src/moteur/recherche.js:537:18 negation >= < délai
src/moteur/recherche.js:537:30 logique immobile >= patience && ordre === ORDRE_CONTRAINTES ((immobile >= patience )||( ordre === ORDRE_CONTRAINTES)) délai
src/moteur/recherche.js:616:37 mise-a-jour += -= délai
src/moteur/recherche.js:616:40 nombre-zero 1 0 délai
src/moteur/recherche.js:665:47 mise-a-jour += -= délai
src/moteur/recherche.js:665:50 nombre-zero 1 0 délai
src/moteur/recherche.js:779:28 mise-a-jour += -= délai
src/moteur/recherche.js:779:31 nombre-zero 1 0 délai
src/moteur/recherche.js:780:30 mise-a-jour += -= délai
src/moteur/recherche.js:780:33 nombre-zero 1 0 délai
src/moteur/verification.js:137:33 nombre-zero 1 0 délai
src/moteur/verification.js:163:45 nombre-zero 1 0 délai
src/moteur/verification.js:174:72 nombre-zero 1 0 délai
src/moteur/verification.js:181:30 mise-a-jour += -= délai
src/moteur/verification.js:181:33 nombre-zero 1 0 délai
src/moteur/verification.js:249:28 mise-a-jour += -= délai
src/moteur/verification.js:249:31 nombre-zero 1 0 délai