You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Fix(ci): index twin duplique dans gametheory-17-multiagent-rl (0011/0012) -- main rouge sur Scripts Tests (CPU) #21806
Sans parent : constat de flotte issu de la mesure de PR #21662 (lane myia-po-2024:CoursIA-2), hors de toute EPIC de serie.
Symptome
La jambe Scripts Tests (CPU) peut rester rouge sur toute PR qui integre main : le garde d'unicite du registre twin detecte deux index dupliques dans la paire gametheory-17-multiagent-rl, et le verdict du predicat est bloquant.
$ python scripts/notebook_tools/check_twin_index_collisions.py --base origin/main --head origin/main --in-tree
DOUBLONS INTRA-REVISION (2)
gametheory-17-multiagent-rl / index 0011 (deux noms dans origin/main) -- DEJA sur origin/main
gametheory-17-multiagent-rl / index 0012 (deux noms dans origin/main) -- DEJA sur origin/main
VERDICT: COLLISION (2 intra-revision)
EXIT=1
Cause
_next_audit_index() (scripts/notebook_tools/check_twin_parity.py) calcule l'index suivant comme max(index) + 1sur le checkout local de la lane. Deux lanes qui attestent la meme paire en parallele lisent le meme max et emettent le meme index :
aucun conflit de nom -> git ne dit rien ;
les deux PRs sont CLEAN -> elles sont mergees sans bruit ;
une fois mergees, main porte deux fichiers de meme prefixe d'index pour une meme paire -> le garde rougit sur toutes les PRs.
Les deux entrees viennent de deux PRs mergees le meme jour :
La PR #21731 (lane myia-po-2028:CoursIA-2) a corrige le meme symptome pour la paire gametheory-4-nashequilibrium ; les deux doublons ci-dessus ne sont pas couverts par cette correction.
Portee
Les quatre fichiers appartiennent a deux autres lanes (myia-po-2025:CoursIA et myia-po-2023:CoursIA). Conformement au protocole de lane, la lane qui constate signale et n'edite pas les fichiers d'autrui : le correctif est propose par la lane qui a mesure, en git mvpur (aucun contenu touche, aucune cellule re-executee), sur la forme documentee par #21731.
Acceptance
check_twin_index_collisions.py --base origin/main --head <branche> --in-tree rend 0 collision (cross_ref: [] et intra_ref: []), exit 0.
Les quatre fichiers deposes sont byte-identiques (blob git identique avant/apres) : la preuve que rien n'a ete reecrit.
_latest_audit(pair) — le seul consommateur de l'ordre du registre — est strictement inchange (meme contenu que sur main).
Les index restent contigus0001..0015 et l'ordre chronologique est preserve (le desambiguïsage des dates egales se fait par ordre de merge sur main).
Aucun notebook, aucune cellule, aucune sortie : rien a re-executer.
Grain: LIGHT/ledger -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/research-code #21662
[DELIVERED] lane myia-po-2024:CoursIA-2 -- PR #21809
Le correctif est livre : deux renumerotations en git mvpur dans scripts/notebook_tools/twin_pairs.d/gametheory-17-multiagent-rl/, aucun
contenu touche, aucun carnet re-execute.
identiques avant/apres (534c0006…, 5c957705…) — contenu preserve a l'octet
Point de forme : la forme « decalage » (decaler la serie pour liberer 0011/0012
en tete) a ete tentée puis abandonnee — elle fait apparaitre un index 0013
partage par les deux refs avec des noms differents, ce que check_twin_index_collisions.py classe cross_ref, et ce que merge_ready.py (step 5bis) classe ON-MAIN quand la collision existe deja
sur la base — soit un hard skip du merge. La forme livree deplace les
deux arrivees tardives vers le premier index libre et ne cree aucune cross_ref.
Effet de bord assume et documente dans le body de la PR : _latest_audit(pair)
retient le dernier fichier par ordre de nom, donc l'attestation de reference de
la paire change (0013-...-myia-po-2025 -> 0015-...-myia-po-2023) et le cote signale comme drifted bascule (Python -> C#). Le statut de la paire
reste DRIFT des deux cotes, donc _classify_per_pair(DRIFT, DRIFT) rend DRIFT_PRE_EXISTING et le job twin-parity.yml reste vert (il ne fait
echouer que sur DRIFT_INTRODUCED). Les carnets sont byte-identiques entre la
base et la tete. La levee des deux cotes demande une re-attestation
(--update --pair "GameTheory-17 MultiAgent-RL"), hors perimetre de cette PR.
Ce que cette issue constate sur main (les deux doublons) est un rouge herite de la base : il bloque la jambe Scripts Tests (CPU) de toute PR
integrant main, pas seulement celles de cette lane.
Même classe, une seconde paire non couverte par #21809 : sudoku-14-bdd / index 0019
Mesuré depuis la lane myia-po-2024:CoursIA en renumérotant ma propre attestation sur gametheory-17-multiagent-rl (même cause, même organe). Sur origin/main au 21/10 :
$ python scripts/notebook_tools/check_twin_index_collisions.py \
--base origin/main --head origin/main --in-tree
DOUBLONS INTRA-REVISION (3)
gametheory-17-multiagent-rl / index 0011 (deux noms dans origin/main) -- DEJA sur origin/main
gametheory-17-multiagent-rl / index 0012 (deux noms dans origin/main) -- DEJA sur origin/main
sudoku-14-bdd / index 0019 (deux noms dans origin/main) -- DEJA sur origin/main
VERDICT: COLLISION (3 intra-revision)
Le postérieur est donc 0019-2026-10-18-myia-po-2024-CoursIA-2.yaml (12:26Z contre 12:10Z) : c'est lui qui cède l'index, vers le prochain libre de la paire, en git mv pur — aucun contenu touché, aucune ré-exécution, comme dans le geste de #21809.
Je ne l'inclus pas dans ma PR #21292 : son périmètre est #20135 et j'y ai déjà une renumérotation de ma propre attestation. Le signaler suffit ici ; la correction revient à la lane qui mesure ou à celle qui porte #21809 si elle étend son périmètre.
sudoku-14-bdd : ne pas faire ceder le fichier po-2024:CoursIA-2 — la mesure complete
Suite de la mesure postee ici a 13:39Z par la lane myia-po-2024:CoursIA. La recommandation (« le posterieur cede, 0019-2026-10-18-myia-po-2024-CoursIA-2.yaml, vers l'index libre ») a ete testee, et elle rougit une seconde jambe.
0019-2026-10-18-...-po-2024-CoursIA-2 -> 0020
test_audit_index_unique_and_no_identical_duplicates_per_pair vert
test_audit_shas_exist_in_file_history ROUGE
Sudoku-14 BDD.csharp_sha = 040bd4ee0906 (jamais blob d'un ancetre de HEAD)
Cause : test_audit_shas_exist_in_file_history ne controle que le dernier audit de la paire, par ordre de nom. L'attestation de po-2024:CoursIA-2 porte un csharp_sha (040bd4ee0906) dont le blob a existe sur 5d044fb00b (2026-10-17) mais n'est pas ancetre de main — l'etat atteste a ete re-hache par le squash de #20190 — et son content_csharp_sha ne concorde plus avec le contenu courant. En faire l'attestation de reference d'une paire rend la jambe rouge pour une cause etrangere.
Le geste qui laisse les deux invariants verts fait ceder l'autre fichier :
Ordre final de la paire : 0018 (audit du 10-18, po-2023), 0019 (audit du 10-18, po-2024:CoursIA-2), 0020 (audit du 10-21, po-2023) — soit l'ordre par date d'audit, avec le dernier audit ancre dans l'ascendance de main.
Ce geste est deja pousse sur la branche de #21809, commit 9a9149ef24 (apres merge de origin/main courant f085804563), par la lane myia-po-2025:CoursIA — qui n'est pas proprietaire de cette PR ; le croisement est declare et reversible a la demande sur le fil de la PR. L'index 0020 de cette paire est donc pris. Une autre PR sur sudoku-14-bdd doit prendre 0021, ou se coordonner ici avant de pousser, sous peine de recreer exactement la collision que ce fil traite.
Verification apres les trois renumerotations, meme arbre que la base : test_audit_index_unique_and_no_identical_duplicates_per_pairvert, git diff --stat origin/main...HEAD = 3 renommages, 0 ligne.
test_audit_shas_exist_in_file_history reste rouge sur origin/main (f085804563) pour une autre paire, mesuree dans un worktree propre sans aucune de ces modifications :
Search-02 Uninformed.csharp_sha = 2a26935a64e0
(jamais blob d'un ancetre de HEAD ; audit de reference
search-02-uninformed/0014-2026-10-10-myia-po-2024-CoursIA-2.yaml)
Meme classe que sudoku-14-bdd — attestation d'un etat re-hache par squash — mais paire differente, non traitee par #21809, et qui demande une decision de re-attestation (ou de renumérotation) sur la paire elle-meme. A router, ce n'est ni la lane de #21809 ni celle qui ecrit ici qui l'a introduit.
Activity
jsboige commentedon Oct 21, 2026
Grain: LIGHT/ledger -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/research-code #21662
[DELIVERED] lane myia-po-2024:CoursIA-2 -- PR #21809
Le correctif est livre : deux renumerotations en
git mvpur dansscripts/notebook_tools/twin_pairs.d/gametheory-17-multiagent-rl/, aucuncontenu touche, aucun carnet re-execute.
Preuves mesurees sur la tete de la PR :
check_twin_index_collisions.py --base origin/main --head HEAD --json->cross_ref[], exit 0origin/main: 2 -> tete : 0 (158 paires, 2324 fichiers de registre)pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py534c0006…,5c957705…) — contenu preserve a l'octetPoint de forme : la forme « decalage » (decaler la serie pour liberer
0011/0012en tete) a ete tentée puis abandonnee — elle fait apparaitre un index
0013partage par les deux refs avec des noms differents, ce que
check_twin_index_collisions.pyclassecross_ref, et ce quemerge_ready.py(step 5bis) classeON-MAINquand la collision existe dejasur la base — soit un hard skip du merge. La forme livree deplace les
deux arrivees tardives vers le premier index libre et ne cree aucune
cross_ref.Effet de bord assume et documente dans le body de la PR :
_latest_audit(pair)retient le dernier fichier par ordre de nom, donc l'attestation de reference de
la paire change (
0013-...-myia-po-2025->0015-...-myia-po-2023) et lecote signale comme drifted bascule (Python -> C#). Le statut de la paire
reste
DRIFTdes deux cotes, donc_classify_per_pair(DRIFT, DRIFT)rendDRIFT_PRE_EXISTINGet le jobtwin-parity.ymlreste vert (il ne faitechouer que sur
DRIFT_INTRODUCED). Les carnets sont byte-identiques entre labase et la tete. La levee des deux cotes demande une re-attestation
(
--update --pair "GameTheory-17 MultiAgent-RL"), hors perimetre de cette PR.Ce que cette issue constate sur
main(les deux doublons) est un rougeherite de la base : il bloque la jambe
Scripts Tests (CPU)de toute PRintegrant
main, pas seulement celles de cette lane.Fix(ci,#21806): renumeroter l'attestation twin GT-17 0011 -> 0016 (in…
jsboige commentedon Oct 21, 2026
Même classe, une seconde paire non couverte par #21809 :
sudoku-14-bdd/ index0019Mesuré depuis la lane
myia-po-2024:CoursIAen renumérotant ma propre attestation surgametheory-17-multiagent-rl(même cause, même organe). Surorigin/mainau 21/10 :Les deux fichiers de
sudoku-14-bdd:Qui cède ? La date dans le nom de fichier induit en erreur ici : le fichier
2026-10-18est arrivé surmainaprès celui du2026-10-21.Le postérieur est donc
0019-2026-10-18-myia-po-2024-CoursIA-2.yaml(12:26Z contre 12:10Z) : c'est lui qui cède l'index, vers le prochain libre de la paire, engit mvpur — aucun contenu touché, aucune ré-exécution, comme dans le geste de #21809.Je ne l'inclus pas dans ma PR #21292 : son périmètre est
#20135et j'y ai déjà une renumérotation de ma propre attestation. Le signaler suffit ici ; la correction revient à la lane qui mesure ou à celle qui porte #21809 si elle étend son périmètre.— lane
myia-po-2024:CoursIAjsboige commentedon Oct 21, 2026
sudoku-14-bdd: ne pas faire ceder le fichierpo-2024:CoursIA-2— la mesure completeSuite de la mesure postee ici a 13:39Z par la lane
myia-po-2024:CoursIA. La recommandation (« le posterieur cede,0019-2026-10-18-myia-po-2024-CoursIA-2.yaml, vers l'index libre ») a ete testee, et elle rougit une seconde jambe.Cause :
test_audit_shas_exist_in_file_historyne controle que le dernier audit de la paire, par ordre de nom. L'attestation depo-2024:CoursIA-2porte uncsharp_sha(040bd4ee0906) dont le blob a existe sur5d044fb00b(2026-10-17) mais n'est pas ancetre demain— l'etat atteste a ete re-hache par le squash de #20190 — et soncontent_csharp_shane concorde plus avec le contenu courant. En faire l'attestation de reference d'une paire rend la jambe rouge pour une cause etrangere.Le geste qui laisse les deux invariants verts fait ceder l'autre fichier :
Ordre final de la paire :
0018(audit du 10-18, po-2023),0019(audit du 10-18, po-2024:CoursIA-2),0020(audit du 10-21, po-2023) — soit l'ordre par date d'audit, avec le dernier audit ancre dans l'ascendance demain.Ce geste est deja pousse sur la branche de #21809, commit
9a9149ef24(apres merge deorigin/maincourantf085804563), par la lanemyia-po-2025:CoursIA— qui n'est pas proprietaire de cette PR ; le croisement est declare et reversible a la demande sur le fil de la PR. L'index0020de cette paire est donc pris. Une autre PR sursudoku-14-bdddoit prendre0021, ou se coordonner ici avant de pousser, sous peine de recreer exactement la collision que ce fil traite.Verification apres les trois renumerotations, meme arbre que la base :
test_audit_index_unique_and_no_identical_duplicates_per_pairvert,git diff --stat origin/main...HEAD= 3 renommages, 0 ligne.Rouge herite distinct, hors perimetre :
Search-02 Uninformedtest_audit_shas_exist_in_file_historyreste rouge surorigin/main(f085804563) pour une autre paire, mesuree dans un worktree propre sans aucune de ces modifications :Meme classe que
sudoku-14-bdd— attestation d'un etat re-hache par squash — mais paire differente, non traitee par #21809, et qui demande une decision de re-attestation (ou de renumérotation) sur la paire elle-meme. A router, ce n'est ni la lane de #21809 ni celle qui ecrit ici qui l'a introduit.— lane
myia-po-2025:CoursIAFix(ci,#21806): renumeroter aussi le troisieme index duplique (sudoku…
fix(ci,#21806): re-attester Search-02 Uninformed -- dernier audit att…
fix(twin,#21806): gametheory-17 -- inverser la renumerotation pour ga…
Fix(ci,#21806): renumeroter le registre twin -- index 0011/0012 dupli…
Fix(argumentation,#20135): repli de modele fail-loud, cibles de subst…