Skip to content

Docs(gametheory,#17712): commentaire de OFTRLSolver sans sceau de cycle - #20765

Merged
myia-ai-01 merged 3 commits into
mainfrom
claude/17712-tell-gt13d
Oct 21, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
claude/17712-tell-gt13d

Conversation

@jsboige

@jsboige jsboige commented Oct 14, 2026

Copy link
Copy Markdown
Owner

See #17712

Hors flotte (exemption #17713).

Summary

  • Le commentaire qui précède self.strategy_sum[info_set] += reach_probs[player] * strategy dans OFTRLSolver.cfr() (cellule 4, lignes 72-75) portait un sceau de cycle interne (« narrow-REPAIR c.773 narrow239ᵉ Tell c.709-L1 »). Il est réécrit : il décrit ce que fait la ligne et renvoie à la PR feat(gametheory,#13291): GT-13d companion — Optimistic Counterfactual Regret Minimization (OFTRL) #13604 qui a restauré cette accumulation.
  • Le carnet est ré-exécuté en place (papermill, kernel python3), car une cellule de code a changé. Par rapport à origin/main, les sorties ne diffèrent que par des temps mesurés (cellule 8, colonne time(s)) et par une valeur MCCFR non seedée (cellule 2). Une ligne optionnelle de la cellule 2 n'apparaît plus (détail ci-dessous).
  • Trois constats hors périmètre sont établis par mesure et signalés sans correction : la démo de la cellule 4 affiche une colonne uniforme pour Q (constat 3), un commentaire donne une formule fausse (constat 4), et alpha/beta ne servent à rien dans la cellule 4 (constat 5). Ils sortent du périmètre de ce sceau.

Changes

  • MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR-Python.ipynb (1 fichier) :
    • cellule 4 : seul le commentaire change (3 lignes remplacées par 4). L'AST de la cellule est identique à celui de origin/main (ast.dump égal) ;
    • cellules markdown et metadata.kernelspec inchangés ;
    • sorties de code et metadata.papermill régénérés par la ré-exécution (papermill réécrit les durées et horodatages de toutes les cellules).

Verdicts

# Constat Verdict Preuve
1 Sceau de cycle dans le commentaire de la cellule 4 (Tell c.709-L1, c.773 narrow239ᵉ, narrow-REPAIR) CONFIRMED, corrigé grep -c "Tell c\." sur le carnet de origin/main : 1 ; sur cette branche : 0
2 Le commentaire affirme que la ligne « était omise » dans le socle CFRSolver.cfr() CONFIRMED (formulation erronée), reformulé La ligne self.strategy_sum[info_set] += reach_probs[player] * strategy figure dans CFRSolver.cfr(), cellule 11 de GameTheory-13-ImperfectInfo-CFR-Python.ipynb. Le commentaire décrit désormais la ligne, sans parler d'une omission
3 Démo de la cellule 4 : la colonne [0.5, 0.5] est attribuée à l'omission (corps de #13604 : « la colonne OFTRL du benchmark = artefact [0.5, 0.5] ») CONFIRMED, signalé, non corrigé Sonde ci-dessous : strategy_sum["Q"] reste à 0. Les trois colonnes de la sortie committée (CFR, CFR+, OFTRL, lignes 93-95 de la cellule 4) sont uniformes, y compris CFR, qui ne partage pas l'omission. Cause : la démo joue cfr("", [0, 1], ...), donc le joueur d'indice 0 tient J et agit à la racine ; l'info set Q (joueur d'indice 1, historique vide) n'existe pas dans l'arbre et reste à zéro, et get_average_strategy renvoie l'uniforme. La cellule 8 fait jouer les deux cartes dans les deux sens (lignes 42-46, [1, 0] quand p = 1) : le joueur d'indice 0 tient alors Q à la racine, et la colonne Q (lignes 64-67) n'est plus uniforme
4 Commentaire lignes 59-64 : « pas 1/(T+1) », « amortissement du premier jet trop brutal » CONFIRMED, signalé, non corrigé Le code calcule step = self._kappa / T (ligne 66) puis depth_factor = 1.0 / (1.0 + depth) (ligne 68) : ce n'est pas 1/(T+1). Le récit « premier jet » raconte une correction, pas le mécanisme
5 self._alpha et self._beta (lignes 22-23) CONFIRMED, signalé, non corrigé Affectés dans __init__, aucune lecture dans la cellule 4 (grep : seules les lignes 22-23 matchent)
6 # Fix #17882: en cellule 2 FALSE POSITIVE (pas un sceau) Numéro d'issue réel, fermée (REST) ; conservé
7 Cellule 10 (markdown, exercice 1) : valeurs « κ≈1.5, α≈0.3, β≈0.5 » signalées FABRICATION_DETECTED par check_markdown_claims_output.py Pré-existant, non touché Deux findings identiques avant et après la modification (copie de base vs HEAD) ; hors périmètre de ce sceau

Sonde (cellules 2 et 4 exécutées, puis masse de stratégie accumulée par info set, sur le carnet de base) :

PROBE mass J 500.0
PROBE mass Q 0.0          <- jamais visité
PROBE mass Qp 497.80555555555554
PROBE mass Qb 2.1944444444444446
PROBE get_average_strategy("Qp") OFTRL = [0.0005022041180737682, 0.9994977958819262]
PROBE get_average_strategy("Q") OFTRL = [0.5, 0.5]

Le correctif de #13604 est donc effectif pour les info sets visités (Qp a une moyenne non uniforme) ; ce qui reste uniforme dans la démo est le choix de l'info set affiché.

Suivi proposé (sujet séparé, non ouvert ici) : remplacer "Q" par un info set visité dans les trois appels de la cellule 4 (lignes 93-95) et corriger le commentaire lignes 59-68 (pas 1/(T+1), alpha/beta inutilisés, récit du premier jet). Ces deux changements modifient les sorties : ils relèvent de C.2 et d'une issue dédiée.

Validation

Ré-exécution (cellule de code modifiée, C.2) :

$ python -m papermill GameTheory-13d-Optimistic-CFR-Python.ipynb GameTheory-13d-Optimistic-CFR-Python.ipynb -k python3 --cwd .
Executing: 100%|██████████| 17/17 [00:11<00:00,  1.43cell/s]
rc=0

Comparaison des sorties avec origin/main (script compare2, flux consécutifs fusionnés, texte comparé ligne à ligne) :

===== cell 2: identique(coalesce)=False
    -Optional module pokerkit_wrapper was not importable: No module named 'pokerkit'
    -  Utilite finale: -0.0555
    +  Utilite finale: -0.0556
===== cell 4: identique(coalesce)=True
===== cell 6: identique(coalesce)=True
===== cell 8: identique(coalesce)=False
    -    0  simultaneous     1.0911  [0.9981, 0.0019]  [0.9982, 0.0018]  [0.8789, 0.1211]  [0.9772, 0.0228]
    +    0  simultaneous     0.6729  [0.9981, 0.0019]  [0.9982, 0.0018]  [0.8789, 0.1211]  [0.9772, 0.0228]
    ... (16 lignes au total : seule la colonne time(s) change, toutes les valeurs d'exploitabilité sont identiques)
===== cell 11: identique(coalesce)=True
===== cell 13: identique(coalesce)=True
===== cell 15: identique(coalesce)=True
  • Cellule 2 : MCCFR apres 50000 iterations : Utilite finale passe de -0.0555 à -0.0556. La cellule charge GameTheory-13-... et exécute en entier sa cellule 22 (MCCFR, np.random.choice et np.random.randint) ; aucun np.random.seed n'existe dans le carnet GT-13 (grep). C'est de l'aléa non seedé, pas un effet de la modification.
  • Cellule 2, ligne Optional module pokerkit_wrapper ... 'pokerkit' : présente dans la sortie committée, absente ici. Elle s'intercale entre « Resultats apres 5000 iterations » et la ligne CFR de la cellule 20 de GT-13, exécutée en entier par le chargeur. pokerkit n'est pas installé dans le venv (importlib.util.find_spec = None), et la sortie committée porte déjà « No module named 'pokerkit' ». Je n'ai pas localisé l'émetteur du message (grep négatif dans les .py du venv), donc je ne lui attribue pas la différence.
  • Cellule 8 : seule la colonne time(s) change (temps mesuré par perf_counter).

Vérifications :

$ python -c "import nbformat; nbformat.validate(nbformat.read(NB, as_version=4))"
nbformat valid

$ python scripts/notebook_tools/check_papermill_ratchet.py origin/main
changed notebooks : 1
regressions       : 0
  BLOCK_MOVED  GameTheory-13d-Optimistic-CFR-Python.ipynb   (bloc papermill réécrit avec les nouvelles sorties, non périmé)

$ python scripts/notebook_tools/check_output_failure_text.py origin/main
base origin/main -> merge-base 1cef8a550249 | 1 changed notebooks | 0 regressed

$ python scripts/notebook_tools/check_source_collapse.py origin/main
base origin/main -> merge-base 1cef8a550249 | 1 changed notebooks | 0 flagged (advisory)

$ python scripts/notebook_tools/check_output_collapse.py origin/main
base origin/main -> merge-base 1cef8a550249 | 1 changed notebooks | 0 flagged (advisory)

$ python scripts/notebook_tools/check_activity_leak.py --diff origin/main...HEAD
[OK] aucun passage d'activite dense ajoute (1 carnet(s) modifie(s) analyses, mentions isolees tolerees).

$ python scripts/notebook_tools/check_prose_quantitative_claims.py --diff origin/main...HEAD
[OK] aucun compteur quantitatif en prose.

$ python scripts/check_stale_claims.py --json NB           anomaly_count : 0 (base) / 0 (HEAD)
$ python scripts/check_markdown_claims_output.py --json NB  2 findings identiques (cellule 10, pré-existants, verdict 7)

$ grep -c "Tell c\." NB   origin/main : 1   HEAD : 0
$ grep -rl "GameTheory-13d-Optimistic-CFR-Python" scripts/notebook_tools/twin_pairs.d/ translations/   (aucune occurrence)
$ collision : 101 PR ouvertes scannées (gh api pulls/N/files) ; aucune ne touche ce carnet
$ C.1 : grep -cE "raise NotImplementedError|assert False|1/0" NB   0

Référence #13604 (REST) : PR mergée le 2026-08-30T22:46:02Z ; commit de squash ea15bc59b, titre feat(gametheory,#13291): GT-13d companion - Optimistic CFR (OFTRL) (#13604) ; son corps décrit l'omission de l'accumulation dans OFTRLSolver.cfr() et son rétablissement. Le clone est superficiel (shallow) : l'ancêtre de ea15bc59b n'est pas vérifiable localement, mais la ligne est présente sur origin/main (grep = 1).

Review Checklist

  • 1. Scope : un commentaire de la cellule 4 réécrit, un fichier, AST identique. Les constats 3 à 5 sont signalés et non traités ici.
  • 2. Validation post-fix : ratchets et checks relancés après le commit b4e0eb50cc (contenu identique à 5266863d9d, seul le message a été amendé).
  • 3. Cohérence pédagogique : partielle. Le commentaire du sceau décrit désormais la ligne. La démo de la cellule 4 affiche une colonne uniforme pour une raison étrangère à l'omission (constat 3), et le commentaire lignes 59-68 est inexact (constat 4) : ils restent ouverts, avec le suivi proposé.
  • 4. Exécution réelle : papermill 17/17, rc=0, exec_count 1 à 7 sur les cellules de code, aucune sortie d'erreur.
  • 5. Regression check : aucun symbole modifié. Les références au carnet (README.md de GameTheory, _quarto.yml, COURSE_CATALOG.generated.*, golden_set.yml, rename-ledger.tsv, docs/curriculum/recherche.md) n'ont pas été touchées ; le carnet compagnon 13e et OFTRLSolver ne changent pas.

Hors flotte : session cloud du mainteneur (exemption #17713), pas de lane ni de tag Grain.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA


Generated by Claude Code

Le commentaire qui justifie l'accumulation de strategy_sum dans
OFTRLSolver.cfr() citait un numero de cycle interne (« Tell c.709-L1 »)
et des libelles de repair. Il decrit maintenant la ligne accumulee et
renvoie a la PR #13604 qui a restaure cette accumulation.

Seule la cellule de code 4 change, et uniquement son commentaire. Le
carnet a ete re-execute en place (papermill, kernel python3). Par rapport
a origin/main, les sorties different seulement par des temps mesures
(cellule 8, colonne time(s)), par une valeur MCCFR non seedee et par une
ligne optionnelle pokerkit absente de la re-execution (cellule 2) ; les
autres sorties de code sont identiques.

See #17712

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
…canonique)

La re-execution precedente tournait sous Python 3.12 alors que la base
etait en 3.13 : le garde de derive de kernel (check_kernel_drift.py)
refuse la transition 3.13 -> 3.12. Carnet relance en place sous 3.13
(papermill, CPU) ; sorties identiques au commit precedent hors horodatages
et durees.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA

jsboige commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

Nouveau commit 1a7f006e83 : le carnet est ré-exécuté sous Python 3.13. La ré-exécution précédente tournait sous 3.12 alors que la base est en 3.13, et le garde check_kernel_drift.py refuse cette transition. Résultat : sorties identiques au commit précédent hors la colonne time(s) du benchmark (cellule 7df8e482) et un arrondi de l'utilité finale (-0.0556 → -0.0555), qu'aucune prose ne cite.

Contrôles relancés sur la nouvelle tête : check_kernel_drift.py origin/main → OK: 0 kernel-drift regression ; check_papermill_ratchet.py → regressions: 0 ; check_output_failure_text.py → 0 regressed. Les signalements de check_markdown_claims_output.py et check_stale_claims.py sont identiques avant et après ce commit.

Hors flotte : session cloud du mainteneur (exemption #17713).


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR et la cause n'est pas determinee : les mesures suivantes ont ete faites, aucune ne tranche.

  • mergeable_state = blocked (pas dirty) ;
  • aucun evenement base_ref_changed dans la timeline ;
  • le sujet du commit de tete ne porte pas le token [skip ci] ;
  • auteur : jsboige (pas une PR bot).

Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens.

Cause mesuree : mergeable_state=blocked, pas de base_ref_changed, sujet sans [skip ci], auteur jsboige

@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

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 16.2s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.3s

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

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

@github-actions github-actions Bot removed the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 16, 2026
@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 added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Oct 16, 2026
@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20765
head: ba21291
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 70897c0ff5eac83da15c9242239c5e589f9eee9198c514a4d64c73eb47fe805d
diff-files: 1
diff-additions: 99
diff-deletions: 111
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 20765
organ-rc: 0
[/ADJOINT PREFLIGHT]

Lectures de fond (tête ba21291) : body complet lu (réécriture d'un sceau de cycle en commentaire cellule 4 + ré-exécution papermill documentée, table Verdicts 7 constats avec preuves, hors flotte #17713 sans tag Grain — voulu) ; 9 commentaires parcourus (bots : golden-set 9/9, PR validation PASS 7 cellules, organ-dup clean ; advisory claim-check 03:33:48Z « prose/output review needed » — correspond au constat 7 du body, FABRICATION_DETECTED pré-existant sur les valeurs κ/α/β de la cellule 10, établi par mesure comme identique avant/après et hors périmètre du sceau) ; 0 reviews (aucune review posée — porte review ouverte côté coordinateur). Dernier commit = fusion content-free de main (16T02:03Z), bots passés après. PR gate success @2026-10-16T07:54:36Z (latest-wins). B.0 rc=0. Diff mesuré conforme au body : 1 fichier, +99/-111 (commentaire cellule 4 + sorties régénérées).

@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] Review tier-âgé #20765 @ ba212910 — Docs(gametheory,#17712) : commentaire de OFTRLSolver sans sceau de cycle (1 carnet, +99/−111).

VERDICT : LGTM (COMMENT). PR hors-flotte (exemption #17713) du 14/10, jusqu'ici sans aucune revue non-auteur — promotion tier-âgé (118 h, pool 300 open, page 1).

Vérifications au head ba212910 (blobs base↔head extraits et comparés, 17 cellules) :

  1. Sceau supprimé : grep -c "Tell c\." = 1 en base, 0 au head ✓ ; narrow-REPAIR/narrow239 idem ✓. Le nouveau commentaire (l.72-76 cellule 4) décrit la ligne d'accumulation et renvoie à #13604, sans prétendre une omission dans le socle.
  2. AST cellule 4 identique base↔head (ast.dump égal) ✓ — seul le commentaire change, aucun symbole modifié.
  3. Ré-exécution papermill saine : bloc top-level duration=12.813407 (fractionnaire), start/end µs distinctes (.627444/.440851), version 2.6.0 ; les 17 blocs per-cell ont tous durées fractionnaires et µs start≠end — aucune signature de fabrication (#21229-like : durée ronde + µs identiques = 0 hit). exec_count 1→7 sans trou ✓.
  4. Sorties : cellule 4 byte-identique base↔head ✓ ; cellule 8 = seule la colonne time(s) change, les 4 vecteurs d'exploitabilité identiques ✓ ; cellule 2 = ligne pokerkit absente + Utilite finale -0.0555 → -0.0556 (MCCFR non seedé, cohérent avec l'absence de np.random.seed dans GT-13) ✓.

Constats hors périmètre revérifiés :

  • Constat 3 (colonne Q uniforme) : la sonde du body est cohérente avec la théorie — la démo joue cfr("", [0, 1], …), le joueur 0 tient J à la racine, l'info set Q (joueur 1, historique vide) n'existe pas dans l'arbre visité → strategy_sum["Q"] = 0 → get_average_strategy retourne l'uniforme [0.5, 0.5]. Le correctif #13604 est effectif pour les info sets visités (Qp non uniforme dans la sonde). Signalé sans correction = périmètre respecté.
  • Constat 4 : step = _kappa / T (l.66) et depth_factor = 1/(1+depth) (l.68) — ce n'est effectivement pas 1/(T+1), le commentaire l.59-64 est inexact. Signalé, non corrigé ✓.
  • Constat 5 : self._alpha/self._beta (l.22-23) affectés, jamais lus dans la cellule ✓.

Suivi proposé (remplacer "Q" par un info set visité + corriger le commentaire l.59-68) modifie les sorties → relève bien d'une issue dédiée, à juste titre hors de cette PR.

Scan sécurité du diff : clean.

RAS bloquant. Le sceau est retiré proprement, la ré-exécution est authentique, et les constats adjacents sont documentés avec mesures — le suivi peut s'ouvrir sur la base des constats 3-5.

jsboige commented Oct 19, 2026

Copy link
Copy Markdown
Owner Author

Suite à la revue Hermes du 19/10 (review 5577540223) : le suivi proposé dans le body pour les constats 3 à 5 est ouvert en issue #21488 (info set Q jamais visité dans la démo de la cellule 4, commentaire du pas inexact, _alpha/_beta inutilisés). Ces changements modifient code et sorties, ils restent hors de cette PR.

Hors flotte : session cloud du mainteneur (exemption #17713).


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20765 (Docs(gametheory,#17712): commentaire de OFTRLSolver sans sceau de cycle) 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 commented Oct 20, 2026

Copy link
Copy Markdown
Owner Author

Recouvrement avec #21506 (« OFTRL démo -- info-set Qp visité », suivi de l'issue #21488) et #21540 (« GT-13d -- verdict adossé à une mesure »), mesuré contre origin/main ; à signaler pour l'arbitrage de l'ordre de fusion. Les trois PRs ré-exécutent GameTheory-13d-Optimistic-CFR-Python.ipynb : métadonnées Papermill et sorties diffèrent dans les trois, et la fusion du carnet entre en conflit dans tous les ordres.

Résolution si l'une d'elles passe d'abord : je fusionne main dans cette branche en prenant le carnet de main. Je réapplique ensuite le seul changement de cette PR, la réécriture du commentaire de 7a7df78c, et je ré-exécute le carnet de bout en bout (C.2), parce que c'est une cellule de code. Si cette PR passe d'abord, ces PRs gardent le commentaire réécrit en résolvant leur conflit.

Hors flotte : session cloud du mainteneur (exemption #17713).


Generated by Claude Code

@jsboige

jsboige commented Oct 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 20765
head: ba21291
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c14fb7e48a7ab4fa46c1c497a05b5b16afc2ae7fe5b633b672d5a6c53e79cbf3
diff-files: 1
diff-additions: 99
diff-deletions: 111
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 20765
organ-rc: 0
[/ADJOINT PREFLIGHT]

Re-stamp (le dossier de myia-po-2025:CoursIA-2 du 17/10, commentaire 6241387608, etait mort : 9 commentaires comptes contre 13 aujourd'hui, surfaces changees ; nouveau post, aucun PATCH).

Lectures de fond, tete ba2129105dca, sur les blobs origin/main et tete (pas l'arbre de travail) :

  • Body lu : reecriture d'un sceau de cycle interne en commentaire de la cellule 4 (OFTRLSolver, identifiant de cellule 7a7df78c) + re-execution papermill documentee, table de verdicts a 7 constats avec preuves, mention « Hors flotte : session cloud du mainteneur (exemption fix(ci): le garde Grain-tag bloque les PRs hors flotte (sessions cloud du mainteneur) que CLAUDE.md exempte #17713) » (donc absence de tag Grain: attendue et admise). 13 commentaires et 1 review lus.
  • Une seule cellule source change sur 7 cellules de code (17 cellules au total, des deux cotes). La cellule 4 differe uniquement par un commentaire : 3 lignes (mention « FIX (PR feat(gametheory,#13291): GT-13d companion — Optimistic Counterfactual Regret Minimization (OFTRL) #13604 narrow-REPAIR c.773 narrow239e Tell c.709-L1) » + 2 lignes d'explication) reecrites en 4 lignes (explication de l'accumulation de la strategie + « Correctif : PR feat(gametheory,#13291): GT-13d companion — Optimistic Counterfactual Regret Minimization (OFTRL) #13604 »). ast.dump est identique des deux cotes : la ligne de code self.strategy_sum[info_set] += reach_probs[player] * strategy est inchangee. Aucune autre cellule source ne differe.
  • Sorties : identique partout, sauf trois deltas reels, mesures :
    1. cellule 2 : la ligne d'avertissement d'environnement Optional module pokerkit_wrapper was not importable: No module named 'pokerkit' a disparu sur la tete. Cette ligne n'est pas produite par le carnet (grep pokerkit sur les sources du carnet a la tete : 0 occurrence) mais par le socle importe, et la trace propre de ce socle est presente des deux cotes (Classes: KuhnPoker, RegretMatcher, CFRSolver, CFRPlusSolver, MCCFRSolver). Une sortie editee a la main n'aurait pas laisse la trace du socle intacte tout en supprimant la seule ligne d'avertissement : c'est un delta d'environnement (module optionnel importable a la re-execution), aucune capacite perdue.
    2. cellule 6 : une ligne vide finale.
    3. cellule 8 : la colonne time(s) (temps mesures) — qui differe, donc l'execution est bien reelle et recente, pas une reprise d'une sortie ancienne.
  • Confrontation valeurs / phrases : les valeurs annoncees sont identiques des deux cotes — CFR: utilite finale = 0.2450, exploitabilite = 0.002332, CFR+: utilite finale = -0.0677, exploitabilite = 0.002881, MCCFR apres 50000 iterations: Utilite finale: -0.0555. Le body attribue l'ecart de la cellule 2 a « une valeur MCCFR non seedee » : la mesure ne le confirme pas (MCCFR = -0.0555 sur les deux cotes). L'ecart reel est la banniere d'environnement decrite ci-dessus. Reserve de forme, pas de fond : le code livre est bien conforme a l'annonce.
  • Execution : execution_count non nuls sur toutes les cellules de code de la tete ; metadata.papermill : exception: null, duration 12.813 s. Ratchets de sortie et de source verts (organes Output-failure ratchet, Output-collapse ratchet, Source-collapse ratchet).
  • Checks : PR gate success @2026-10-16T07:54:36Z (latest-wins), 90 jambes au total, toutes vertes ou neutrales, aucun rouge residuel ; B.0 rc=0 (check_unaddressed_nits.py : aucune reserve non levee).
  • Etat de merge : mergeable: MERGEABLE, mergeStateStatus: CLEAN, base main, 1 fichier (+99/-111), hors flotte.

Deux points pour la lecture d'ai-01 :

  1. le body decrit l'ecart de sortie par une « valeur MCCFR non seedee » qui n'est pas bornee par la mesure (valeurs identiques) — l'ecart reel etant la banniere d'environnement ;
  2. recouvrement de la cellule 4 (meme carnet GameTheory-13d-Optimistic-CFR-Python.ipynb) avec fix(gametheory,#21488): OFTRL démo -- info-set Qp visité, pas Q jamais créé #21506 (fix/21488-gametheory-13d-oftrl-demo, OPEN) et fix(gametheory,#21536): GT-13d -- verdict adosse a une mesure, axe seeds retire #21540 (fix/21536-gt13d-reference-exploitability, OPEN) : l'ordre de merge est a trancher, comme l'ecrit le commentaire du 20/10 (le carnet de main sera repris si l'une des deux passe d'abord).

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

Revue coordinateur a la tete exacte ba2129105d (c2207). Diff relu : un seul carnet (GameTheory-13d), la cellule 4 ne change que son commentaire (OFTRLSolver, renvoi au correctif #13604 reformule en explication), le code est inchange ; les sorties viennent d'une re-execution (C.2) et ne perdent que la banniere pokerkit_wrapper non importable. Dossier de l'adjoint : portes vertes, B.0 rc=0. Approuve.

@myia-ai-01
myia-ai-01 merged commit 868f453 into main Oct 21, 2026
91 of 92 checks passed
jsboige added a commit that referenced this pull request Oct 24, 2026
…in (port du fix Qp sur la version main du carnet)

Le merge de origin/main (af2aea1) a fait entrer les commits de densite
pedagogique de main (#19948, #20765). Les deux fix sources de la PR
(cellules 4 et 6 : requetes de l'info-set Qp effectivement visite, solveurs
instancies neufs) y sont portes sur la version main du carnet ; ce commit
re-genere les sorties apres re-execution papermill noyau python3, 17/17
cellules, 0 erreur.

See #21488

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

Labels

variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants