Skip to content

fix(twin-registry): index 0016 duplique dans probas-2-gaussian-mixtures — renumerotation en 0017 (main rouge Scripts Tests) - #17858

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/twin-index-dup-probas2
Sep 25, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/twin-index-dup-probas2

Conversation

@jsboige

@jsboige jsboige commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

Grain: LIGHT/ledger — lane myia-po-2025:CoursIA — prev: MED/docs #17852

Ce que fait cette PR

Répare un rouge de main, pas d'une PR : renomme une entrée du registre jumelle dont l'index était dupliqué.

scripts/notebook_tools/twin_pairs.d/probas-2-gaussian-mixtures/
  0016-2026-09-25-myia-po-2026-CoursIA.yaml  ->  0017-2026-09-25-myia-po-2026-CoursIA.yaml

1 fichier renommé, 0 octet de contenu modifié, aucun SHA réécrit.

La panne, mesurée

test_audit_index_unique_and_no_identical_duplicates_per_pair (scripts/notebook_tools/tests/test_twin_registry_integrity.py:383) :

AssertionError: prefixe NNNN duplique dans une paire (l'index est la cle de tri du journal,
#14911/#15345) : ['probas-2-gaussian-mixtures:
  0016-2026-09-25-myia-po-2024-CoursIA.yaml et 0016-2026-09-25-myia-po-2026-CoursIA.yaml']
  • Reproduit sur origin/main dans un worktree neuf (git worktree add ... origin/main) : 1 failed.
  • Rouge constaté en CI sur main : run Scripts Tests (CPU) sur 9882979fcf (2026-09-25T20:19:05Z) = failure, précédé de success sur a76a2e4795 (20:17:09Z).

Conséquence : le job Scripts Tests (CPU) rougit sur toute PR ouverte dont la tête descend de ce main — y compris des PRs qui ne touchent pas le registre (#17831, un script et son test, en est un cas ; son échec est base-inherited, diagnostiqué sur son log : un seul test en échec, celui-ci).

Cause racine

_next_index (scripts/notebook_tools/check_twin_parity.py:1492) rend max(index) + 1. Deux PRs mergées le même jour ont chacune calculé 0015 + 1 = 0016 sur une base qui ne voyait pas l'autre :

Entrée Lane PR Mergée dans main
0016-...-myia-po-2024 myia-po-2024:CoursIA #17808 17:37:44+02:00
0016-...-myia-po-2026 myia-po-2026:CoursIA #17755 22:19:02+02:00

Le fait que les deux bases étaient disjointes est mesuré par le contenu, pas supposé — les deux attestations enregistrent des états partiels et complémentaires de la paire :

Axe HEAD (contenu) attesté par po-2024 attesté par po-2026
python (PyMC-02-Gaussian-Mixtures.ipynb) 18718dfe42ede352 18718dfe… (courant) 07c3c575… (périmé)
csharp (Infer-2-Gaussian-Mixtures.ipynb) 6ad93d79962c2598 8279ddaf… (périmé) 6ad93d79… (courant)

Chaque PR a changé un seul côté (#17808 : lien Suivant + stem swap, Python seul ; #17755 : rendu mathématique, C# seul) en partant d'une base commune antérieure aux deux.

Le choix d'index, et pourquoi c'est celui-là

L'index est la clé de tri du journal : il doit refléter l'ordre chronologique des audits. L'ordre observable est l'entrée dans main — 0016-po-2024 (17:37:44) précède 0016-po-2026 (22:19:02). C'est donc la seconde qui prend l'index suivant, 0017.

Ce choix préserve aussi la sélection de « la plus récente » : le tri par nom plaçait déjà 0016-...-po-2026 après 0016-...-po-2024, donc la jambe advisory --verify-recorded-sha lisait déjà l'entrée po-2026 comme la plus récente. Après renommage, elle l'est toujours (0017 > 0016) — aucun nouveau finding advisory n'apparaît.

Pourquoi une renumérotation et non une suppression

Les deux fichiers ne sont pas byte-identiques (sha256 distincts, motifs distincts, SHAs de contenu distincts). Le cas de figure du test — « deux attestations byte-identiques » — n'est pas celui-ci : aucune des deux ne se déduit de l'autre, donc supprimer l'une effacerait un audit réel. La classe d'incident #15225 (copie cappée ajoutée sans retrait de l'original) ne s'applique pas non plus.

Vérification

Contrôle Avant Après
test_twin_registry_integrity.py (fichier entier) 1 failed sur origin/main 46 passed
Collisions d'index, registre entier (scan des 157 paires) 1 0
Doublons byte-identiques intra-paire 0 0
check_twin_parity.py --json --check --per-pair --base origin/main — drift_introduced: 0 (exit 0) — drift_pre_existing: 4, qui ne rougit pas le mode --per-pair

Le scan complet du registre a été passé avant de choisir le périmètre, pour que la réparation soit complète et non partielle : c'était la seule collision.

Portée

  • See #14911, See #15345 — convention de l'index comme clé de tri et garde du journal.
  • See #16769 — le tracker de la classe : « registre twin en rouge sur main — indices dupliqués » (ouvert, même symptôme, même remède). Cette PR est sa troisième occurrence, pas un cas isolé. La cause racine (_next_index = max(index) + 1, sans verrou) y est documentée et n'est pas traitée ici.
  • Aucun carnet touché. Aucune attestation réécrite. Aucun --update passé (un --update re-baselinerait des SHA et invaliderait le diagnostic ci-dessus).
  • Ce qui a produit la collision est une course entre deux lanes sur max(index) + 1 : la PR ne corrige pas la course elle-même (hors périmètre d'une réparation de rouge) — la garde qui détecte existe déjà, c'est elle qui a rougi.

🤖 Generated with Claude Code

…es -- renumerotation en 0017

Deux PRs mergees le 2026-09-25 ont ecrit le meme index 0016 dans la meme paire
du registre jumelle : #17808 (lane myia-po-2024:CoursIA, mergee 17:37:44+02:00)
et #17755 (lane myia-po-2026:CoursIA, mergee 22:19:02+02:00). Chacune a calcule
`max(index) + 1` = 0016 sur une base qui ne voyait pas l'autre -- mesure par le
contenu : chacune atteste un seul cote courant, l'autre perime, depuis une base
commune anterieure aux deux.

`test_audit_index_unique_and_no_identical_duplicates_per_pair` rougit depuis sur
main (run Scripts Tests (CPU) sur 9882979 = failure, precedent = success), ce
qui rougit le job sur toute PR ouverte descendant de ce main.

L'entree entree dans main en second prend l'index suivant, 0017 : l'index est la
cle de tri du journal, et l'ordre chronologique observable est l'ordre d'entree
dans main. Les deux attestations sont conservees -- elles ne sont pas
byte-identiques (SHA de contenu et motifs distincts), donc aucune ne se deduit
de l'autre.

Renumerotation pure : aucun octet de contenu modifie, aucun SHA reecrit, aucun
`--update` passe. Verification : test_twin_registry_integrity.py 1 failed -> 46
passed ; collisions d'index sur le registre entier 1 -> 0.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre ledger dans la famille META (docs/guard/ledger/readme/test) + diff de 0 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

Cette PR répare une récidive, pas un cas isolé — et elle ne ferme pas le tracker de la classe.

La même panne est déjà suivie par #16769 (« registre twin en rouge sur main — indices dupliqués », ouvert, avec exactement le même symptôme : Scripts Tests (CPU) rouge sur main, hérité par toute PR touchant scripts/**). Les couples d'origine y étaient sw-2-rdf-basics et sw-7-owl ; celui-ci est le troisième, probas-2-gaussian-mixtures.

Le correctif appliqué ici est celui que #16769 prescrit lui-même — renuméroter en préservant la chronologie — et la vérification est la même que la sienne : test_twin_registry_integrity.py de 1 failed à 46 passed, collisions d'index sur le registre entier 1 → 0.

See #16769 — la classe n'est pas fermée par cette PR : _next_index rend toujours max(index) + 1 sans verrou, donc une quatrième occurrence est possible. La cause racine est documentée sur #16769, pas traitée ici (changement d'organe, hors périmètre d'une réparation de rouge).

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17858
head: ae92832
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: cd24566e5241c315bb6a4bfe26637c9d5991d1da4e424ff47a50341fafbd633e
diff-files: 1
diff-additions: 0
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Pourquoi BLOCKED — un seul champ, et ce n'est pas un defaut de cette PR.

checks: BLOCKED nomme la seule jambe rouge de la tete ae92832f3715 : PR gate, dont le titre lu au check-run est un minuteur — DWELL -- tete du 2026-09-25T21:26:52Z, 18 min -- plancher 120 min, reste 102 min ; ecoule a 2026-09-26T00:07:00Z. Rien a corriger dans le code : cette jambe est un minuteur. Le plancher de cette tete est franchi a 23:26:52Z. Aucune correction n'est attendue de la lane.

Ce que la jambe decisive dit, elle, est deja vert. Scripts Tests (CPU) rend success a cette tete. C'est precisement le test qui est rouge sur main depuis le merge de #17755 : test_audit_index_unique_and_no_identical_duplicates_per_pair echoue sur 67f75c49fa parce que le registre scripts/notebook_tools/twin_pairs.d/probas-2-gaussian-mixtures/ porte deux entrees a l'index 0016 (0016-2026-09-25-myia-po-2024-CoursIA.yaml par #17808 a 15:37:44Z, 0016-2026-09-25-myia-po-2026-CoursIA.yaml par #17755 a 20:19:02Z). Le correctif est donc prouve, et il ne reste que le minuteur.

scope: pass — un fichier, git mv pur (+0/-0) : 0016-2026-09-25-myia-po-2026-CoursIA.yaml devient 0017-2026-09-25-myia-po-2026-CoursIA.yaml, ce qui laisse le 0016 de po-2024 seul a cet index. Aucun contenu reecrit, aucune autre surface touchee.

b0: clear — check_unaddressed_nits.py 17858 rend rc=0. domain: not-applicable — le diff ne touche aucun carnet (registre YAML).

La meme trappe est armee, en attente, deux PR plus loin. #17754 (0013-2026-09-25-myia-po-2026-CoursIA.yaml) et #17780 (0013-2026-09-25-myia-po-2023-CoursIA-2.yaml) ajoutent tous deux l'index 0013 de twin_pairs.d/gametheory-15-cooperativegames/. Mesure firsthand sur les deux listes de fichiers. Quelle que soit celle qui merge en second re-rougit main sur le meme test : une re-numerotation doit etre faite avant le second merge, pas apres.

@myia-ai-01 myia-ai-01 added the merge-dwell-waived Leve le plancher de 2h entre le dernier commit de tete et le merge (PR gate, urgence main rouge) label Sep 25, 2026
@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 17858
head: ae92832
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8454bf53c47bb137d4540c8ce7c2a533395d2a3ca1753e6e2fba5c41161d4e96
diff-files: 1
diff-additions: 0
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier tiers d'urgence (main rouge sur Scripts Tests (CPU)), émis par la lane myia-ai-01:CoursIA, qui ne porte pas cette PR.

  • Domaine vérifié de première main : test_twin_registry_integrity.py rend 1 échec sur main (test_audit_index_unique_and_no_identical_duplicates_per_pair) et 46 succès sur l'arbre de cette tête.
  • Le YAML renommé ne porte aucun index interne : le nom de fichier est la seule clé, et le renommage git mv pur suffit.
  • Le plancher DWELL est levé par le label merge-dwell-waived, prévu pour ce cas nommé (scripts/ci/merge_dwell.py, section Dérogation). PR gate est vert à 22:14:41Z.

@myia-ai-01
myia-ai-01 merged commit 07abf38 into main Sep 25, 2026
23 of 25 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 26, 2026
… parc (v4.33.0) (#17909)

* docs(lean,#14773): resync des 10 LEAN_INVENTORY.md sur le pin reel du parc (v4.33.0)

Grain: MED/docs — lane myia-po-2025:CoursIA — prev: LIGHT/ledger #17858

Les inventaires par serie annonçaient encore la cible precedente (v4.32.1) et
citaient des workflows que la bascule vers la matrice `lean-ci-matrix.yml` a
supprimes. Corrige sur mesure d'origin/main :

- toolchain v4.32.1 -> v4.33.0 pour les lakes reellement migres (mesure
  `git show origin/main:<lake>/lean-toolchain` : 28 lignes de tableau, 0 ecart)
- exceptions laissees telles quelles et documentees comme telles :
  `social_choice_lean_peters` (v4.32.1, amont incompatible 4.33) et
  `conway_cgt_lean` (v4.31.0-rc2, suit son amont)
- workflow -> matrice `lean-ci-matrix.yml` + cle de `scripts/lean/ci_lakes.json`
  (10 cles verifiees : gametheory, gamedefs, gamedefsext, learningtheory,
  decisiontheory, kelly, search, sudoku, erc20, argumentation)
- `planning_lean` garde `lean-planning.yml` (absent du catalogue de la matrice)
  et passe de `standalone-tactic` a `real`, baseline 0
- mentions « dernier run <date> » retirees la ou le changement de reference les
  rendait mal attribuees
- `SymbolicAI/Lean` : perimetre explicite (3 lake roots non couverts, nommes),
  metrique `real` (bascule #11688) et lien relatif vers `.claude/rules/` repare

Co-Authored-By: Claude Code <noreply@anthropic.com>

* docs(lean): correct SocialChoice CI inventory reference

Replace references to the retired workflow with the gametheory matrix key, including the certified SocialChoice path. See #14773.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-dwell-waived Leve le plancher de 2h entre le dernier commit de tete et le merge (PR gate, urgence main rouge) trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants