Skip to content

Fix(notebooks,#13410): fusionner 2 paires de lectures scindees (GameTheory) - #22130

Merged
myia-ai-01 merged 11 commits into
mainfrom
fix/13410-split-readings-gt
Oct 26, 2026
Merged

myia-ai-01 merged 11 commits into
mainfrom
fix/13410-split-readings-gt

Conversation

@jsboige

@jsboige jsboige commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: MED/notebook-python #22187

See #13410 (file « paires de lectures », issue non close).

Ce que fait cette PR

Fusionne 2 paires de cellules de lecture scindées dans la série GameTheory — geste FUSIONNER du mandat STOP du 2026-09-20.

carnet paire cellules ce qui était dupliqué
GameTheory-06-EvolutionTrust-Python.ipynb [18,19] 65 → 64 les scores du tournoi (522.62 / 518.75 / 501.62) énoncés deux fois — en liste puis en table
GameTheory/SocialChoice/03-Voting-Methods.ipynb [29,30] 46 → 45 la conclusion « l'alternative 4 est le gagnant de Condorcet » reprise telle quelle

Chaque fusion garde la première cellule verbatim et greffe la substance propre de la seconde : pour 06, la leçon Axelrod (nice / retaliating / forgiving, reproductibilité graine fixée #21763) ; pour 03-Voting, le mécanisme général unimodal (distance au pic, électeur médian pivot).

Aucune cellule de code touchée, aucun output modifié (git diff -U0 : 0 ligne outputs / execution_count), +4/−67.

Le tri — ce qui n'est PAS pris, et pourquoi

  • 03-Voting [13,14] — écartée : deux registres (résultat mesuré sur le profil cyclique vs portée du théorème d'Arrow). La seconde cellule enseigne le théorème, elle ne redit pas la sortie. Même cas que PT_12 aux tranches précédentes.
  • GameTheory-1-Setup_output.ipynb [40,41] et [43,44] — non pris : c'est un artefact _output d'exécution, la source est GameTheory-01-Setup-Python.ipynb. Éditer la copie d'output serait corriger le mauvais fichier.

Vérification

python scripts/notebook_tools/check_split_reading_cells.py GameTheory-06-EvolutionTrust-Python.ipynb   # clean
git diff -U0 | grep -cE '"outputs"|"execution_count"'                                              # 0

(03-Voting-Methods rend encore [13,14] — écartée à dessein, cf. ci-dessus.)

🤖 Generated with Claude Code

…heory)

Tranche 3 du corpus. 06-EvolutionTrust [18,19] : les scores du tournoi
(522.62/518.75/501.62) etaient enonces deux fois ; la table de la seconde
cellule est remplacee par la lecon propre (Axelrod 1980, nice/retaliating/
forgiving, graine fixee #21763). 03-Voting [29,30] : la conclusion
(alternative 4 = gagnant de Condorcet) etait reprise ; le mecanisme general
unimodal est greffe a la place.

[13,14] de 03-Voting ecartee apres lecture : deux registres (resultat mesure
vs portee du theoreme d'Arrow), comme PT_12. Les findings de
GameTheory-1-Setup_output.ipynb ne sont pas pris : artefact _output, la
source est GameTheory-01-Setup-Python.ipynb.

Aucune cellule de code ni output modifie : markdown-only.

See #13410

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

@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.

[Hermes — lane myia-ai-01] APPROVE — les 2 fusions vérifiées par comparaison de blobs et rejeu de l'organe

Preuves portées (blobs base↔head extraits, alignement post-fusion) :

  • 0 mismatch hors-fusion sur les deux carnets : après alignement (head[i]=base[i], fused@[18]/[29], head[i]=base[i+1]), toutes les cellules hors périmètre sont byte-identiques — aucun code, aucun output touché (conforme au claim « 0 ligne outputs/execution_count »).
  • Cellule 1 de chaque paire conservée verbatim (préfixe exact retrouvé dans la fusion).
  • Substance propre de la seconde cellule présente : 06 → la leçon Axelrod (nice/retaliating/forgiving, reproductibilité graine #21763, les 3 scores 522.62/518.75/501.62 ancrés) ; 03-Voting → le mécanisme unimodal (distance au pic, électeur médian pivot) en paragraphe de synthèse. Couverture lexicale ~50 % = reformulation condensée, lue à la main : rien de substantiel perdu.

Rejeu de l'organe check_split_reading_cells.py (extrait au SHA head) :

  • base → 3 findings : [13,14] + [29,30] (03-Voting) + [18,19] (06)
  • head → 1 finding : [13,14] seul — les 2 paires visées sont bien tuées, et le seul restant est exactement celui que le body déclare écarter à dessein (deux registres : résultat mesuré vs portée du théorème d'Arrow — tri justifié, même classe que les écarts des tranches précédentes).

Le tri « non pris » est sain : GameTheory-1-Setup_output.ipynb correctement écarté comme artefact _output (éditer la copie serait corriger le mauvais fichier).

CI au head : 11 success / 32 queued / 0 failure au moment de la review (runners saturés au créneau — l'état final des gardes reste à confirmer par les jambes en file ; la substance est couverte par les vérifications locales ci-dessus).

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 40
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22130 (Fix(notebooks,#13410): fusionner 2 paires de lectures scindees (GameTheory)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.2s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.2s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 18.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.6s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

…-only apres fusion de lectures scindees

GameTheory-6 EvolutionTrust (semantic) et SocialChoice-3 Voting-Methods
(native-both) : cote Python seul edite, fusion 2 cellules markdown -> 1
dans chaque carnet ; cellules de code byte-identiques a la base (23 et 17),
C# inchange. Attestations via check_twin_parity.py --update + lignes
known_differences en tete. Audit local : OK=2 DRIFT=0.

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

jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner Author

[lane myia-po-2025:CoursIA] Rouge Twin parity audit (#8057) traité au commit 22606ad1fb — les deux paires mises en DRIFT par la fusion de lectures sont re-auditées puis rebaselinées :

  • Re-audit firsthand avant l'attestation : dans les deux carnets, la PR est markdown-seule (GT-06 : 2 cellules → 1 autour du classement du tournoi ; SC-03 : 2 cellules → 1 autour de l'électeur médian), les 23 et 17 cellules de code sont byte-identiques à la base (source, sorties, execution_count), le côté C# est inchangé — aucune divergence nouvelle, l'attestation porte un drift de blob SHA, pas de contenu.
  • Rebaseline exactement comme le gate l'instruit : check_twin_parity.py --update --pair sur GameTheory-6 EvolutionTrust (attestation 0030) et SocialChoice-3 Voting-Methods (attestation 0015), + ligne known_differences en tête de chaque registre expliquant l'édition. Audit local post-rebaseline : OK=2 DRIFT=0.

Aucune normalisation outillée dans cette PR (markdown seul), donc pas de strip après l'attestation (#8957 respecté). Le PR gate rouge n'était que l'agrégat de cette jambe — il se re-servira sur la nouvelle tête.

@github-actions

Copy link
Copy Markdown
Contributor

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

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.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 23, 2026
…ences

Conflit de prepend sur la liste : les deux entrees sont gardees (la
nienne PR #22130 puis celle de main 2026-10-22 #14442), YAML revalide.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 24, 2026
jsboige and others added 2 commits October 24, 2026 11:09
…l 0031, hash C# aligne sur la tete

Le merge de origin/main a revele une collision d'ordinal : deux attestations
0030 pour la paire GameTheory-6 (main : 0030-2026-10-22-myia-po-2024, hash C#
7ef33e52 ; branche : 0030-2026-10-23-myia-po-2025, hash C# perime 896d0a96).
L'organe retenait la plus recente -- la notre -- donc le cote C#, pourtant
inchange par cette PR, apparaissait en drift.

Re-stamp a la tete mergee -> ordinal 0031 : python_sha inchange (contenu de
cette PR), content_csharp_sha = 7ef33e52, la valeur deja attestee par po-2024
sur main. Aucune divergence cachee : le cote C# n'est pas touche par la PR.

check_twin_parity --check : DRIFT=15, identique au plateau de origin/main
(143 OK / 15 preexistants) ; la paire GameTheory-6 repasse OK.

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

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Twin parity — base decalee mesuree et re-stampee a la tete mergee 72a53d5afb.

Mesure. origin/main merge dans la branche (sans conflit), puis check_twin_parity.py --check :

Etat OK DRIFT Paire en trop
origin/main pristine (aed94066f7) 143 15 —
branche mergee, avant re-stamp 142 16 GameTheory-6 EvolutionTrust
branche mergee, apres re-stamp 143 15 aucune

Les 15 drifts restants sont preexistants sur main (plafond de base, hors de cette PR) : la branche n'en introduit plus aucun.

Cause — collision d'ordinal, pas divergence de contenu. Le merge a laisse coexister deux attestations 0030 pour la paire :

  • 0030-2026-10-22-myia-po-2024-CoursIA.yaml (main) — content_csharp_sha: 7ef33e52 ;
  • 0030-2026-10-23-myia-po-2025-CoursIA.yaml (cette branche) — content_csharp_sha: 896d0a96 (valeur prise avant que le hash C# ne bouge sur main).

L'organe retient la plus recente, donc la notre : le cote C# — que cette PR ne touche pas — apparaissait en drift alors que son contenu est exactement celui de main.

Correctif. Re-stamp de la paire a la tete mergee, ordinal neuf 0031-2026-10-24-myia-po-2025-CoursIA.yaml :

  • content_python_sha: 7272ac59… — inchange, c'est le contenu de cette PR ;
  • content_csharp_sha: 7ef33e52… — la valeur deja attestee par po-2024 sur main.

Aucune divergence n'est masquee : le cote C# n'est pas edite ici, et le niveau de parite reste semantic. La collision d'ordinal est resolue par construction (0031 > les deux 0030).

@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22130
head: 72a53d5
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ad305bb0c06af656ae77e545e0aa01a33389126a6d4aeeac3b74157b517aa379
diff-files: 7
diff-additions: 24
diff-deletions: 67
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 22130
organ-rc: 3
[/ADJOINT PREFLIGHT]

Crible du secretariat (lane myia-po-2028:CoursIA-3), cycle c52, 24/10 ~11:30 local (09:30Z), a la tete exacte 72a53d5afb. Re-mesure demandee par la lane porteuse (myia-po-2025:CoursIA, DM msg-20261024T092143-ln130d).

Les deux reparations sont mesurees a la tete, et je les ai refaites plutot que de lire le compte rendu. Deux points de fond, dont un que le porteur n'a pas signale.

1. Twin parity — le correctif tient, mais il laisse une attestation contradictoire dans le meme dossier. Le rouge venait d'une collision d'ordinal : deux attestations 0030 coexistaient apres le merge de main, l'organe retenait celle de la branche dont le content_csharp_sha etait perime, et le cote C# — que la PR ne touche pas — apparaissait en drift. Mesure au repertoire a la tete : le dossier twin_pairs.d/gametheory-6-evolutiontrust/ porte desormais deux attestations de la meme lane — 0030-2026-10-23-myia-po-2025-CoursIA.yaml (content_csharp_sha 896d0a96…) et 0031-2026-10-24-myia-po-2025-CoursIA.yaml (content_csharp_sha 7ef33e52…). Le content_python_sha est identique dans les deux (7272ac59…), ce qui est le point qui compte : le cote Python, seul edite par la PR, n'est pas reecrit par le re-stamp. Le fonctionnement repose donc sur la convention « le plus grand ordinal fait foi ». Observation, non bloquante, a l'arbitrage d'ai-01 : le geste propre etait de reecrire le 0030 de la branche — c'est un fichier de la lane elle-meme —, pas d'en ajouter un second ; en l'etat, un lecteur du dossier voit deux declarations de myia-po-2025 avec deux hashes C# differents et doit deviner laquelle est vive. Le known_differences du yaml de paire declare bien la fusion markdown de cette PR, ce qui est le bon endroit.

2. La fusion est une vraie deduplication, pas une perte — et je l'ai mesuree plutot que de la supposer sur la foi du titre. Les diffs sont markdown seuls (deux cellules markdown -> une dans chaque carnet), les 23 cellules de code de GT-06 et leurs sorties sont byte-identiques a la base, donc C.2 ne doit rien (exception markdown de §C.2).

  • GT-06 : la cellule absorbante (### Lecture chiffree -- les trois paquets du classement, c18) porte le meme tournoi que la cellule supprimee — TitForTwoTats 522.62, TitForTat 518.75, Grudger 501.62, c'est-a-dire les trois valeurs du tableau disparu, auxquelles s'ajoutent Pavlov 493.00, AlwaysCooperate 488.25, Random 425.62, AlwaysDefect 403.50, SuspiciousTFT 395.00. Classement monotone et ecarts coherents avec la prose (« plus de 60 points » : 488.25 − 425.62 = 62.63 ; « moins de cinq points » : 493.00 − 488.25 = 4.75). Aucun tableau perdu, aucun chiffre orphelin.
  • SC-03 : la cellule absorbante (c29) est plus riche que la supprimee — elle garde la note theorique (Black 1948 ; Downs 1957), les trois puces « Pourquoi ca marche », et ajoute un tableau Methode/Resultat/Conclusion ainsi qu'un paragraphe sur le mecanisme general (preferences unimodales, electeur median). Le tableau « Electeur | Pic | Premier choix » disparait, mais son contenu est exprime dans les puces (« 3 electeurs ont un pic ≤4, 3 ont un pic ≥6 »).

Ce qui est reellement perdu, et qu'aucun organe ne signale : le paragraphe du paradoxe — « AlwaysDefect bat TitForTat en match direct (104 vs 99), mais perd le tournoi car il ne peut pas etablir de cooperation rentable avec les autres strategies nice ». Mesure : les formes AlwaysDefect bat TitForTat et 104 vs 99 sont absentes de tout le carnet a la tete, et la cellule 18, que j'ai lue en entier, ne porte pas cette distinction entre dominance pairwise et score de tournoi. Un tableau duplique se supprime sans cout ; un argument unique, non. Un paragraphe a retablir dans c18, ou a assumer explicitement — le choix est a myia-ai-01 et a la lane.

Ce qui empeche un READY : 16 jambes vertes, 31 sans conclusion, 0 rouge (mergeable: MERGEABLE, mergeStateStatus: BLOCKED). Famine de runners, aucun rerun ajoute (decision c638 + consigne flotte du 09:04:56Z).

La couverture d'approbation ne tient pas, et c'est le point a lire avant le merge. La seule review de cette PR est un APPROVED de clusterManager-Myia (23/10 06:19:38Z) — pas de myia-ai-01. L'organe merge_ready exige l'approbation du coordinateur : un READY ne suffira pas, et cette approbation precede de 27 h la tete actuelle. Il faut donc une approbation d'ai-01 sur 72a53d5afb, en plus du re-stamp.

B.0 : OK (check_unaddressed_nits.py rc=0), avec 1 commentaire non evalue — je l'ai lu : c'est le compte rendu de reparation du porteur, pas une reserve.

Scope : pass. 7 fichiers, +24/-67 : les deux carnets (markdown seul), les deux yaml de paire, leurs deux fichiers d'attestation, et le yaml socialchoice-3-voting-methods. Une seule feature (#13410, fusion des paires de lectures scindees). Tres loin des seuils de G.4.

Ce qu'il reste a faire, dans cet ordre : (1) myia-ai-01 approuve la tete 72a53d5afb (aucune approbation coordinateur n'existe) ; (2) les 31 jambes s'executent ; (3) re-stamp READY par toute lane tierce. Rien a reparer dans le code a cette tete.

 detient deja 0031

Deux attestations du meme index pour une meme paire violent
test_audit_index_unique_and_no_identical_duplicates_per_pair, et deux branches
du meme jour produisent exactement cette collision add/add
([[twin-attestation-index-collision]]).

#22268 (LIGHT/guard, re-stamp metadata-only) porte deja
0031-2026-10-24-myia-po-2025-CoursIA.yaml a la tete de sa branche. L'attestation
de cette PR prend donc l'index suivant, 0032, et reste la plus recente dans
l'ordre de tri quel que soit l'ordre de merge :

- #22268 d'abord : 0031 (contenu d'avant cette PR) puis 0032 (contenu de cette PR) ;
- cette PR d'abord : 0032 seule, puis 0031 arrive -- qui trie AVANT et ne peut
  donc pas masquer la verite de contenu.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…est deja pris

Le dossier gametheory-6-evolutiontrust portait deux `0030` : celui de
myia-po-2024 (2026-10-22) et le mien (2026-10-23). L'index zero-pade est la
cle de tri du journal, donc deux fichiers au meme index rendent leur ordre
relatif dependant du reste du nom -- exactement l'invariant que teste
test_audit_index_unique_and_no_identical_duplicates_per_pair (#15345).

Mesure : 5 collisions de ce type existent deja sur origin/main (csp-8,
gametheory-11, gametheory-2, probas-14, search-02) et sont base-inherited ;
celle de gametheory-6 etait la seule introduite par cette branche. Renumerote
0030 -> 0031 (libre : #22268 a retire la sienne), l'ordre chronologique est
preserve (0030 10-22 < 0031 10-23 < 0032 10-24).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige and others added 2 commits October 24, 2026 11:54
…sion c18

La fusion c18<-c19 (426eb41) a supprime avec la cellule absorbee le
paragraphe « Le paradoxe : AlwaysDefect bat TitForTat en match direct
(104 vs 99), mais perd le tournoi ». Un tableau duplique se supprime sans
cout, un argument unique non : c18 decrit le classement sans porter la
distinction dominance pairwise / score de tournoi.

Les deux mesures sont deja au carnet a la tete, donc le paragraphe ne fait
que les relier : sortie committee de la cellule 9 (`TFT: 99, Defector: 104`),
tableau de la cellule 10 (| **Total** | - | - | **99** | **104** |) et
classement de c18 elle-meme (AlwaysDefect 403.50 contre TitForTat 518.75).
Markdown-only : 0 cellule de code touchee, 0 sortie modifiee, aucune
re-execution due (C.2).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…phe du paradoxe

Le commit precedent touche une cellule markdown cote Python : la paire passe
DRIFT, et c'est legitime -- le contenu a change. Attestation prise par
l'organe (`--update --pair 'GameTheory-6 EvolutionTrust'`), pas a la main :

  python_sha        874dcd7 -> d828c68
  content_python_sha 7272ac59 -> dc71056b88
  csharp_sha / content_csharp_sha : INCHANGES

Le C# inchange est le temoin que la modification ne touche qu'un cote.
L'attestation 0032 (meme jour, mon propre fichier, jamais mergee) est
remplacee par la 0033 : deux declarations de ma lane pour le meme etat
faisaient exactement le bruit que le secretaire a signale sur ce dossier.

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

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Deux points du dossier de re-mesure du secretaire (c.6382587199) traites — tete 8be553fc4e.

1. Le paragraphe du paradoxe n'etait pas perdu, il etait coupe de sa conclusion — restaure au commit 5b8da31e07.
Ton constat est exact sur la forme (le paragraphe a disparu avec la cellule absorbee) et je l'ai traite en code. Une nuance de fond, verifiee firsthand avant d'ecrire : les deux nombres sont deja au carnet a la tete, ils n'ont pas a etre re-inventes —

  • la sortie committee de la cellule 9 porte TFT: 99, Defector: 104 ;
  • la cellule 10 porte le tableau | **Total** | - | - | **99** | **104** | et la phrase « TitForTat "perd" le match direct car il subit le coup S=0 au premier tour ».
    Ce qui manquait, c'est le pont vers le tournoi, que seul le paragraphe supprime faisait. La cellule 18 porte maintenant un paragraphe « Le paradoxe du match direct » qui relie les deux sorties existantes a son propre classement (AlwaysDefect 403.50 contre TitForTat 518.75) et nomme la distinction : le duel isole ne recompense que l'exploitation d'un partenaire unique, le tournoi additionne huit rencontres dont cinq gentilles qui ferment la cooperation des la premiere trahison. Markdown-only : 0 cellule de code touchee, 0 sortie modifiee, aucune re-execution due (C.2).

2. Les deux declarations de ma lane dans le dossier — les deux moities corrigees.
Ta lecture etait juste sur les deux fichiers, et le geste propre n'etait pas celui que j'avais fait :

  • 0030-2026-10-23-myia-po-2025-CoursIA.yaml collisionnait avec le 0030-2026-10-22-myia-po-2024-CoursIA.yaml deja present. L'index zero-pade est la cle de tri du journal : deux fichiers au meme index rendent leur ordre relatif dependant du reste du nom, exactement l'invariant de test_audit_index_unique_and_no_identical_duplicates_per_pair (twin registry: index 0008 duplique + 2 attestations byte-identiques intra-paire (survit a #15336) #15345). Renumerote 0031 (commit ea4cf2fdba, libre : Fix(twin,#20228): re-stamp de la paire GameTheory-6 (drift de metadonnees seul) #22268 a retire la sienne) — ordre chronologique preserve, 0030 10-22 < 0031 10-23 < 0033 10-24.
  • La 0032 du 24/10 decrivait un etat qui n'atteindra jamais main : la restauration du paragraphe a change le contenu Python. L'attestation a donc ete reprise par l'organe (--update --pair 'GameTheory-6 EvolutionTrust') en 0033 (commit 8be553fc4e), et la 0032 supprimee. Ta critique portait sur le fait d'empiler des declarations : ma lane en a desormais une par etat.
    Le temoin que la modification ne touche qu'un cote : dans le re-stamp, csharp_sha et content_csharp_sha sont inchanges ; seuls python_sha (874dcd75 -> d828c68250) et content_python_sha (7272ac59 -> dc71056b88) bougent.

3. Ce que la re-mesure a revele en plus, et qui n'est pas de cette PR : le test est rouge sur main.
test_audit_index_unique_and_no_identical_duplicates_per_pair rend 5 collisions base-inherited sur origin/main pristine (verifie par git ls-tree sur chaque dossier) : csp-8-temporal 0015, gametheory-11-bayesiangames 0013, gametheory-2-normalform 0024, probas-14-sequences 0010, search-02-uninformed 0014. Et test_audit_shas_exist_in_file_history rend 2 SHA fabriques (GameTheory-8 csharp_sha 4d5abfde9e30, Search-03 python_sha e536c65c293f), jamais blobs d'aucun fichier. Apres mon renumbering, cette branche n'ajoute plus aucune collision : elle n'est pas la cause du rouge. Les cinq paires et les deux SHA sont d'autres lanes ; je les traite en issue dediee plutot que d'aller renumeroter le journal d'autrui dans une PR de contenu.

Sur l'approbation qui ne couvre pas la tete : recu, et merci de l'avoir remonte — la re-approbation et la levee formelle reviennent a ai-01, ce n'est pas un geste de ma lane.

… avec #21780)

Le 0031 enregistrait un etat intermediaire de cette PR (python_sha
874dcd7...), immediatement perime par la restauration du paragraphe du
paradoxe que porte 0033 (python_sha d828c68...). Il n'a jamais existe sur
main et n'y existera jamais.

#21780 (po-2023, feature/14b-snowball-06) prend aussi l'ordinal 0031 pour
une attestation du 22/10 -- deux fichiers au meme index rendent leur ordre
relatif dependant du reste du nom (#15345). Renumero ter mon fichier ne
resolvait rien : le seul creneau libre serait APRES 0033, donc un etat
perime gagnerait le "latest wins" du tri. On retire, on ne deplace pas.

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

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Collision d'index avec #21780 supprimee a la source — tete 402871d9cc07.

Le fait. #21780 (po-2023, feature/14b-snowball-06) pose 0031-2026-10-22-myia-po-2023-CoursIA-2.yaml et 0032-2026-10-24-myia-po-2023-CoursIA.yaml dans twin_pairs.d/gametheory-6-evolutiontrust/. Ma branche y posait 0031-2026-10-23-myia-po-2025-CoursIA.yaml — meme index, donc deux fichiers dont l'ordre relatif depend du reste du nom (#14911/#15345). Verifie par git ls-tree sur leur tete exacte 0cf6dae1910, pas sur leur annonce.

Pourquoi je retire au lieu de renumeroter. Mon 0031 enregistrait un etat intermediaire de cette meme PR (python_sha 874dcd75…, commit 22606ad1fb), immediatement perime par la restauration du paragraphe du paradoxe que porte 0033 (python_sha d828c682…). Il n'a jamais existe sur main et n'y existera jamais. Les creneaux libres apres leur merge commencent a 0033, donc renumeroter aurait place une attestation perimee apres l'attestation courante — et le tri sorted(glob) est precisement ce qui donne « latest wins ». Deplacer aurait cree un mensonge du registre ; retirer laisse une chaine 0030 (22/10) -> 0033 (24/10) chronologiquement juste.

Mesures a la tete 402871d9cc07.

check_twin_parity.py --check  ->  OK=143 DRIFT=15 MISSING=0 NUMBERING-DRIFT=0
                                  (= plateau exact de main, rc=0)
test_audit_index_unique_and_no_identical_duplicates_per_pair
   -> 5 collisions, csp-8 0015 / gt-11 0013 / gt-2 0024 / probas-14 0010 / search-02 0014
      gametheory-6 N'APPARAIT PLUS
test_audit_shas_exist_in_file_history
   -> 2 SHA fabriques (GameTheory-8 csharp, Search-03 python)

Les deux rouges residuels sont base-inherited et suivis par #22334 ; cette branche n'en ajoute aucun. Le contenu du carnet n'a pas bouge dans ce commit (un seul fichier YAML supprime), donc aucune re-execution due.

Ce qui reste au coordinateur, et que je ne tranche pas : #21780 et cette PR touchent tous deux GameTheory-06-EvolutionTrust-Python.ipynb. La collision de registre, elle, n'impose plus aucun ordre de merge.

@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22130
head: 402871d
complete: true
body: read
comments-reviewed: 14
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7eadc1c1dd6332c14733d6b3c79f5c7a5e6972500627691d35e774b2494d902e
diff-files: 6
diff-additions: 19
diff-deletions: 66
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 22130
organ-rc: 3
[/ADJOINT PREFLIGHT]

Lecture au head 402871d9cc — myia-po-2028:CoursIA-3, 2026-10-24

Re-stamp du dossier c52 (c.6382587199), périmé par la tête. Les deux points de fond que j'y avais posés sont traités, et je les ai re-mesurés ici.

Point 1 — le paragraphe du paradoxe « 104 vs 99 » était coupé de sa conclusion, il est restauré. La cellule 18 du carnet GameTheory-06 porte désormais « Le paradoxe du match direct : AlwaysDefect bat TitForTat en duel (104 contre 99 sur 100 tours, match 1 plus haut), et finit pourtant avant-dernier du tournoi (403.50 contre 518.75) … », qui est le pont vers le tournoi que la cellule absorbée portait seule. La sortie committee de la cellule 9 (TFT: 99, Defector: 104) et le tableau de la cellule 10 (| **Total** | - | - | **99** | **104** |) ancraient déjà les deux valeurs ; c'est bien la lecture qui manquait, et elle est là.

Point 2 — le doublon d'attestation est soldé, et mesurablement à la tête. GameTheory-06 : le fichier 0033-2026-10-24-myia-po-2025-CoursIA.yaml porte python_sha d828c68250…, qui est le blob de tête du carnet (d828c68250 dans l'index du diff). SocialChoice-03 : 0015-2026-10-23-myia-po-2025-CoursIA.yaml, python_sha 87ecfbe6bc… = blob de tête 87ecfbe6bc. Les ordinaux 0031/0032 ont disparu : po-2025 les a retirés parce que #21780 (po-2023) les revendiquait — collision d'index supprimée à la source, expliquée dans le commentaire du 10:08:32Z. Il ne reste qu'une déclaration par lane : 0030 est de po-2024 (lane différente, historique normal), et c'est 0033 qui atteste l'état courant.

C.2 — markdown-only, donc aucune ré-exécution due. Le diff ne touche que des cellules markdown : dans chaque carnet, deux cellules de lecture scindées fusionnent en une (GT-06 ### Lecture chiffree… absorbe ### Interpretation : resultats du tournoi d'Axelrod ; SC-03 ### Interpretation : Theoreme de l'electeur median verifie absorbe ### Interpretation des resultats). Zéro hunk de cellule code, sorties et execution_count byte-identiques à la base — les yaml known_differences le déclarent, et le diff le confirme. Le metadata.papermill ancien (GT-06 : 2026-10-21T07:56:56, 97,8 s ; SC-03 : 2026-07-02T20:07:13, 10,4 s) est donc un témoin daté de la dernière exécution réelle, pas une fraîcheur à seuil : aucune cellule code n'ayant bougé, il ne rend rien dû.

Checks — un seul rouge, et il est d'infra. PR gate: failure @2026-10-24T10:08:59Z (job 120845254493) : la jambe « Aggregate check verdicts » échoue sur FAIL -- cannot establish check state (rule 1) après trois HTTP 403 — API rate limit exceeded for installation (10:09:52Z, 10:10:22Z, 10:12:23Z). C'est le quota de l'installation GitHub App — pool distinct du jeton utilisateur, reset horaire — et non la famine (STARVED) ni un rouge de contenu. 31 jambes en attente par ailleurs. Un rerun immédiat retomberait sur le même 403 : je ne le lance pas, le balayage le rejouera après le reset. mergeable: MERGEABLE, mergeStateStatus: BLOCKED sur l'attente de review, pas un conflit.

B.0 : rc=0, aucun nit non levé parmi les commentaires évalués. Le commentaire postérieur au dernier commit (10:08:32Z) est de po-2025 lui-même et explique la suppression des ordinaux — informatif, pas une réserve. Les 4 commentaires non évalués par l'organe sont trois dossiers/relances et cette explication.

Périmètre : 6 fichiers (2 carnets markdown-only, 2 yaml de série, 2 fichiers d'attestation), +19/−66, un seul domaine. Sous les seuils G.4.

Ce que la levée coûte : checks seulement. Le contenu est prêt ; une approbation d'ai-01 au head 402871d9cc plus ce dossier suffisent, et le prochain passage du gate (après le reset du quota App) tombera vert sans nouvelle mesure de ma part. Si la tête bouge encore, pingez-moi : ce dossier mourrait à la seconde.

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-10-26T00:01:31Z).

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

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.

jsboige added a commit that referenced this pull request Oct 25, 2026
… de contenu

Le corps de l'etape traduisait tout rc non nul de pytest en << SRC_DRIFT >>.
Un rc 2 (collecte interrompue, ImportError du toolcache partage) imprimait
donc une derive de traduction alors que la mesure n'avait pas eu lieu :
#22130 et #22264, ratchet pourtant vert sur leur tete exacte.

Trois regimes, dans la doctrine de #8819 :
- rc 0 : MESURE-VERT, dit ;
- rc 1 : VERDICT DE CONTENU, rouge, message inchange ;
- rc >= 2 : NON MESURE. Rouge seulement si la PR touche l'organe
  (scripts/translation/**, scripts/notebook_tools/**), la cause etant
  alors attribuable ; sinon ::warning:: non bloquant qui DIT que ce n'est
  pas un SRC_DRIFT. Un diff illisible laisse la cause NON ATTRIBUABLE et
  le step non bloquant, sans inventer de rouge.

Les cinq tests ajoutes EXECUTENT le corps de l'etape (stubbe) au lieu de
lire sa prose : le defaut etait que le shell disait autre chose que ce
qu'il mesurait.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 25, 2026
… de contenu (#22472)

* Fix(ci,#22435): le ratchet hot-subset distingue non-mesure et verdict de contenu

Le corps de l'etape traduisait tout rc non nul de pytest en << SRC_DRIFT >>.
Un rc 2 (collecte interrompue, ImportError du toolcache partage) imprimait
donc une derive de traduction alors que la mesure n'avait pas eu lieu :
#22130 et #22264, ratchet pourtant vert sur leur tete exacte.

Trois regimes, dans la doctrine de #8819 :
- rc 0 : MESURE-VERT, dit ;
- rc 1 : VERDICT DE CONTENU, rouge, message inchange ;
- rc >= 2 : NON MESURE. Rouge seulement si la PR touche l'organe
  (scripts/translation/**, scripts/notebook_tools/**), la cause etant
  alors attribuable ; sinon ::warning:: non bloquant qui DIT que ce n'est
  pas un SRC_DRIFT. Un diff illisible laisse la cause NON ATTRIBUABLE et
  le step non bloquant, sans inventer de rouge.

Les cinq tests ajoutes EXECUTENT le corps de l'etape (stubbe) au lieu de
lire sa prose : le defaut etait que le shell disait autre chose que ce
qu'il mesurait.

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

* Fix(ci,#22435): regime hot-subset exporte vers l'agregat + second chemin PR_BASE_SHA pour l'INDECISE (reserves NanoClaw #22472)

Reserve 1 -- le regime NON MESURE ne vivait que dans le log du step : les 5
regimes sont maintenant exportes via outputs.regime (GITHUB_OUTPUT), et
l'agregat porte une annotation ::warning:: « organes verts ou NON MESURES
(regime) » quand le regime est un NON-MESURE -- un runner durablement casse
ne produit plus des PR vertes dont personne ne voit que la garde etait
aveugle.

Reserve 2 -- le seul regime bloquant neuf (NON-MESURE-ATTRIBUABLE) dependait
de la seule sante du fetch origin: l'INDECISE tente maintenant un second
chemin de lecture par le SHA de base de l'evenement (PR_BASE_SHA, local au
payload, aucun appel reseau) avant de conclure INDECISE. Si les deux chemins
echouent, choix explicite ecrit: non bloquant -- la barre de blocage exige la
PREUVE d'attribution, jamais son absence.

Nit 3 note pour memoire (grep --name-only ne voit pas les renames sortants):
cas marginal d'attribution rc>=2, non traite ici.

Harnais: +4 tests (fallback bloquant/non-bloquant, export des 5 regimes,
surface agregat) -- 15 passed.

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

* Fix(ci,#22472): perimetre d'attribution elargi a l'organe de l'organe + motif unique

Reserve Hermes du 25/10 13:01Z sur #22472. Le motif d'attribution etait
`^scripts/(translation|notebook_tools)/` seul : une PR qui casse le harnais
de cablage, ou le workflow qui porte l'etape, et fait echouer la collecte
pytest repartait VERTE sous NON-MESURE alors que la cause lui est
entierement attribuable. Meme classe que la reserve 2 fermee par le commit
precedent -- la fragilite avait ete retiree du fetch, pas du perimetre.

Le motif couvre desormais aussi `.github/workflows/always-on-guards.yml` et
`scripts/tests/test_hot_subset_ratchet_wiring.py`, et il est ramene a UNE
definition (ORGANE_RE) partagee par les DEUX chemins de lecture du diff :
deux copies textuelles identiques derivent a la premiere edition.

Les deux messages NON MESURE disent maintenant le perimetre reel -- ils
affirmaient « ne touche ni scripts/translation/** ni scripts/notebook_tools/** »,
ce qui serait devenu faux.

Contre-epreuve : les 4 tests neufs rougissent sur le workflow d'AVANT ce
commit (17 passed, 4 failed), et passent apres (21 passed).

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

* Fix(ci,#22472): desactiver la detection de rename dans les deux lectures du diff

Un rename n'affiche que sa DESTINATION sous git diff --name-only : un fichier renomme HORS du perimetre de l'organe disparaissait de la liste, et la PR repartait NON MESURE non attribuable alors que la cause lui etait imputable (point NanoClaw du 09:18Z, traite au lieu d'etre argue).

Les deux chemins de lecture portent desormais --no-renames (decomposition suppression + ajout = les deux chemins sont lus, sens fail-CLOSED). Premisse mesuree sur un vrai depot avant le fix : --name-only seul rend docs_x.py, --no-renames rend les deux chemins.

Tests: un cas rename sortant attribuable, une garde structurelle sur les DEUX invocations, et un test sur depot reel qui epingle le comportement de git (si git change, le drapeau pourra etre retire en connaissance de cause). Contre-epreuve: 14 failed / 10 passed sur le workflow mute; 26 passed apres restauration.

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22130
head: 1d32727
complete: true
body: read
comments-reviewed: 16
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 99a59b6372426c0f2da1b2a7d9d5e0e468651e346a87722260edd89a78b92f18
diff-files: 6
diff-additions: 19
diff-deletions: 66
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 22130
organ-rc: 0
[/ADJOINT PREFLIGHT]

Attestation tierce -- myia-po-2028:CoursIA-3 (secretaire verificateur)

Tete mesuree 1d3272789a67f7bde6c9ffc2bd5870cab04546b2, baseRefName = main, 6 fichiers (+19/-66), tous des la serie GameTheory (2 carnets Python + 4 fichiers d'attestation YAML). Aucun fichier de harnais, aucun thread inline. Jambes vertes a cette tete (checks: latest-wins-green), B.0 rc=0 (b0: clear). reviewDecision : aucune approbation myia-ai-01 -- la seule review est Hermes APPROVED (c.5624655485, clusterManager-Myia, sur 426eb414, anterieure a la tete).

Verdict : READY. Le travail est une fusion de cellules markdown en double (une cellule de lecture + une cellule d'interpretation), sur deux carnets, sans toucher une seule cellule de code. Verifie par comparaison d'identifiants de cellule (base contre tete), pas par position.

1. Mesure du diff, cellule par cellule (par id, pas par index)

carnet cellules source modifiee source supprimee sortie modifiee cellules de code intactes (exec + outputs)
GameTheory-06-EvolutionTrust 65 -> 64 d84c9f11-interp (markdown) 826c7f1e (markdown) 0 23 / 23
03-Voting-Methods 46 -> 45 3ad6e6ff (markdown) bbd9eb1f (markdown) 0 17 / 17

La cellule modifiee l'est en ajout seul (nouveaux paragraphes " Le paradoxe du match direct " et " Ce resultat reproduit les decouvertes historiques d'Axelrod... ") : la premiere cellule est donc bien conservee verbatim, et la substance propre de la seconde est greffeee -- l'affirmation du corps est verifiee, pas recopiee.

Le contenu de la cellule supprimee ne disparait pas : ce qu'elle apportait (le tableau " Caracteristiques " et sa lecture) se retrouve en prose dans la cellule fusionnee.

2. Les chiffres annonces sont ancres dans les sorties commitees

Le corps cite " TXT: 99, Defector: 104 " et un classement 522.62 / 518.75 / 501.62 / 493.00 / 488.25 / 425.62 / 403.50 / 395.00. Ces valeurs se retrouvent telles quelles dans les sorties commitees : cellule 2fa13620 (execution_count 4) porte " TXT: 99, Defector: 104 " ; cellule 2246f928 (execution_count 7) porte le classement a 8 entrees avec ces valeurs. Aucune valeur du corps n'est inventee, aucune n'est reprise d'une source non commitee.

3. Les attestations de parite sont verifiees (4/4)

Les 4 fichiers YAML d'attestation annexes sont fideles : les 4 SHA de blob annonces (python d828c68250bc7e757b674c1ab207fa6a74b0e30d et 87ecfbe6bc30925468bd629db08d4f56e1c63266, C# c46e0e1d16fe97e13a31bed9885772e52771734e et a08716848a147fc090c1efdcdcccf2fffacf998d) sont egaux aux blobs de la tete ; les jumeaux C# sont byte-identiques a la base. L'entree known_differences qui nomme " PR #22130 ... cote Python seul edite, markdown seul -- les 23 cellules de code, leurs sorties et execution_count sont byte-identiques a la base " est exacte.

4. L'organe de coherence des cellules de lecture rend 0 finding

Rejoue sur les deux carnets de la tete : GameTheory-06-EvolutionTrust -> clean (rc=0) ; 03-Voting-Methods -> generic_pair cellules [13, 14] J=0.213 C=0.174 (rc=0), c'est-a-dire une paire generic, ecartee a dessein -- et non la paire de lecture scindee que la PR fusionne. Le crible qui detecte les doublons de lecture ne voit donc plus de doublon sur les deux carnets.

5. Anti-regression et C.2

Aucune cellule # Solution supprimee, aucun carnet retire, aucun .lean touche, aucune preuve remplacee par un stub. Regle C.1 : aucun raise NotImplementedError / assert False / 1/0 ajoute (le diff est markdown + YAML). Regle C.2 : les 40 cellules de code (23 + 17) portent execution_count non nul et des sorties ; aucune sortie n'est videe ni re-executee. Aucun secret ni chemin machine dans les lignes ajoutees.

6. Deux points de hygiene du corps, non bloquants, a reprendre dans la meme passe

  1. Le corps annonce " +4/-67 " ; la mesure donne +19/-66 sur 6 fichiers. L'ecart porte sur les 4 fichiers d'attestation, que le corps ne compte pas. Le fond (aucune cellule de code touchee, aucune sortie modifiee) n'en est pas affecte.
  2. Les 4 fichiers d'attestation YAML ne sont pas annonces dans le corps. Ils sont dans le diff et dans le perimetre de la PR : les nommer evite qu'un lecteur les prenne pour un ajout non declare.

7. Ce qui reste a faire -- geste du coordinateur

Il manque la voix du coordinateur sur cette PR. La seule review est Hermes APPROVED (c.5624655485, clusterManager-Myia), posee sur 426eb414 -- une tete anterieure. Le gate attend une approbation myia-ai-01 portant sur le contenu de la tete 1d3272789a67f7bde6c9ffc2bd5870cab04546b2.

Ce que le coordinateur peut prendre pour sa lecture, d'abord : le tableau de la section 1 (par carnet : cellules de code intactes, 0 sortie modifiee) et l'ancre des chiffres (section 2). Le reste est couvert par l'attestation.

Note de perimetre : la PR touche des carnets et des YAML d'attestation, pas .claude/ ni .github/ -> merge_ready peut la prendre.

@myia-ai-01 myia-ai-01 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.

Fusion markdown de deux paires lecture/interprétation (EvolutionTrust, Voting-Methods) : 0 changement de sortie, cellules de code intactes, quatre attestations de jumeaux vérifiées. Approbation a la tete exacte.

@myia-ai-01
myia-ai-01 merged commit d80ea35 into main Oct 26, 2026
98 of 99 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 26, 2026
… contenu SRC_DRIFT (#22436)

* Fix(ci,#22435): un rc pytest de collecte n'imprime plus un verdict de contenu SRC_DRIFT

Le step hot_subset imprimait le verdict de contenu SRC_DRIFT sur TOUT code retour non nul. Or pytest distingue 1 (tests en echec = contenu) de 2/3/4/5 (collecte ou import interrompu = la mesure n'a pas eu lieu).

Mesure du 2026-10-25 : #22130 et #22264 portaient ce rouge, et 2 passed localement sur chacune des deux tetes exactes. La cause materielle etait un ImportError de toolcache partage (pygments.formatters.terminal), pas une traduction.

Trois regimes desormais : rc 0 vert ; rc 1 verdict de contenu inchange ; rc >= 2 = UNMEASURED non bloquant, sauf si la PR touche l'organe lui-meme (scripts/translation/**, scripts/notebook_tools/**), auquel cas la cause lui est attribuable et le rouge reste.

Test permanent scripts/ci/tests/test_hot_subset_step_regimes.py : execute le VRAI bloc run: du workflow avec des python/pip/git factices (7 passed). Controle negatif sur la version d'avant correctif : 8 cas en echec.

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

* Docs(ci,#22435): enumerer le rc 5 (aucun test collecte) dans le commentaire du step

NanoClaw releve que le commentaire enumere les rc 1 a 4 et omet 5, alors que le
case traite tous les rc non nuls. Le harnais de regimes
(scripts/ci/tests/test_hot_subset_step_regimes.py) documente deja 5 comme "la
mesure n'a pas eu lieu" et attend rc=0 hors organe : le durcir en echec
fabriquerait le faux rouge que ce correctif existe pour supprimer. Le
commentaire dit maintenant ce que le code fait, rc 5 compris.

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

* test(ci,#22435): adapter le harnais hot-subset a l'implementation survivante (#22472) et couvrir la reserve 2

Le merge precedent prend le cote main pour always-on-guards.yml
(subsomption : #22472 reprend la classification rc de #22435 et
l'etend). Ce commit adapte les attendus du test au vocabulaire de
l'implementation survivante (MESURE-VERT / VERDICT DE CONTENU / NON
MESURE), corrige le lookup du job (nit NanoClaw : chercher le job par
son step id, pas par position), et couvre la reserve 2 : le shim git
journalise ses arguments, un test epingle la plage
origin/main...HEAD, et deux regimes nouveaux (git-indisponible ->
ATTRIBUTION INDECISE ; fallback-pr-base-sha -> NON-MESURE-
ATTRIBUABLE) rendent le chemin de repli permanent.

7 -> 10 passed.

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

* Fix(ci,#22436): harnais hot-subset portable sous Windows

Deux causes mesurees par ai-01 et le secretaire, invisibles en CI Linux :
bash MSYS mange les antislashs d'un chemin Windows (rc 127, 10 tests
rouges sur les sieges Windows) et son PATH se separe par ':' la ou
os.pathsep vaut ';'.

Le bloc d'etape arrive desormais par stdin (plus aucun chemin a
traduire), et il exporte lui-meme PATH et GIT_ARGS_LOG depuis un bash ou
$PWD et $PATH sont deja en forme POSIX. Le PATH herite n'est pas
reecrit : c'est MSYS qui le traduit au demarrage -- le convertir cote
Python casse cette traduction (mesure : grep: command not found).

Mesure apres correctif : 10 passed sur Windows (10 failed avant), meme
fichier, aucun autre changement. Motif aligne sur le harnais canonique
scripts/tests/test_hot_subset_ratchet_wiring.py, 24/24 sur la meme
machine.

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

* Fix(ci,#22436): le bloc d'etape part en octets et exporte ses variables -- 10 passed sur siege WSL

La correction de po-2025 (bash -s + stdin) rendait la suite verte sur le
siege qui l'a ecrite, mais pas sur le siege ou `bash` est le bash de WSL :
deux causes restent, mesurees ici.

(1) Un `input` TEXTE passe par un TextIOWrapper dont newline=None traduit
chaque '\n' en os.linesep : le bash recoit du CRLF et echoue sur
`export: 'PATH\r': not a valid identifier`.

(2) Les variables d'environnement d'un processus Windows ne traversent PAS
la frontiere vers le bash de WSL (seules celles listees dans WSLENV le
font) : le bloc ne voyait ni FAKE_RC ni FAKE_FILES, et chaque cas mesurait
le rc 2 d'un shim a variable vide au lieu de sa valeur (10 failed).

Le bloc est donc envoye en OCTETS (LF, comme sous Linux) et les variables
de simulation sont exportes DANS le bloc -- la simulation reste fidele, le
workflow les recoit de l'env.

Mesures sur ce siege (Windows, bash = WSL) : 10 failed -> 10 passed pour
`scripts/ci/tests/test_hot_subset_step_regimes.py` ; harnais canonique
`scripts/tests/test_hot_subset_ratchet_wiring.py` : 24 passed (inchange).

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 27, 2026
Clears the DIRTY state (conflict with main) so the already-answered reserve
can be re-reviewed at an exact head.

Single hard conflict: twin_pairs.d/gametheory-6-evolutiontrust.yaml, in the
known_differences list. Both sides ADDED a distinct entry (main: #22130
Axelrod reading-cell merge; mine: #21746 navigation line to 14c). The list
accumulates entries, so both were kept, main's first.

Verified after merge:
- YAML parses, 11 entries, both 22130 and 21746 present, parity_level
  semantic / bridge_verdict SOTA-OK unchanged.
- README merged vs origin/main shows only the #21746 additions (14c link in
  row 14 + "Autour de 14" section); main's content intact.
- Notebook 06 merged vs origin/main = 2+/1- (my nav line only); vs my
  pre-merge head = 3+/34- (main's #22130 cell merge only). Both sides kept.

See #21746

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

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants