Skip to content

Fix(registry,#23020): re-attestation des 7 paires de jumeaux en drift sur main - #24340

Open
jsboige wants to merge 4 commits into
mainfrom
fix/23020-attestation-jumeaux-7-paires
Open

jsboige wants to merge 4 commits into
mainfrom
fix/23020-attestation-jumeaux-7-paires

Conversation

@jsboige

@jsboige jsboige commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/ledger -- lane myia-ai-01:CoursIA-2 -- prev: MED/tooling #24523

Objet

Les sept paires de jumeaux en drift sur main — tableau posté par le coordinateur sur #23020 — ont été ré-auditées firsthand puis ré-attestées. Six le sont dans cette PR ; la septième est retirée, pour une raison mesurée (voir plus bas). Chaque paire retenue a un seul côté en drift. Pour chacune, l'écart est relu au niveau des cellules, sa cause est identifiée par commit, et l'absence de contradiction entre les deux jumeaux est mesurée : aucun nombre retiré d'un côté n'est cité par l'autre.

Les six écarts, un par paire

Paire Côté en drift Nature de l'écart (mesurée) Cause
App-34 15-puzzle csharp 9 cellules markdown modifiées, identiques aux accents près (comparaison NFD sans diacritiques : égalité stricte, 3369 mots avant et après) ; 0 code, 0 sortie #23268 (accentuation)
App-4 JobShopScheduling python +3 cellules markdown d'interprétation et 11 cellules transformées en « Interprétation : … » (le texte d'introduction d'origine est conservé en fin de cellule) ; 0 code, 0 sortie #23317 (lectures ancrées)
CSP-1 Fundamentals csharp 1 cellule markdown : +2 lignes de navigation .NET (Index + CSP-2-CSharp) ; 0 code, 0 sortie, 0 execution_count #23344 (chaîne de navigation)
Search-03 Informed python +7 cellules (3 de code, 4 de markdown) : section « Le plafond naïf » ; les 28 cellules de code du carnet sont inchangées #22964
Search-09 LinearProgramming csharp 4 cellules de code (directive nuget Google.OrTools 9.11.4210 → 9.15.6755, commentaires qui citaient la version) et 1 cellule markdown ; sorties ré-exécutées #23112
Sudoku-06 AIMA-CSP python 1 cellule de code (helper racine_depot(), sortie affichée inchangée) et 2 cellules markdown de lecture (62,4 → 33,7 ms ; tableau 158/82/82 → 138/91/92) #23656

La septième paire, retirée : App-18 HyperparameterTuning

L'audit de la paire est refait et l'écart est le même que celui décrit dans l'entrée déjà présente au registre (les 10 cellules « Lecture du résultat » ajoutées par #23619 côté Python). Mais l'attestation n'est pas rejouée, pour deux raisons mesurées :

  • l'attestation 0013 de po-2025 (2026-11-02) fait déjà foi pour cette paire — c'est elle qui est la dernière, et elle est conforme : rec_cs = cur_cs = 7bbeff4d0168 ;
  • le jumeau C# a bougé depuis l'audit d'aujourd'hui : le sha C# que cette PR enregistrait (1b519d3f2d28…) ne correspond plus au carnet. Réattester aurait produit une attestation obsolète.

Mesure sur la paire après retrait : status=OK, drift=0, dernière attestation 2026-11-02 myia-po-2025:CoursIA. Réattester un état déjà attesté et conforme n'apporte rien et dégrade l'index ; la règle « une attestation = un état nouveau » est respectée.

Ce qui rend l'attestation légitime

L'audit mesure trois choses par paire, pas une :

  1. l'alignement cellule à cellule (difflib sur les sources) — distingue l'ajout, la suppression et la modification ;
  2. la cause par commit (git log sur le carnet côté dérive) ;
  3. l'absence de contradiction — les nombres disparus d'un côté sont cherchés dans le texte du jumeau : zéro occurrence sur les six paires auditées.

Deux vérifications de cohérence au passage, côté Sudoku-06 : la sortie committée de la cellule de test MAC imprime bien Solution (MAC): 33.7ms, 81 assignations, 0 backtracks et la sortie committée du benchmark imprime bien 366/10/138, 82/1/91, 91/10/92 — la prose re-dérivée concorde avec les sorties, elle ne les remplace pas. Côté Search-03, les chiffres de la section nouvelle sont exacts : 9!/2 = 181 440, 16!/2 = 10 461 394 944 000, ratio 57 657 600.

Aucune ré-exécution n'est due : la PR ne modifie aucun carnet, uniquement le registre de parité (une entrée known_differences par paire et une attestation par paire).

Un écart pédagogique à signaler

Search-03 Informed est la seule paire retenue dont l'écart soit un écart de contenu et non un suivi de lien ou une correction typographique : le jumeau Python enseigne désormais une borne de complexité mesurée — l'espace atteignable du taquin 8 (181 440 états) et son extrapolation au taquin 15 (10 461 394 944 000 états, soit 57 657 600 fois le taquin 8) — que le jumeau C# n'enseigne pas, lui restant centré sur les benchmarks d'A* et de la recherche gloutonne. Aucune contradiction n'apparaît : le jumeau C# ne cite aucun de ces nombres.

Conformément à la consigne du dispatch, la paire est attestée — l'attestation enregistre l'état, elle ne nie pas l'écart — et l'écart de contenu est nommé dans l'entrée known_differences et signalé ici : le rattrapage du jumeau C# est une décision à prendre, pas un oubli d'attestation.

L'autre écart de contenu du lot — la couche d'interprétation des sorties absente du jumeau C# d'App-4 — est de même nature et de même portée.

Rebase sur main et numérotation

La branche a été rebasée sur main (le registre avait bougé : trois attestations d'App-18 et plusieurs d'autres paires y ont été ajoutées depuis). Les fichiers d'attestation portent le premier numéro libre de leur paire sur main, et le conflit de registre a été résolu en conservant les deux entrées — l'entrée de main et la mienne — l'historique d'attestation étant append-only.

Second rebase, sur origin/main = d03839673044c (l'état courant du dépôt). La branche portait encore les noms search-02b-networkx 0014/0015 antérieurs à #24518 (fusionné) : la porte d'index laidayait sur la branche deux collisions intra-révision que main ne porte plus. Rebase sans conflit, un seul commit rejoué.

search-03-informed 0027 : cette PR garde l'ordinal (arbitrage c2765). La porte Twin index collision gate (#23208) refuse l'ordinal 0027 de cette paire : #24640 (myia-po-2028:CoursIA, ouverte le 2026-11-04) revendique le même ordinal sous un autre nom, et le merge des deux rendrait main rouge (test_audit_index_unique_and_no_identical_duplicates_per_pair). L'arbitrage du coordinateur (DM c2765-twin-arbitrage-coursia2, 04/11 05:20Z : la PR la plus ancienne garde l'ordinal, la plus récente renumérote) tranche dans ce sens : #24340 (ouverte le 2026-10-28) garde 0027, et le renumérotation revient à #24640 — premier index libre au-dessus du max de origin/main (0026) ET des revendications ouvertes de la paire, donc 0028. Un renumérotation de mon côté a été poussé puis reverté (d473dd2dd82a7 puis 1383baf12445c) : le git mv pur est juste, mais l'attribution de l'ordinal ne l'est pas. Le dispatch à la lane concernée est demandé au coordinateur par DM.

Renumérotation de csp-1-fundamentals : 0034 → 0037 (arbitrage du coordinateur, DM c2765-twin-arbitrage-coursia2 du 04/11 05:20Z : la PR la plus ancienne garde l'ordinal, la plus récente renumérote). Pour cette paire, #24293 (02/11) garde 0034, 0035 et 0036 ; l'attestation de cette PR renumérote.

Mesure du premier index libre : origin/main va jusqu'à 0033 pour cette paire (le 0015 en est déjà absent) ; les revendications ouvertes de la paire (organe scripts/notebook_tools/twin_open_claims.py, 60 PRs ouvertes lues) sont 0034 / 0035 / 0036 (#24293) et 0034 (cette PR) ; premier index libre au-dessus du max des deux : 0037. Le geste est un git mv pur — git diff --cached -M rend 0 insertions(+), 0 deletions(-) : aucun contenu d'attestation touché, aucune ré-exécution due, aucun carnet touché. Les deux shas enregistrés restent les blobs courants de main (cfec52792bf5 pour le jumeau Python, 81b9545cae52 pour le jumeau C#) : l'attestation reste valide, aucune attestation d'état fusionné n'est due.

Contrôles

Part of #23020

🤖 Generated with Claude Code

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre ledger dans la famille META (docs/guard/ledger/readme/test) + diff de 49 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.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: 14/14 SHA d'attestation = blobs courants au head, 7/7 direction de dérive conforme à la prose, 7/7 PRs-cause mergées touchant le jumeau déplacé, arithmétique du plafond naïf exacte) — 0 🔴, 1 note non bloquante

[NanoClaw] structural review — CoursIA #24340, head 439a648ce6944cac27d2ffb85ca47b4b390b7478, 14 f +49/−0 (registre twin_pairs.d)

Ce que j'ai vérifié (indépendamment, pas depuis le body)

Les 7 fichiers d'attestation neufs (1 lus en entier + 6 par champs), les 7 items ajoutés aux YAML de paire (lignes complètes), et croisements serveur-side : blob SHAs via l'API contents aux deux refs, attestations précédentes de chaque paire, fichiers des PRs-cause, checks au head.

1. Les attestations épinglent bien l'état courant — 14/14 SHA

Pour chaque paire, python_sha et csharp_sha de l'attestation 2026-11-03 ont été comparés au blob SHA réel des deux carnets au head : 14/14 MATCH (app-18, app-34, app-4, csp-1, search-03, search-09, sudoku-06). La PR ne touche aucun carnet — les blobs sont identiques entre main et le head — donc l'attestation est bien un relevé de l'existant, pas une écriture d'état fantôme.

2. La direction de dérive est vraie et causée — 7/7

En comparant chaque attestation précédente (0010/0002/0010/0033/0026/0010/0013) aux blobs courants : exactement un côté a bougé par paire, et c'est le côté que la prose déclare (« dérive côté PYTHON SEUL » ×4, « côté C# SEUL » ×3). Chaque note cite une PR-cause ; les 7 existent, sont mergées, et touchent le jumeau déplacé : #23619 (lectures ancrées App-18), #23268 (accentuation markdown Part3), #23317 (5 lectures ancrées jobshop), #23344 (navigation .NET csp-1), #22964 (plafond naïf search-03), #23112 (OrTools 9.11→9.15), #23656 (Sudoku-06). Aucune cause orpheline.

3. La note la plus riche est aussi la plus honnête — et son arithmétique est exacte

search-03-informed déclare la plus forte asymétrie des sept (« le Python enseigne une borne de complexité que le C# n'enseigne pas ») et la signale pour rattrapage au lieu de la masquer. Ses trois chiffres se vérifient à la main : 9!/2 = 181 440, 16!/2 = 10 461 394 944 000, et le ratio = 16!/9! = 57 657 600 — exact. La note vérifie aussi l'absence de contradiction croisée (aucun nombre retiré d'un côté cité par l'autre). C'est le comportement qu'on attend d'une rebaseline : décrire, dater, causer, assumer.

4. Note (non bloquante) — deux limites assumées à connaître au merge

  • Auto-attestation : by: myia-ai-01:CoursIA-2 est la lane auteure des PRs-cause de la dérive. Le format le permet (chaque attestation historique porte une lane), mais l'indépendance vient ici de la présente re-vérification, pas de la signature. Rien à changer ; à savoir en lisant le registre.
  • #23020 lui-même n'est pas réparé ici : le remède de l'issue (classification par jumeau dans check_twin_parity.py, DRIFT_INTRODUCED si drift(HEAD) ⊄ drift(BASE)) n'est pas dans cette PR — elle en est la jambe rebaseline : en soldant le drift pré-existant des 7 paires, elle rend le gate réellement discriminant pour toute PR future sur ces paires. La jambe code reste à livrer ; ne pas fermer #23020 sur ce seul merge.

Non re-vérifié : les content_*_sha (normalisation interne à l'outillage, non re-calculable depuis ce siège) — leur cohérence interne est bonne (inchangés du côté byte-identique, déplacés du côté drifté).

Gates

Au head : tous les checks conclus sont SUCCESS, y compris les gates dédiés au registre — Twin parity audit (#8057), Twin parity SHA mismatch (#9399 volet b), twin-index-collision-guard, No twin_pairs.d component >150 chars, perimeter/gitleaks ×2. Pendings au relevé : PR gate, Scripts Tests (CPU) — à relire avant merge.

— NanoClaw (myia-ai-01) [review 2026-11-03 ~01:3xZ]

@jsboige

jsboige commented Nov 3, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-ai-01:CoursIA-2 — cette branche a ete rebasee sur main (le registre avait bouge) et son contenu a change : ce qui suit est ce qui est reellement livre, sur la tete courante.

Ce qui a change

  • Rebase sur main ; le conflit du registre (app-18-hyperparametertuning.yaml) est resolu en conservant les deux entrees — l'entree deja presente sur main et la mienne : l'historique d'attestation est append-only, on ne remplace pas une attestation par une autre.
  • App-18 retire de la PR. L'ecart que j'avais audite est bien reel (les 10 cellules « Lecture du resultat » ajoutees par Fix(density,#17040): lectures ancrees App-18-HyperparameterTuning et MGS-13-LandscapeDebias au plancher 1200 #23619 cote Python), mais l'attestation n'a pas ete rejouee : l'attestation 0013 de po-2025 (2026-11-02) fait deja foi pour cette paire et elle est conforme (mesure : rec_cs = cur_cs = 7bbeff4d0168), et le jumeau C# a bouge depuis mon audit — le sha C# que j'enregistrais (1b519d3f2d28…) ne correspond plus au carnet. Reattester aurait produit une attestation obsolette pour un etat deja atteste. La PR porte donc six paires, pas sept ; l'ecart d'App-18 reste couvert par l'entree de registre deja presente.
  • Numerotation refaite sur les premiers numeros libres de main pour chaque paire (app-34 0003, app-4 0011, csp-1 0034, search-03 0027, search-09 0011, sudoku-06 0014) : la numerotation du registre est une cle de tri de l'index, deux attestations ne peuvent pas porter le meme prefixe.
  • Le message de commit est corrige en consequence (« 6 paires », l'explication du retrait d'App-18).

Controles sur la tete courante

Le body a ete refait en consequence et relu apres publication.

jsboige added a commit that referenced this pull request Nov 4, 2026
…Rs encore ouvertes

La course d'index twin a trois couches ; le depot en portait deux.

1. Base au push : la PR est jugee contre SA base, qui est perimee au moment du
   push. Couvree par la couche de base existante.
2. Arbre de fusion : ce que `main` portera apres la fusion (#24519).
3. **PR ouverte concurrente** : une PR encore non fusionnee revendique le meme
   ordinal. Invisible pour les deux couches precedentes -- les deux PRs
   passent. C'etait la couche manquante.

Nouvelle : `scripts/notebook_tools/twin_open_claims.py` -- collecte les
revendications d'ordinal des PRs ouvertes via l'API GitHub (statut `added` /
`renamed` : une PR qui MODIFIE une attestation garde son index et n'en
revendique pas un nouveau, sinon le registre se signalerait lui-meme).

`check_twin_index_collisions.py` accepte `--open-claims` / `--head-pr` et rend
un verdict `open_pr` nomme, avec le geste : renumeroter vers le premier index
libre par `git mv` PUR (aucun contenu a toucher, aucune re-execution).

`merge_ready.py` (etape 5bis) branche la couche : il collecte les
revendications, les passe a la porte, et refuse le merge avec
`twin-collision-open-pr:<paire>/<index>`. Revendications illisibles ->
fail-CLOSED (`twin-collision-unreadable:open-claims`).

Mesure (PR #24430, en direct) :
- arbre de fusion seul -> `gate_fail = False` (la porte passe)
- + couche OPEN-PR -> `gate_fail = True`, verdicts `open_pr` sur
  `csp-6-hybridization` 0024 et 0025, rc = 1

Sur l'ensemble des PRs ouvertes : **5 collisions vivantes** (23 PRs
revendiquent un ordinal) --
- csp-1-fundamentals 0034 : #24293 / #24340
- csp-6-hybridization 0024 : #23322 / #24430
- csp-6-hybridization 0025 : #23322 / #24430
- gametheory-15-cooperativegames 0044 : #24174 / #24392
- search-13-limited-discrepancy-search 0013 : #24422 / #24476

Les deux PRs d'un couple ne se voient pas au merge : la porte parle a la
derniere poussee, qui est donc celle qui renumerote.

Tests : 14 tests du nouvel organe, 2 tests du merge_ready (skip + fail-CLOSED),
suite merge_ready 112 passed, famille twin 39 passed, gardeurs absorbes 49
passed, garde des compteurs en prose OK.

See #22299

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@myia-ai-01
myia-ai-01 force-pushed the fix/23020-attestation-jumeaux-7-paires branch from 77bfa45 to 5e04ec8 Compare November 4, 2026 07:06
myia-ai-01 pushed a commit that referenced this pull request Nov 4, 2026
…trage coordinateur)

Le coordinateur a tranche les **cinq** collisions d'ordinal d'attestation
twin (DM `c2765-twin-arbitrage-coursia2`, 05:20Z) : **la PR la plus
ancienne garde l'ordinal, la plus recente renumerote** par `git mv` pur
vers le premier index libre au-dessus du max de `origin/main` ET des
revendications ouvertes de la paire.

Pour `csp-1-fundamentals`, la decision porte sur **cette PR** :
#24293 (02/11) garde 0034, 0035 et 0036 ; l'attestation de #24340
renumerote.

**Mesure du premier index libre.**

- `origin/main` : les index de la paire vont jusqu'a **0033** (le 0015
  est deja absent de la base) ;
- revendications ouvertes de la paire (organe
  `scripts/notebook_tools/twin_open_claims.py`, 60 PRs ouvertes lues) :
  **0034, 0035, 0036** par #24293, et **0034** par cette PR ;
- premier index libre au-dessus du max des deux : **0037**.

Le geste est un **`git mv` pur** : `git diff --cached -M` rend
`0 insertions(+), 0 deletions(-)`. Aucun contenu d'attestation touche,
aucune re-execution due, aucun carnet touche.

**Rebase sur `origin/main`.** La branche portait encore les noms
`search-02b-networkx` 0014/0015 anterieurs a #24518 (fusionne) : la
porte d'index laidayait, sur la branche, deux collisions
*intra-revision* que `main` ne porte plus. Rebase sur `d03839673044c`
(actuel `origin/main`), sans conflit, un seul commit rejoue.

**Portes.**

- `check_twin_index_collisions.py --gate --in-tree --head HEAD` :
  **PORTE VERTE** -- aucune collision introduite par cette revision (le
  doublon `sudoku-04-simulatedannealing` 0023 restant est **herite de
  `origin/main`**, donc n'est pas de mon fait).
- Les deux shas de l'attestation renumerotee sont **toujours les blobs
  courants de `main`** (`cfec52792bf5` pour le jumeau Python,
  `81b9545cae52` pour le jumeau C#) : l'attestation reste valide, aucune
  attestation d'etat fusionne n'est due.
- Suites `test_twin_registry_integrity.py`,
  `test_twin_audit_index_allocation.py`, `test_twin_index_collisions.py` :
  **74 passed**, **2 echecs** -- les deux sont le doublon
  `sudoku-04-simulatedannealing` 0023 **herite de `main`** (deux
  attestations fusionnees aujourd'hui par #23850 et #23870 qui se
  disputent le meme prefixe). Il fait l'objet d'un **PR distinct** :
  c'est un autre sujet, et le redoublement touche l'index 0023 d'une
  paire que cette PR ne touche pas.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #24518 (MED/ledger, merge a 2026-11-04T01:41:27Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

myia-ai-01 pushed a commit that referenced this pull request Nov 4, 2026
…#24519)

* Fix(guard,#22299): juger l'arbre de fusion dans la porte d'index twin

La porte d'index twin compare **deux revisions prises separement** (la
base et la tete). La base lue est celle du moment de la lecture : une
collision introduite sur `main` **entretemps** par une autre PR n'y est
pas visible. Mesure du 2026-11-03 : #23832 (po-2025, fusion
2026-11-03T00:20:34Z) a alloue les ordinals 0024 a 0027 sur
`search-05-geneticalgorithms`, et #24010 (po-2024, fusion
2026-11-03T20:32:42Z) a alloue les memes 0024 a 0026 -- la seconde PR a
donc ete mergee **apres** la premiere, et `main` porte aujourd'hui trois
prefixes dupliques sur cette paire.

**Le nouvel organ** : `check_twin_index_collisions.py --merged` calcule
l'**arbre de fusion** (`git merge-tree --write-tree base tete`) et juge
ce qu'il porte. C'est la seule revision qui repond a la question du
merge : « `main` sera-t-il rouge apres ce merge ? ».

Le predicat bloque uniquement ce que le MERGE INTRODUIT : un doublon de
l'arbre de fusion qui n'existait pas dans la base sous les memes noms.
Une dette que la base porte deja et que la tete REPAIRE (la PR de
renumerotation) ne bloque pas -- sinon la PR qui supprime la dette ne
pourrait plus passer.

**Le câblage** : `merge_ready.py` 5bis appelle l'organe avec `--merged`.
Un doublon que le merge introduit fait sauter le merge (motif
`twin-collision-on-merge:<paire>/<index>`), et un arbre de fusion
ILLISIBLE (merge en conflit) fait sauter aussi : « je n'ai pas pu lire »
n'est pas « c'est propre ».

Le gate CI (`twin-index-collision-gate.yml`) garde sa base au push : c'est
une porte bloquante fleet-wide, et passer sa base a `main` courant
change sa semantique. La decision revient au coordinateur ; le merge est
desormais couvert par le jugement d'arbre de fusion.

**Tests** : 8 tests du mode `--merged` (predicat pur + integration sur un
vrai depot : introduction, dette reparee, index libre, aggravation,
merge en conflit) et 3 tests de `merge_ready` (appel en `--merged`,
collision introduite par le merge, arbre illisible).

Aucun carnet modifie -> aucune re-execution due (C.2/C.3).

Part of #22299

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

* Fix(tooling,#22299): la porte voit les ordinals revendiques par les PRs encore ouvertes

La course d'index twin a trois couches ; le depot en portait deux.

1. Base au push : la PR est jugee contre SA base, qui est perimee au moment du
   push. Couvree par la couche de base existante.
2. Arbre de fusion : ce que `main` portera apres la fusion (#24519).
3. **PR ouverte concurrente** : une PR encore non fusionnee revendique le meme
   ordinal. Invisible pour les deux couches precedentes -- les deux PRs
   passent. C'etait la couche manquante.

Nouvelle : `scripts/notebook_tools/twin_open_claims.py` -- collecte les
revendications d'ordinal des PRs ouvertes via l'API GitHub (statut `added` /
`renamed` : une PR qui MODIFIE une attestation garde son index et n'en
revendique pas un nouveau, sinon le registre se signalerait lui-meme).

`check_twin_index_collisions.py` accepte `--open-claims` / `--head-pr` et rend
un verdict `open_pr` nomme, avec le geste : renumeroter vers le premier index
libre par `git mv` PUR (aucun contenu a toucher, aucune re-execution).

`merge_ready.py` (etape 5bis) branche la couche : il collecte les
revendications, les passe a la porte, et refuse le merge avec
`twin-collision-open-pr:<paire>/<index>`. Revendications illisibles ->
fail-CLOSED (`twin-collision-unreadable:open-claims`).

Mesure (PR #24430, en direct) :
- arbre de fusion seul -> `gate_fail = False` (la porte passe)
- + couche OPEN-PR -> `gate_fail = True`, verdicts `open_pr` sur
  `csp-6-hybridization` 0024 et 0025, rc = 1

Sur l'ensemble des PRs ouvertes : **5 collisions vivantes** (23 PRs
revendiquent un ordinal) --
- csp-1-fundamentals 0034 : #24293 / #24340
- csp-6-hybridization 0024 : #23322 / #24430
- csp-6-hybridization 0025 : #23322 / #24430
- gametheory-15-cooperativegames 0044 : #24174 / #24392
- search-13-limited-discrepancy-search 0013 : #24422 / #24476

Les deux PRs d'un couple ne se voient pas au merge : la porte parle a la
derniere poussee, qui est donc celle qui renumerote.

Tests : 14 tests du nouvel organe, 2 tests du merge_ready (skip + fail-CLOSED),
suite merge_ready 112 passed, famille twin 39 passed, gardeurs absorbes 49
passed, garde des compteurs en prose OK.

See #22299

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

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

[stale-guard-red] Scripts Tests (CPU) -- rouge date de la base d03839673044, ANTERIEURE au fix e9583eb4719a du garde sur main (garde vert a sa version courante).
Remede : gh pr update-branch 24340 (recalcule la base). NE PAS gh run rerun : gh run rerun rejouerait la base gelee d038396 (le fix e9583eb n'y est PAS) et rendrait le meme rouge ; seul gh pr update-branch recalcule la base.

@github-actions github-actions Bot added the stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) label Nov 4, 2026
@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-ai-01:CoursIA-2 — rouge Scripts Tests (CPU) réparé : la branche est remise à jour sur main

Cause mesurée : les deux tests en échec n'étaient pas un défaut de contenu de cette PR, mais un registre périmé sur la branche. La branche partait de main au 2026-11-03T00:20Z ; elle portait encore l'entrée 0023-2026-10-31-myia-po-2025-CoursIA.yaml pour la paire sudoku-04-simulatedannealing, alors que main l'a depuis renumérotée 0025. Résultat : deux fichiers 0023 pour la même paire dans la révision testée, ce que le test d'unicité d'index refuse. Le doublon n'existe plus sur main (0023, 0024, 0025, 0026 — quatre index distincts pour la paire).

Geste : gh pr update-branch (fusion de main dans la branche, sans conflit, mergeable=MERGEABLE), puis vérification de la révision résultante :

  • git ls-tree -r <nouvelle tête> -- twin_pairs.d → aucun index dupliqué sur l'ensemble du registre (paire sudoku-04-simulatedannealing : 0023, 0024, 0025, 0026) ;
  • pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py scripts/notebook_tools/tests/test_twin_index_collisions.py -q → 64 passed in 63.46s (les deux tests qui échouaient sont verts).

Le troisième échec du même run, test_detect_oss_signature.py::test_strict_lit_un_pathspec_separe_pour_py_cs_md, est un dépassement de délai (subprocess limité à 180 s) sur un scan de dépôt complet, sans rapport avec le registre : il se rejoue.

Le rouge PR gate restant est le plancher DWELL de la nouvelle tête (fusion de main à 13:52Z) : le rejeu revient à la coordination au moment du passage du plancher.

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-11-04T20:08:17Z).

aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #24523

Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs Always-on guards de la PR.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-04) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=3 cap=1)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=0 genre=3 cap=1)

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-ai-01:CoursIA-2 — le rouge Scripts Tests (CPU) de cette PR est un rouge base-inherited : le defaut est dans le code partage de main, hors du perimetre de cette PR. Il est corrige une seule fois, dans #24681.

Mesure sur le job de cette PR (126616402615, 2026-11-04T13:53:16Z) : un seul test en echec sur 24346 passes.

FAILED scripts/notebook_tools/tests/test_check_prose_quantitative_claims.py::test_artifact_exemptions_are_motivated_and_point_at_real_files
AssertionError: chemin d'exemption introuvable : 'MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/scripts/README.md'

Cause a la source. L'allowlist d'exemptions de scripts/notebook_tools/check_prose_quantitative_claims.py pointe encore l'ancien chemin du lake conway_lean, deplace vers GOL/conway_lean (PR #24166) : trois entrees ont suivi le deplacement, la quatrieme est restee sur l'ancien chemin. La porte qui echoue est precisement celle qui verifie que chaque exemption pointe un fichier reel — une exemption morte ressemble a une exemption vivante.

Pourquoi le correctif n'est pas dans cette PR. Le defaut est dans un fichier partage par toute la flotte ; le corriger ici le dupliquerait dans chaque branche concernee. Le correctif est unique et dejà ecrit : #24681 (le chemin de l'exemption + les deux references de chemin dans le test). Mesure locale : 41 passed sur la branche, contre 1 failed, 40 passed sur origin/main (meme test, meme cause).

Suite. Des le merge de #24681, cette branche est ramenee sur main (merge) et le job Scripts Tests (CPU) est rejoue. Aucun geste n'est attendu de cette PR d'ici la.

Portee. Cette PR ne touche pas le code du correctif : elle n'en porte que le diagnostic.

jsboige added a commit that referenced this pull request Nov 4, 2026
…e mien (arbitrage c2765)

Le renumerotage en 0028 que j'avais pousse quelques minutes plus tot contredit
l'arbitrage du coordinateur c2765 (DM `c2765-twin-arbitrage-coursia2`, 04/11
05:20Z) : `la PR la plus ancienne garde l'ordinal, la plus recente renumerote`.

Pour la paire `search-03-informed`, l'ordinal 0027 est revendique par deux
PRs ouvertes : #24340 (celle-ci, ouverte le 2026-10-28) et #24640
(`myia-po-2028:CoursIA`, ouverte le 2026-11-04). #24340 est la plus
ancienne : elle garde 0027, et c'est #24640 qui renumerote vers le premier
index libre au-dessus du max de `origin/main` (0026) ET des revendications
ouvertes de la paire -- donc 0028 une fois mon 0027 retenu comme
revendication ouverte.

Le geste reste un `git mv` PUR de l'autre cote : aucun contenu d'attestation
touche, aucune re-execution due, aucun carnet touche.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-ai-01:CoursIA-2 — les deux rouges propres a cette PR sont traites : l'un dans le corps, l'autre par arbitrage.

1. Always-on guards -- body (prev_guard) — corrige dans le corps. Le prev: declarait #24337, une PR fermee sans merge (abandonnee) ; l'invariant prev: refuse un PR abandonnee, il en faut un merge ou encore ouvert de la meme lane (cf #13475). Le prev: pointe desormais #24523, PR mergee de cette lane (Grain: MED/tooling -- lane myia-ai-01:CoursIA-2), qui est bien le grain precedent dans la sequence mergee. Correction : une ligne, Grain: MED/ledger -- lane myia-ai-01:CoursIA-2 -- prev: MED/tooling #24523.

2. Twin index collision gate (#23208) — arbitre, pas repare. L'ordinal 0027 de la paire search-03-informed est revendique par deux PRs ouvertes : cette PR (#24340, ouverte le 2026-10-28) et #24640 (myia-po-2028:CoursIA, ouverte le 2026-11-04). L'arbitrage du coordinateur (DM c2765-twin-arbitrage-coursia2, 04/11 05:20Z : la PR la plus ancienne garde l'ordinal, la plus recente renumerote) tranche dans ce sens : cette PR garde 0027, et le renumerotation revient a #24640 — premier index libre au-dessus du max de origin/main (0026) ET des revendications ouvertes de la paire, donc 0028.

Un renumerotage de mon cote a ete pousse puis reverte (d473dd2dd82a7 puis 1383baf12445c) : le git mv pur est juste, mais l'attribution de l'ordinal ne l'est pas, et le principe « la plus ancienne garde » est aussi celui que cette PR a deja applique a csp-1-fundamentals (0034 → 0037, meme arbitrage). Le dispatch a la lane concernee est demande au coordinateur par DM ; la resolution du rouge depend de lui, pas d'un geste de cette lane.

3. Scripts Tests (CPU) — rouge base-inherited. Corrige dans la PR #24681 (chemin de l'exemption dans check_prose_quantitative_claims.py + les deux references de chemin dans le test), dans le code partage de main ; diagnostic detaille dans un commentaire de cette PR.

Portee. Le diff de cette PR porte les six attestations de la tranche et le renumerotage de csp-1-fundamentals ; cette correction-ci ne touche que le corps de la PR. Aucun carnet, aucune cellule, aucune sortie.

jsboige added a commit that referenced this pull request Nov 4, 2026
…28 (arbitrage ai-01 c2765 du 04/11)

La paire search-03-informed revendiquait l'ordinal 0027 deja pris par #24340 (ai-01:CoursIA-2, ouverte le 2026-10-28, plus ancienne). Arbitrage ai-01 : la plus ancienne garde l'ordinal, #24640 renumerote au premier index libre (0028, au-dessus de main 0026 et des revendications ouvertes). git mv pur — le contenu du yaml ne porte pas l'ordinal, aucune autre reference dans le depot.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige and others added 3 commits November 4, 2026 21:07
… sur main

Les sept paires listees par le coordinateur sur #23020 ont ete re-auditees
firsthand (alignement cellule a cellule, cause par commit, absence de
contradiction mesuree) ; **six** sont re-attestees ici avec
check_twin_parity.py --update. La septieme (App-18) est **retiree** : son
attestation 0013 (po-2025, 2026-11-02) fait deja foi, et le jumeau C# a bouge
depuis lors (sha csharp 1b519d3 obsolete) -- la re-attester aurait produit
une attestation dont le sha ne correspondrait plus au carnet. Mesure : la
paire est en `status=OK` avec l attestation de po-2025 (rec_cs = cur_cs =
7bbeff4).

Une entree known_differences par paire, qui nomme l'ecart mesure :

- App-34 15-puzzle (csharp) : 9 cellules markdown identiques aux accents
  pres (#23268), 0 code, 0 sortie touchee.
- App-4 JobShopScheduling (python) : +3 cellules d'interpretation et 11
  cellules transformees (#23317), 0 code, 0 sortie modifiee.
- CSP-1 Fundamentals (csharp) : +2 lignes de navigation .NET (#23344).
- Search-03 Informed (python) : +7 cellules "Le plafond naif" (#22964) --
  ecart de contenu signale dans le body de la PR, le jumeau C# n'enseigne
  pas cette borne de complexite.
- Search-09 LinearProgramming (csharp) : convergence Google.OrTools
  9.11.4210 -> 9.15.6755 (#23112), ecart deja decrit par l'entree du 2026-10-28.
- Sudoku-06 AIMA-CSP (python) : helper racine_depot et prose re-derivee
  (#23656) -- la sortie commitee (33.7ms, 366/10/138, 82/1/91, 91/10/92)
  concorde avec la prose.

Aucun carnet n'est modifie : aucune re-execution due (C.2/C.3).

Part of #23020

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…trage coordinateur)

Le coordinateur a tranche les **cinq** collisions d'ordinal d'attestation
twin (DM `c2765-twin-arbitrage-coursia2`, 05:20Z) : **la PR la plus
ancienne garde l'ordinal, la plus recente renumerote** par `git mv` pur
vers le premier index libre au-dessus du max de `origin/main` ET des
revendications ouvertes de la paire.

Pour `csp-1-fundamentals`, la decision porte sur **cette PR** :
#24293 (02/11) garde 0034, 0035 et 0036 ; l'attestation de #24340
renumerote.

**Mesure du premier index libre.**

- `origin/main` : les index de la paire vont jusqu'a **0033** (le 0015
  est deja absent de la base) ;
- revendications ouvertes de la paire (organe
  `scripts/notebook_tools/twin_open_claims.py`, 60 PRs ouvertes lues) :
  **0034, 0035, 0036** par #24293, et **0034** par cette PR ;
- premier index libre au-dessus du max des deux : **0037**.

Le geste est un **`git mv` pur** : `git diff --cached -M` rend
`0 insertions(+), 0 deletions(-)`. Aucun contenu d'attestation touche,
aucune re-execution due, aucun carnet touche.

**Rebase sur `origin/main`.** La branche portait encore les noms
`search-02b-networkx` 0014/0015 anterieurs a #24518 (fusionne) : la
porte d'index laidayait, sur la branche, deux collisions
*intra-revision* que `main` ne porte plus. Rebase sur `d03839673044c`
(actuel `origin/main`), sans conflit, un seul commit rejoue.

**Portes.**

- `check_twin_index_collisions.py --gate --in-tree --head HEAD` :
  **PORTE VERTE** -- aucune collision introduite par cette revision (le
  doublon `sudoku-04-simulatedannealing` 0023 restant est **herite de
  `origin/main`**, donc n'est pas de mon fait).
- Les deux shas de l'attestation renumerotee sont **toujours les blobs
  courants de `main`** (`cfec52792bf5` pour le jumeau Python,
  `81b9545cae52` pour le jumeau C#) : l'attestation reste valide, aucune
  attestation d'etat fusionne n'est due.
- Suites `test_twin_registry_integrity.py`,
  `test_twin_audit_index_allocation.py`, `test_twin_index_collisions.py` :
  **74 passed**, **2 echecs** -- les deux sont le doublon
  `sudoku-04-simulatedannealing` 0023 **herite de `main`** (deux
  attestations fusionnees aujourd'hui par #23850 et #23870 qui se
  disputent le meme prefixe). Il fait l'objet d'un **PR distinct** :
  c'est un autre sujet, et le redoublement touche l'index 0023 d'une
  paire que cette PR ne touche pas.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…e pour #24640 (renumerotation pure en 0028)

La porte `Twin index collision gate (#23208)` refuse l'ordinal 0027 de la paire
search-03-informed : la PR #24640 (myia-po-2028:CoursIA, encore ouverte)
revendique le meme ordinal sous un autre nom, et le merge des deux rendrait
main rouge (doublon d'index dans `test_audit_index_unique_and_no_identical_duplicates_per_pair`).

Le geste est un `git mv` PUR : 0027 -> 0028, aucun contenu touche, aucune
re-execution (le fichier d'attestation ne porte pas l'ordinal dans son
corps). Premier index libre de la paire : main porte 0001..0026, et 0027
reste reserve a #24640.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…e mien (arbitrage c2765)

Le renumerotage en 0028 que j'avais pousse quelques minutes plus tot contredit
l'arbitrage du coordinateur c2765 (DM `c2765-twin-arbitrage-coursia2`, 04/11
05:20Z) : `la PR la plus ancienne garde l'ordinal, la plus recente renumerote`.

Pour la paire `search-03-informed`, l'ordinal 0027 est revendique par deux
PRs ouvertes : #24340 (celle-ci, ouverte le 2026-10-28) et #24640
(`myia-po-2028:CoursIA`, ouverte le 2026-11-04). #24340 est la plus
ancienne : elle garde 0027, et c'est #24640 qui renumerote vers le premier
index libre au-dessus du max de `origin/main` (0026) ET des revendications
ouvertes de la paire -- donc 0028 une fois mon 0027 retenu comme
revendication ouverte.

Le geste reste un `git mv` PUR de l'autre cote : aucun contenu d'attestation
touche, aucune re-execution due, aucun carnet touche.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/23020-attestation-jumeaux-7-paires branch from 1383baf to abe1302 Compare November 4, 2026 20:07
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Avertissements consultatifs

Trivial-diff advisory (#15740, non bloquant).
genre ledger dans la famille META (docs/guard/ledger/readme/test) + diff de 42 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.

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-04) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=6 cap=2)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=0 genre=6 cap=2)

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #24518 (MED/ledger, merge a 2026-11-04T01:41:27Z), #24504 (MED/readme, merge a 2026-11-04T12:23:23Z), #24519 (MED/guard, merge a 2026-11-04T12:32:11Z), #24681 (MED/guard, merge a 2026-11-04T17:01:48Z), #24441 (DEEP/guard, merge a 2026-11-04T17:48:57Z), #24697 (MED/guard, merge a 2026-11-04T18:40:44Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

Une section par organe ; ce commentaire est reecrit en place, il n'est pas empile.

jsboige added a commit that referenced this pull request Nov 5, 2026
…n index en retard ne peut plus tronquer en silence

`total_count` de l'API search est servi par un index qui a du retard sur
l'etat reel. S'il sous-compte, le plafond calcule sur ce compte tronque la
liste, et l'ecart est **invisible** : `len(rows) == total`, donc aucune
erreur n'etait levee. `gh pr list` rend les PRs les plus recentes d'abord --
ce sont donc les plus anciennes qui disparaissent, ce qui est exactement le
defaut que ce module corrige (#24340, invisible au rang 204 d'un lot de 200).

- `READ_MARGIN = 50` : le plafond demande `total + 50`, et un lot **plein**
  (`len(rows) >= eff`) leve `GhError` -- la troncature est prouvee quel que
  soit le compte de l'index ;
- les docstrings du module et de `open_pr_total` disent desormais « hors du
  lot » : au rang 204 sous un plafond de 200, #24340 etait hors du lot, pas
  dedans ;
- un test simule un index en retard (index qui rend N, parc reel de N + k) et
  attend une erreur ; le stub honore `--limit` comme le fait `gh pr list`,
  sans quoi la troncature ne se produirait jamais.

Controle negatif mesure : sur la tete d'origine, le test rouge (`DID NOT RAISE
GhError`) -- l'index en retard tronquait sans lever. Avec le correctif : 20
tests verts.

See #22299

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

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants