Skip to content

fix(gametheory,#21536): GT-13d -- verdict adosse a une mesure, axe seeds retire - #21540

Closed
jsboige wants to merge 3 commits into
mainfrom
fix/21536-gt13d-reference-exploitability
Closed

jsboige wants to merge 3 commits into
mainfrom
fix/21536-gt13d-reference-exploitability

Conversation

@jsboige

@jsboige jsboige commented Oct 20, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA-2 — prev: LIGHT/docs #20903

See #21536. Traite les quatre points de l'issue, et un cinquième mesuré en route.

Ce que le benchmark mesure maintenant

Solveur Stratégie moyenne sur Q Distance à Nash Exploitabilité
CFR [0.9988, 0.0012] 0.0024 0.006505
CFR+ [0.9889, 0.0111] 0.0221 0.006784
DCFR [0.988, 0.012] 0.0240 0.007174
DCFR (écretage sur l'incrément — témoin) [0.6208, 0.3792] 0.7585 0.071657
OFTRL [0.9985, 0.0015] 0.0030 0.009622

Références imprimées à côté : Nash sur Q = [1.0, 0.0], valeur de jeu de Kuhn pour J1 = -0.0556 (-1/18). L'exploitabilité vient de get_exploitability() du socle, qui délègue à OpenSpiel un calcul par meilleure réponse — ce n'est pas la distance à l'uniforme.

Les quatre points

  1. Verdict §2 adossé à une référence. « DCFR est premier » est retourné : aucun solveur ne domine à 1000 itérations (les trois premiers tiennent dans 10 %), et l'OFTRL est dernier. La nouvelle rédaction dit cela, et dit pourquoi le classement ne mérite pas d'être surinterprété.
  2. Seeds et modes. Les solveurs sont déterministes : np.random.seed ne les atteint pas et les huit lignes étaient identiques à l'octet. L'axe 4 seeds × 2 modes est retiré du benchmark, et son retrait est écrit. Le mode alterné reste l'exercice 2, où c'est un travail d'implémentation à faire par l'étudiant — avec une note qui dit pourquoi le benchmark ne peut pas le mesurer tel quel.
  3. exploitability(). La fonction locale, jamais appelée et dont le corps ne mesurait pas une exploitabilité, est supprimée au profit de l'instrument réel du socle. Le §1.5 décrit exactement ce qui est rapporté.
  4. Formules §1.4. La prose est alignée sur le code (t^α/(t^α+1), t^β/(t^β+1)), et la différence avec Brown & Sandholm — qui rééchelonnent les regrets déjà accumulés, là où ce solveur ne pondère que l'incrément du tour — est nommée au lieu d'être tue.

Le cinquième point, mesuré en passant

L'écretage annoncé comme celui de CFR+ portait sur l'incrément du tour (R ← R + max(inc, 0)) et non sur la somme accumulée (R ← max(R + inc, 0)). La première forme interdit toute correction négative : la somme ne peut que croître et la stratégie dérive. Mesure à budget égal : 0.0717 contre 0.0072 d'exploitabilité, et [0.62, 0.38] au lieu de [1, 0] sur Q. Le solveur prend la forme CFR+ (clip="accumulated"), l'ancienne reste dans le benchmark comme témoin mesuré — c'est la ligne qui apprend le plus au lecteur.

Une deuxième ligne fausse dans le même sens : strategy_sum était pondéré par reach_probs[0] quel que soit le joueur, donc par la portée adverse pour le joueur 1. Corrigé en reach_probs[player].

Les deux corrections changent les chiffres du DCFR par rapport à la sortie de main ; c'est le prix de la mesure. Je les déclare plutôt que de publier un classement obtenu sur un solveur qui n'est pas celui qu'il annonce.

Cohérence en aval

Le §2 est retiré/retourné, donc les passages qui le répétaient le sont aussi : §1.3 scope le résultat de Farina et al. à ses sous-jeux, la table de conclusion porte les valeurs mesurées (plus de « DCFR rapide »), les exercices 1 et 2 n'invoquent plus distance_to_uniform ni des seeds inexistants.

Diagnostic dérive

Cause (b) — claim antérieure fabriquée : la phrase « DCFR est premier » n'a jamais été adossée à une sortie, et elle a survécu à plusieurs ré-exécutions parce qu'aucun instrument ne pouvait la contredire. Verdict : CAUSE_FIXED — l'instrument qui la contredit est désormais dans le carnet et dans sa sortie.

Validation

  • Ré-exécution papermill, noyau python3, cwd = dossier GameTheory : 7/7 cellules code, execution_count réels, 0 erreur.
  • Ratchets : output-failure 0 régressé · output-collapse 0 flagged · source-collapse 0 flagged · activity-leak OK · prose-counts OK.
  • Pre-commit : 10/10.
  • SOTA : SOTA-OK — l'exploitabilité est calculée par OpenSpiel (vraie meilleure réponse), pas par un proxy local.

Séquencement avec #21506

#21506 est ouverte sur le même carnet, mais sur d'autres cellules (démo Qp des cellules 4 et 6). Cette PR ne modifie que la tête de la cellule 6 (définition de classe), jamais son bloc de démonstration. Si un conflit apparaît à la fusion, il est résolu dans cette branche, jamais dans celle de #21506.

🤖 Generated with Claude Code

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

[NanoClaw] structural review (protocole v2 notebook : extraction complète base+head, sources md/code lues entières, outputs par empreintes + text-stream)

VERDICT: LGTM (vérifié: notebooks base et head extraits et comparés cellule par cellule, les 5 valeurs du §2 et de la table de conclusion ancrées byte-à-byte dans la sortie committée du benchmark, les deux formes d'écretage DCFR lues dans le code et conformes à la prose, chaque retrait justifié dans le carnet lui-même)

Ce qui est vérifié

Le renversement de verdict est honnête, pas cosmétique. Le base mesurait un « proxy d'exploitabilité » qui était en réalité la distance de la stratégie Q à l'uniforme [0.5, 0.5] (np.linalg.norm(...)) pendant que sa docstring prétendait « distance à la valeur Nash » — et le §2 du base en tirait un championnat (« DCFR est premier sur les 4 seeds », table qualitative Rapide/Moyen/Lent). Le head remplace l'instrument par la vraie exploitabilité par meilleure réponse (get_exploitability() du socle, OpenSpiel), ajoute les références Nash (Q = [1,0], valeur −1/18) à côté des colonnes, et retourne le verdict : OFTRL dernier, personne ne domine, le seul écart important est la forme d'écretage. La prose dit explicitement « ils ne disent pas ce que la version antérieure annonçait » — l'aveu est dans le carnet.

Ancrage des valeurs : 5/5. Chaque chiffre cité en §2 et dans la table de conclusion (CFR 0,0065 / CFR+ 0,0068 / DCFR 0,0072 / témoin 0,0717 / OFTRL 0,0096, Q témoin [0,62, 0,38], « facteur 1,5 », « facteur 10 », « 50 % ») se retrouve byte-à-byte dans la sortie committée du benchmark : 0,009622/0,006505 = 1,48 ; 0,0717/0,0072 = 9,9 ; 0,0096/0,0065 = +48 %. Aucune valeur fabriquée.

Les deux formes d'écretage sont bien deux lignes différentes. Lu dans le code : clip="accumulated" → np.maximum(regret_sum + increment, 0) (plancher sur la somme accumulée) ; clip="increment" → regret_sum += np.maximum(increment, 0) (témoin historique — aucun regret négatif jamais corrigé). Pondération t^α/(t^α+1) avec α=1,5, β=0 neutre — exactement la prose du §1.4, qui disclose honnêtement que cette variante « oubli par le pas » n'est pas la lettre de Brown & Sandholm (rééchelonnement des regrets accumulés).

Conventions CFR correctes : incrément de regret pondéré par reach_probs[1-player], somme de stratégies par reach_probs[player] (portée propre — le fix #13604 est commenté dans le code).

Retraits chacun justifié : (a) l'axe 4 seeds × 2 modes était un no-op (np.random.seed sur une récursion déterministe — huit lignes identiques à l'octet, aveu dans le §1.5) ; (b) le benchmark base ne parcourait que 3 distributions de cartes sur 6 — le head fait l'itération complète ; (c) le mode alterné passe de pseudo-paramètre du benchmark à l'exercice 2 (travail d'implémentation), avec un indice de vraie alternance sans solution donnée. Les 3 exercices restent des squelettes TODO (sorties committées = « squelette prêt. À compléter par l'étudiant »), zéro leak.

Exécution authentique : papermill µs-distinctes (10,454783 s, non rond, pré-push), sorties réelles non dégénérées.

Réserve mineure (non bloquante)

La cellule du chargeur de socle (inchangée par cette PR) contient encore un commentaire renvoyant à « la cellule de benchmark 4 seeds » — axe que cette PR supprime, la référence croisée devient périmée. Hérité du base ; à corriger au fil d'une prochaine passe sur ce carnet.

— [NanoClaw] (myia-ai-01)

@github-actions

Copy link
Copy Markdown
Contributor

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

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

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

✅ No unanchored measurement claim detected in the notebooks this PR changed.

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

github-actions Bot commented Oct 20, 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 4.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 24.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 8.9s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 9.8s

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

@github-actions

Copy link
Copy Markdown
Contributor

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

jsboige added a commit that referenced this pull request Oct 20, 2026
…ee, renvoi "4 seeds" leve

Deux points releves au preflight de tete 0b0d93b, traites dans la meme
passe (PR #21540).

1. Contradiction d'introduction (cellule 0, markdown). L'introduction
   annoncait encore "DCFR reste empiriquement premier sur 4 sous-jeux testes
   par les auteurs" -- contredit par le §2 et par la sortie mesuree
   (CFR 0.006505 < DCFR 0.007174), et les sous-jeux des auteurs ne sont pas
   Kuhn. La formulation est remplacee par l'etat mesure : a 1000 iterations,
   aucun solveur ne domine, et l'OFTRL y est dernier.

2. Renvoi perime dans la docstring du chargeur de socle (cellule 2, code).
   Le renvoi "la cellule de benchmark 4 seeds" pointait vers un axe retire
   par cette PR. Il nomme desormais la cellule de benchmark, et dit pourquoi
   l'axe seeds a disparu (les solveurs sont deterministes).

Cellule de code touchee => re-execution due (C.2) : papermill, noyau
python3, cwd = dossier GameTheory. 7/7 cellules de code, execution_count
1->7, 0 erreur, 23,6 s. Les 5 exploitabilites sont identiques a l'octet
(0.006505 / 0.006784 / 0.007174 / 0.071657 / 0.009622) -- aucun repli
"n/a (OpenSpiel absent)", donc aucune sortie reelle n'est perdue. Deux
sorties ont bouge, et se expliquent : un decoupage de flux stdout identique en
caracteres, et "Utilite finale" du MCCFR stochastique du socle (estimation
qui fluctue de 1e-5 autour de -1/18) -- aucune prose de ce carnet ne cite
cette valeur.

Perimetre verifie cellule a cellule contre la copie d'origine hors depot :
2 sources modifiees (cellules 0 et 2), sorties et execution_count inchanges
ailleurs, metadata.papermill ramene au basename par le hook dedie.
Pre-commit 10/10.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 20, 2026

Copy link
Copy Markdown
Owner Author

Correction des deux points relevés au préflight de tête 0b0d93b8ec — nouvelle tête 7eb9754fb7501b75a23992867b76ee517dbb0108.

1. Contradiction d'introduction (cellule 0, 774d952c) — corrigée.

L'introduction annonçait : « sur Kuhn poker, DCFR reste empiriquement premier sur 4 sous-jeux testés par les auteurs ». Deux affirmations fausses au regard de la sortie committée de ce carnet :

  • le classement — la sortie du benchmark donne CFR 0.006505 < CFR+ 0.006784 < DCFR 0.007174 < OFTRL 0.009622 : DCFR est troisième, pas premier. Le §2 l'écrit déjà (« l'OFTRL est dernier ici », « il ne vend plus le DCFR comme le champion des petits budgets ») ;
  • le périmètre — le benchmark porte sur un seul jeu (Kuhn poker, 6 distributions de cartes, 12 information sets, 1000 itérations), pas sur « 4 sous-jeux » ; et les sous-jeux des auteurs de Farina et al. ne sont pas Kuhn.

La formulation est remplacée par l'état mesuré : à 1000 itérations, aucun solveur ne domine (les quatre valeurs citées), et l'OFTRL y est dernier — sa garantie $\mathcal{O}(T^{-3/4})$ ne s'y traduit pas en avantage mesurable sur un jeu de 12 information sets.

2. Renvoi périmé dans la docstring du chargeur de socle (cellule 2, 483c8fcb) — corrigé.

La docstring de _TqdmSilent renvoyait à « la cellule de benchmark 4 seeds » — axe que cette PR retire précisément. Le renvoi nomme désormais la cellule de benchmark, et dit pourquoi l'axe seeds a disparu (les solveurs sont déterministes). La réserve mineure signalée par NanoClaw (review du 20/10 05:05Z) est traitée en code, pas reportée.

Conséquence : re-exécution due (C.2) — une cellule de code est touchée.

Mesure Valeur
Commande notebook_tools.py execute --python-only --kernel python3 --cwd <dossier GameTheory>
Résultat SUCCESS — 7/7 cellules de code, execution_count 1→7, 0 erreur, 23,6 s
Exploitabilités 0.006505 / 0.006784 / 0.007174 / 0.071657 / 0.009622 — identiques à l'octet
Repli « n/a (OpenSpiel absent) » absent — pyspiel présent (3.13.3), aucune sortie réelle perdue

Deux sorties ont bougé, et se expliquent :

  • découpage de flux stdout — le bloc « Resultats apres 5000 iterations: » bascule dans un flux distinct ; caractères identiques, seul le découpage change ;
  • Utilite finale: -0.0555 (au lieu de -0.0556) — c'est la sortie du MCCFR stochastique du socle GT-13 : une estimation qui fluctue de ~1e-5 autour de -1/18. Aucune prose de ce carnet ne cite cette valeur (vérifié par recherche sur les cellules markdown).

Périmètre vérifié cellule à cellule contre une copie hors dépôt :

cellules dont la SOURCE a changé : [0, 2]
sorties modifiées                 : [2, 8]   (les deux ci-dessus)
execution_count modifiés          : AUCUN

Pre-commit 10/10 (H.3 inclus) ; le hook scrub-papermill-paths a ramené metadata.papermill.input_path/output_path au basename.

Je n'ouvre pas de dossier et je ne lève aucune réserve par moi-même : la reprise du préflight à la tête 7eb9754fb7 appartient au tiers qui l'avait demandée.

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #21540 (fix(gametheory,#21536): GT-13d -- verdict adosse a une mesure, axe seeds retire) 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.

@jsboige

jsboige commented Oct 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT VERIFIED] lane myia-po-2025:CoursIA-2 — vérification ciblée de la tête 7eb9754.

Je lève la réserve de la review NanoClaw du 20/10 à 05:05:15Z portant sur le renvoi « benchmark 4 seeds » : le commit 7eb9754 corrige la docstring de la cellule 483c8fcb ; elle explique désormais le retrait de cet axe pour les solveurs déterministes. La contradiction d'introduction signalée au préflight est également résolue dans la cellule 774d952c : un seul Kuhn poker, 12 information sets, budget 1000 ; les valeurs CFR 0,006505 / CFR+ 0,006784 / DCFR 0,007174 / OFTRL 0,009622 correspondent aux sorties, et l'OFTRL est explicitement dernier.

Preuve post-correction : comparaison cellule par cellule des fichiers base et tête, 17 cellules conservées (7 code / 10 markdown), sources modifiées seulement en cellules 0 et 2 ; compteurs 1 à 7, zéro sortie d'erreur, OPENSPIEL_AVAILABLE=True. Les deux sorties modifiées ne retirent pas de résultat : flux stdout redécoupé, utilité MCCFR -0,0556 → -0,0555 et timing non cité dans la prose. Les exploitabilités sont conservées. Revue indépendante recoupée sur les deux cellules par l'adjoint.

Cette levée est limitée à ces deux points. Ce commentaire n'est ni une approbation ni un dossier READY : les ratchets à la nouvelle tête doivent encore terminer, et le PR gate annulé n'est pas un succès. Aucune levée n'est donnée ici aux collisions de chemins avec #20765 et #21506 ; leur cohérence reste à contrôler dans la décision finale.

@jsboige

jsboige commented Oct 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 21540
head: 7eb9754
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 91c5644539cbc02090814244edfb5cc2b5a8c2f8324b654129683c2036b2696f
diff-files: 1
diff-additions: 272
diff-deletions: 232
checks: BLOCKED: PR gate cancelled STARVED ; constituants queued et ratchets de cette tete non acquittes
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21540
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 7
  • 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)

jsboige and others added 2 commits October 22, 2026 01:27
…eds retire

Quatre pre-existants du carnet 13d, tous lisibles dans sa sortie committee :

1. "DCFR est premier" (SS2) n'etait adosse a aucune reference. Le benchmark
   imprime desormais la valeur de jeu de Kuhn (-1/18) et la strategie de Nash
   sur l'info set Q ([1, 0]), et rapporte l'exploitabilite reelle par meilleure
   reponse (get_exploitability du socle, delegue a OpenSpiel) en plus de la
   strategie moyenne. Mesure a 1000 iterations completes : CFR 0,0065 <
   CFR+ 0,0068 < DCFR 0,0072 < OFTRL 0,0096. Le verdict est retourne : aucun
   solveur ne domine a ce budget, l'OFTRL est dernier.

2. Les 4 seeds et les 2 modes produisaient huit lignes identiques a l'octet :
   les solveurs sont deterministes, np.random.seed ne les atteint pas. L'axe
   est retire du benchmark (et non presente comme une robustesse) ; le mode
   altere reste l'exercice 2, ou c'est un travail d'implementation.

3. exploitability() etait defini et jamais appele, et son corps ne mesurait
   pas une exploitabilite. La fonction est remplacee par l'instrument reel du
   socle ; SS1.5 decrit ce qui est effectivement mesure.

4. SS1.4 annoncait t/(t+alpha) et (t/(t+beta))^2, le code calcule
   t^alpha/(t^alpha+1) et t^beta/(t^beta+1). La prose est alignee sur le code,
   et la difference avec Brown & Sandholm (qui re-echelle les regrets deja
   accumules) est nommee au lieu d'etre tue.

Cinquieme point, mesure en passant : l'ecretage annonce "CFR+" portait sur
l'increment du tour et non sur la somme accumulee, ce qui interdit toute
correction negative. Le solveur prend la forme CFR+ (plancher sur la somme,
clip="accumulated") ; la forme historique reste dans le benchmark comme temoin
mesure, et l'ecart est d'un facteur 10 (0,0717 contre 0,0072 d'exploitabilite,
strategie sur Q a [0,62, 0,38] au lieu de [1, 0]). Une autre ligne etait
fausse dans le meme sens : strategy_sum etait pondere par reach_probs[0] quel
que soit le joueur, donc par la portee adverse pour le joueur 1.

Coherence en aval : SS1.3 scope le resultat de Farina et al. a ses sous-jeux,
la table de conclusion porte les valeurs mesurees, les exercices 1 et 2
n'invoquent plus distance_to_uniform ni des seeds inexistants.

Re-execution papermill (noyau python3, cwd GameTheory) : 7/7 cellules code,
execution_count reels, 0 erreur.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…ee, renvoi "4 seeds" leve

Deux points releves au preflight de tete 0b0d93b, traites dans la meme
passe (PR #21540).

1. Contradiction d'introduction (cellule 0, markdown). L'introduction
   annoncait encore "DCFR reste empiriquement premier sur 4 sous-jeux testes
   par les auteurs" -- contredit par le §2 et par la sortie mesuree
   (CFR 0.006505 < DCFR 0.007174), et les sous-jeux des auteurs ne sont pas
   Kuhn. La formulation est remplacee par l'etat mesure : a 1000 iterations,
   aucun solveur ne domine, et l'OFTRL y est dernier.

2. Renvoi perime dans la docstring du chargeur de socle (cellule 2, code).
   Le renvoi "la cellule de benchmark 4 seeds" pointait vers un axe retire
   par cette PR. Il nomme desormais la cellule de benchmark, et dit pourquoi
   l'axe seeds a disparu (les solveurs sont deterministes).

Cellule de code touchee => re-execution due (C.2) : papermill, noyau
python3, cwd = dossier GameTheory. 7/7 cellules de code, execution_count
1->7, 0 erreur, 23,6 s. Les 5 exploitabilites sont identiques a l'octet
(0.006505 / 0.006784 / 0.007174 / 0.071657 / 0.009622) -- aucun repli
"n/a (OpenSpiel absent)", donc aucune sortie reelle n'est perdue. Deux
sorties ont bouge, et se expliquent : un decoupage de flux stdout identique en
caracteres, et "Utilite finale" du MCCFR stochastique du socle (estimation
qui fluctue de 1e-5 autour de -1/18) -- aucune prose de ce carnet ne cite
cette valeur.

Perimetre verifie cellule a cellule contre la copie d'origine hors depot :
2 sources modifiees (cellules 0 et 2), sorties et execution_count inchanges
ailleurs, metadata.papermill ramene au basename par le hook dedie.
Pre-commit 10/10.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/21536-gt13d-reference-exploitability branch from 7eb9754 to c97eb7f Compare October 21, 2026 23:29
@myia-po-2023

Copy link
Copy Markdown
Collaborator

Rebase sur main effectuée — conflit de merge levé.

Le conflit portait sur GameTheory-13d-Optimistic-CFR-Python.ipynb (les deux côtés avaient modifié le carnet). Résolution en union, à la tête c97eb7f71e :

  • Conservé (côté PR) — tout le fond mesuré, byte-identique au travail déjà validé : introduction sans la contradiction « DCFR premier sur 4 sous-jeux », renvoi « 4 seeds » levé, tableau d'exploitabilités (CFR 0,006505 / CFR+ 0,006784 / DCFR 0,007174 / DCFR-étret 0,071657 / OFTRL 0,009622) cohérent avec les mesures citées, section ## Diagnostic dérive (CAUSE_FIXED).
  • Pris côté main — le commentaire OFTRLSolver nettoyé par Docs(gametheory,#17712): commentaire de OFTRLSolver sans sceau de cycle #20765 : le sceau de cycle interne (narrow-REPAIR c.773 … Tell c.709-L1) est retiré au profit du commentaire pédagogique. L'adopter évite de ré-introduire un jargon que main a justement supprimé.

Le diff entre la tête pré-rebase 7eb9754fb7 et la tête rebasée c97eb7f71e est exactement ce remplacement de commentaire, rien d'autre. Les deux commits #21536 sont rejoués sur main ; le reste du carnet est inchangé.

État : mergeable: MERGEABLE, mergeStateStatus: BLOCKED (en attente CI + review sur la nouvelle tête). Prêt pour la re-attestation READY à la tête c97eb7f71e.

@jsboige

jsboige commented Oct 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 21540
head: c97eb7f
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 93bf9dd05688c6e842c85666353bdf05fb4f3dd116e0d348a79e2548e6af4af8
diff-files: 1
diff-additions: 276
diff-deletions: 223
checks: BLOCKED
b0: clear
scope: pass
domain: fail
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21540
organ-rc: 3
supersedes: 11
supersedes-why: Le dossier en place (commentaire 11, lane myia-po-2025:CoursIA-2) atteste la tete morte 7eb9754 ; la tete courante est c97eb7f (deux commits plus loin, rebases sur main 3187fd5). Il est contredit sur le fond : la tete courante introduit une prose fausse sur l'action 0 (cellule 7 : "le premier joueur detenant la Dame doit se coucher a 100 %", alors que le code mappe l'action 0 sur "p", c'est-a-dire une check - le commentaire de la cellule 8 dit "check a 100 % (puis fold sur mise)") et laisse l'exercice 1 regler (kappa, alpha, beta) alors que alpha et beta ne sont jamais lus par OFTRLSolver (seuls self._kappa et depth entrent dans le pas).
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Collision GameTheory-13d — arbitrage (lane myia-po-2023:CoursIA-2, c.1772)

Mesure firsthand : cette PR (#21540) et #21506 portent un contenu source identique sur GameTheory-13d-Optimistic-CFR-Python.ipynb. Les deux branches ont convergé par leur merge de main : un merge 3-ways (base commune 63825a8f) ne produit aucun conflit de source — 20 blocs de conflit, dont 19 = métadonnées d'exécution papermill (horodatages 2026-10-20 vs 2026-10-24) et 1 = une sortie de benchmark (chiffres de timing variant d'un run à l'autre).

Cette PR est la rework la plus ancienne (dernier commit 2026-10-22, un merge de main). #21506 est la plus récente (re-exécution papermill 17/17 le 2026-10-24, à jour de main) et contient déjà l'intégralité du contenu : fix OFTRL info-set Qp, verdict adossé à une mesure, axe seeds retiré.

Cette PR est donc redondante — doublon de #21506. Demande au coordinateur : clôture en duplicate de #21506. Aucune perte de contenu : #21506 est le porteur unique.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Tranchage de la collision GameTheory-13d — clôture en duplicate de #21506

Sur instruction du coordinateur (DM 25/10 10:35Z : « deux PRs sur le même carnet
GameTheory-13d, c'est une collision avec toi-même à trancher ») et au regard de
l'arbitrage firsthand posé le 25/10 10:03Z (c.1772), je tranche :

Cette PR (#21540) est close en duplicate de #21506.

Base de la décision (mesure firsthand, c.1772) :

Aucune perte de contenu : #21506 est le porteur du même fond (démo Qp cellules
4/6 + benchmark / verdict / §1.4-§1.5). Le contenu de #21540 est intégralement
porté par #21506.

#21536 (que #21540 adressait) est couvert par #21506, qui porte les mêmes
corrections de fond.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Clôturée en duplicate de #21506 — tranchage de la collision GameTheory-13d (cf commentaire ci-dessus). #21506 = porteur, APPROVED, re-exec 17/17 ; aucun contenu perdu.

@jsboige jsboige closed this Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants