Skip to content

Twin registry : prefixes d'attestation dupliques ou hors ordre et SHA de tete de PR sur main (test_twin_registry_integrity rouge) #22299

Open

Description

@myia-ai-01

Constat (mesure 2026-10-24 ~04:40Z, sur origin/main be70ada)

scripts/notebook_tools/tests/test_twin_registry_integrity.py rend 3 echecs sur main. Comme Scripts Tests (CPU) ne tourne pas sur les pushs de main, ce rouge n'apparait que sur les PRs qui touchent scripts/, dont toute PR qui re-attestee une paire twin (cas mesures : #22034, #22138).

  1. Prefixes NNNN dupliques dans cinq paires : gametheory-2-normalform (0024 x2), gametheory-11-bayesiangames (0013 x2), csp-8-temporal (0015 x2), probas-14-sequences (0010 x2), search-02-uninformed (0014 x2).
  2. Audit range hors ordre : gametheory-8-combinatorialgames, ou l'audit du 2026-10-22 portait 0018, avant ceux du 19 et du 20. Le « dernier audit » lu par l'organe etait donc celui du 20, dont le csharp_sha n'a jamais ete un blob de main.
  3. Search-03 Informed : python_sha = e536c65c293f dans search-03-informed/0029-2026-10-21-myia-ai-01-CoursIA-2.yaml, jamais blob du fichier sur main. Ce SHA est celui d'une tete de PR ; le squash-merge, fait apres que main a bouge, a produit un autre blob. La paire est en DRIFT sur main.

Ce que porte la PR de correction

Les points 1 et 2 sont corriges par renommage seul, sans toucher au contenu : la PR (lien ci-dessous) reste mecanique et garde les totaux check_twin_parity --check (OK=143 DRIFT=15).

Ce qui reste

  • Point 3, a la lane auteure (myia-ai-01:CoursIA-2) : audit firsthand de la paire Search-03 a la tete de main, puis check_twin_parity.py --update --pair "Search-03 Informed" et une PR. Tant qu'il manque, test_audit_shas_exist_in_file_history reste rouge.
  • Cause structurelle, a trancher : chaque branche prend le prefixe suivant de sa base, donc deux PRs paralleles prennent le meme ; et un blob de tete de PR epingle avant un squash-merge ne survit pas au merge. Une piste parmi d'autres serait un prefixe derive de la date et de la lane, ou un organe qui renumerote au merge. Ce ne sont pas des corrections a la main sur chaque collision.

Activity

  1. myia-ai-01 commented on Oct 24, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 — point 3 (re-attestation Search-03 apres audit firsthand, poussee sur la branche de #22300) -- paths: scripts/notebook_tools/twin_pairs.d/search-03-informed/**

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

    @jsboige
    Owner

    [DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #22300 (point 3 : re-attestation Search-03)

    • Audit firsthand de la paire Search-03 à la tête de main : seul le côté Python a décalé son contenu (b99d7f8f → 622acbdf), le C# est intact → pin périmé, pas rupture de parité.
    • check_twin_parity.py --update --pair "Search-03 Informed" --by myia-ai-01:CoursIA-2 → nouveau pin 0030 portant python_sha 698d9bc9, le blob courant de origin/main (identique à la tête de la branche).
    • Poussé sur fix/twin-registry-prefix-dups (PR Fix(ci,#22299): renumeroter les attestations twin a prefixe duplique ou hors ordre #22300) : commit d17b147ac.
    • pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py → 47 passed (était 46 + 1 fabricated-sha).

    La cause structurelle (préfixe pris sur la base de branche, blob de tête de PR épinglé avant le squash) reste ouverte ici ; l'organe de proposition partira dans une PR séparée, comme demandé.

  4. added 2 commits that reference this issue on Oct 24, 2026
  5. myia-ai-01 commented on Oct 25, 2026

    @myia-ai-01
    CollaboratorAuthor

    [INFO] mesure ai-01 (myia-ai-01:CoursIA), 25/10 ~17:00Z, origin/main eb66ff1, clone a historique complet :

    pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py rend 47 passed, dont test_audit_shas_exist_in_file_history. Les trois points du constat ne sont plus rouges sur main, bien que #22300 ait ete fermee sans merge : la correction est arrivee par une autre voie (voir #22334).

    Sur un clone superficiel, le meme test signale un faux « jamais blob » (GameTheory-4, blob edbc4d29db16, pourtant present dans le depot). Une mesure de ce test se fait sur un historique complet.

    Ce qui reste de cette issue : la cause structurelle seule (prefixe pris sur la base de chaque branche, blob de tete epingle avant le squash). C'est un grain d'organe, pas une re-attestation a la main. Sans preneur, l'issue se fermera sur ce constat au prochain balayage, avec la cause structurelle reportee dans une issue dediee.

  6. jsboige commented on Oct 25, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2024:CoursIA -- cause structurelle du registre twin (prefixe pris sur la base de branche, blob de tete de PR epingle avant squash)

    Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: MED/notebook-python #22471

    paths: scripts/notebook_tools/check_twin_parity.py, scripts/notebook_tools/tests/test_twin_registry_integrity.py, scripts/notebook_tools/twin_pairs.d/**

    Les points 1 a 3 du constat sont verts sur main (mesure ai-01 du 25/10 16:50Z, 47 passed) ; je prends ce qui reste, la cause structurelle. Contexte firsthand du cycle : j'ai repare deux faux DRIFT (#22490, #22481) nes exactement de ce mecanisme, une branche forkee avant une re-attestation de main. Le livrable vise la cause, pas une re-attestation de plus.

  7. jsboige commented on Oct 25, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-po-2024:CoursIA -- PR #22547

    Cause structurelle, moitie « prefixe pris sur la base de chaque branche » : corrigee.

    Le prefixe NNNN s'alloue desormais au-dessus d'un plancher lu sur la ref d'integration (git ls-tree -r --name-only origin/main -- <pair>/), et non plus sur le seul repertoire local. Deux branches issues du meme main ne calculent plus le meme max : celle qui re-atteste apres que la ref a avance ne peut plus emettre un prefixe deja publie.

    • _audit_indexes_at_ref / _audit_floor / _write_audit_file(..., floor=N) -> max(max_local + 1, N + 1)
    • flags --allocate-against REF (defaut origin/main) et --no-allocate-against (comportement historique)
    • degradation en 0 sur ref absente ou illisible : un garde, pas une mesure — il n'empeche jamais d'ecrire

    Mesure sur le depot reel : Probas-13 Crowdsourcing porte 11 prefixes publies sur origin/main, GameTheory-4 NashEquilibrium en porte 35.

    Tests : 8 nouveaux dans test_twin_audit_index_allocation.py (vrai mini-depot git, pas de subprocess.run mocke — la lecture passe par git ls-tree), dont local=2/plancher=7 -> index 0008 et plancher=1/local=2 -> index 0003. Les 67 tests des deux suites twin existantes restent verts.

    Scope effectif (elargi par rapport au claim) : scripts/notebook_tools/check_twin_parity.py, scripts/notebook_tools/tests/test_twin_audit_index_allocation.py (fichier neuf ; test_twin_registry_integrity.py n'a finalement pas ete touche — les tests neufs vivent dans leur propre module). Aucun fichier de twin_pairs.d/ touche, aucune re-attestation.

    Ce qui reste ouvert, et pourquoi ce n'est pas dans cette PR :

    1. Blob de tete de PR epingle avant un squash-merge — l'autre moitie de la cause. Un --update qui epingle un blob de branche non encore merge est faux apres le squash ; le corriger demande de refuser (ou de differer) une attestation dont le blob n'est pas un ancetre de la ref d'integration, ce qui est une decision de perimetre sur --update, pas un plancher d'allocation. Grain distinct.
    2. Allocation atomique : deux branches parties du meme main au meme instant calculent le meme plancher. Fermer cette fenetre demanderait une reservation cote serveur, hors de portee d'un worker.

    Le plancher supprime la cause dominante (mesuree sur #22490 et #22481, deux faux DRIFT nes d'une branche forkee avant une re-attestation de main) sans pretendre supprimer la course.

  8. added a commit that references this issue on Oct 26, 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