Skip to content

Fix(ci): index twin duplique dans gametheory-17-multiagent-rl (0011/0012) -- main rouge sur Scripts Tests (CPU) #21806

Closed

Description

@jsboige

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) + 1 sur 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 :

fichier ajoute par date portee
0011-2026-10-19-myia-po-2025-CoursIA.yaml fafbe8ac18 (#21386) 2026-10-19
0012-2026-10-19-myia-po-2025-CoursIA.yaml fafbe8ac18 (#21386) 2026-10-19
0013-2026-10-21-myia-po-2025-CoursIA.yaml fafbe8ac18 (#21386) 2026-10-21
0011-2026-10-20-myia-po-2023-CoursIA.yaml dec47c57cf (#20663) 2026-10-20
0012-2026-10-21-myia-po-2023-CoursIA.yaml dec47c57cf (#20663) 2026-10-21

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 mv pur (aucun contenu touche, aucune cellule re-executee), sur la forme documentee par #21731.

Acceptance

  1. check_twin_index_collisions.py --base origin/main --head <branche> --in-tree rend 0 collision (cross_ref: [] et intra_ref: []), exit 0.
  2. Les quatre fichiers deposes sont byte-identiques (blob git identique avant/apres) : la preuve que rien n'a ete reecrit.
  3. _latest_audit(pair) — le seul consommateur de l'ordre du registre — est strictement inchange (meme contenu que sur main).
  4. Les index restent contigus 0001..0015 et l'ordre chronologique est preserve (le desambiguïsage des dates egales se fait par ordre de merge sur main).
  5. Aucun notebook, aucune cellule, aucune sortie : rien a re-executer.

Activity

  1. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    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 mv pur dans
    scripts/notebook_tools/twin_pairs.d/gametheory-17-multiagent-rl/, aucun
    contenu touche, aucun carnet re-execute.

    0011-2026-10-20-myia-po-2023-CoursIA.yaml  ->  0014-2026-10-20-myia-po-2023-CoursIA.yaml
    0012-2026-10-21-myia-po-2023-CoursIA.yaml  ->  0015-2026-10-21-myia-po-2023-CoursIA.yaml
    

    Preuves mesurees sur la tete de la PR :

    Mesure Valeur
    check_twin_index_collisions.py --base origin/main --head HEAD --json -> cross_ref [] , exit 0
    index d'audit dupliques par paire dans l'arbre origin/main : 2 -> tete : 0 (158 paires, 2324 fichiers de registre)
    pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py 46 passed (118 s)
    blob SHA des deux fichiers deposes 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.

  2. added a commit that references this issue on Oct 21, 2026
  3. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    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)
    

    Les deux fichiers de sudoku-14-bdd :

    scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0019-2026-10-18-myia-po-2024-CoursIA-2.yaml
    scripts/notebook_tools/twin_pairs.d/sudoku-14-bdd/0019-2026-10-21-myia-po-2023-CoursIA.yaml
    

    Qui cède ? La date dans le nom de fichier induit en erreur ici : le fichier 2026-10-18 est arrivé sur main après celui du 2026-10-21.

    $ git log --diff-filter=A -1 origin/main -- …/sudoku-14-bdd/0019-2026-10-18-myia-po-2024-CoursIA-2.yaml
    0b29b80dfb3 2026-10-21 14:26:01 +0200  Fix(notebooks,#20190) … (#20262)
    $ git log --diff-filter=A -1 origin/main -- …/sudoku-14-bdd/0019-2026-10-21-myia-po-2023-CoursIA.yaml
    a00cffdf850 2026-10-21 14:10:05 +0200  fix(notebooks,#18144) … (#20961)
    

    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.

    — lane myia-po-2024:CoursIA

  4. jsboige commented on Oct 21, 2026

    @jsboige
    OwnerAuthor

    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 :

    sudoku-14-bdd/0019-2026-10-21-myia-po-2023-CoursIA.yaml -> 0020-2026-10-21-myia-po-2023-CoursIA.yaml
    

    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_pair vert, git diff --stat origin/main...HEAD = 3 renommages, 0 ligne.

    Rouge herite distinct, hors perimetre : Search-02 Uninformed

    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.

    — lane myia-po-2025:CoursIA

  5. added 3 commits that reference this issue on Oct 21, 2026
  6. added a commit that references this issue on Oct 21, 2026
  7. added a commit that references this issue on Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions