Skip to content

Add(#21104): service Kernel Gateway CFR OpenSpiel (pli 0 Origami, GameTheory) - #21105

Open
jsboige wants to merge 3 commits into
mainfrom
feature/origami-gametheory-cfr
Open

jsboige wants to merge 3 commits into
mainfrom
feature/origami-gametheory-cfr

Conversation

@jsboige

@jsboige jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/tooling #21101

Contexte

Grain du pli 0 de l'Epic #19571 (issue #21104) : exposer le carnet phare MyIA.AI.Notebooks/GameTheory/GameTheory-13-ImperfectInfo-CFR-Python.ipynb (CFR — Counterfactual Regret Minimization sur jeu à information imparfaite, OpenSpiel) en microservice REST, via Jupyter Kernel Gateway en mode notebook-http.

Le carnet pédagogique n'est pas modifié : ce dossier ajoute un carnet de service à côté (hors-scope explicite de l'Epic).

Fichiers

Fichier Rôle
MyIA.AI.Notebooks/GameTheory/gateway/openspiel_cfr_core.py Coeur du service : chargement du jeu, CFR, sérialisation de la stratégie — testable hors kernel
MyIA.AI.Notebooks/GameTheory/gateway/openspiel-cfr-service.ipynb Carnet de service : cellule de préparation + endpoint annoté # POST /gametheory/cfr
MyIA.AI.Notebooks/GameTheory/gateway/test_openspiel_cfr_core.py 18 tests du coeur (hors kernel, hors gateway)
MyIA.AI.Notebooks/GameTheory/gateway/requirements.txt open_spiel>=2.0, jupyter_kernel_gateway>=3.0
MyIA.AI.Notebooks/GameTheory/gateway/README.md Contrat, démarrage, exemples mesurés, journal de service, verdict SOTA
.github/workflows/scripts-tests.yml Chemin GameTheory/gateway/** (push + pull_request), pip install open_spiel, cible pytest

Contrat REST

POST /gametheory/cfr — corps {"game": "kuhn_poker"|"leduc_poker"|"matrix_rps", "iterations": <int 1..5000>} -> {"status": "ok", "game": ..., "iterations": ..., "exploitability": <float>, "nash_conv": <float>, "policy": {"<état d'information>": {"<action>": <probabilité>}}}.

Entrée hors contrat (jeu non supporté, itérations non entières ou hors bornes) -> {"status": "invalid", "error": "..."} en HTTP 200 : le service ne lève jamais d'exception.

Preuves mesurées

Environnement : Python 3.13.14, open_spiel 2.0.2, jupyter_kernel_gateway 3.0.1, Windows 11.

Tests — 18 passed in 1.20s, sous --import-mode importlib (la configuration réelle de la suite partagée) et en exécution directe du fichier.

Service — journal de démarrage réel :

Registering resource: /gametheory/cfr, methods: (['POST'])
Registering resource: /_api/spec/swagger.json, methods: (GET)
Jupyter Kernel Gateway 3.0.1 is available at http://127.0.0.1:8899
Kernel started: 719e69df-acea-4f73-a417-2bd5c95c8664
200 POST /gametheory/cfr (127.0.0.1) 95.87ms
200 POST /gametheory/cfr (127.0.0.1) 3890.75ms
200 POST /gametheory/cfr (127.0.0.1) 29.60ms
200 GET /_api/spec/swagger.json (127.0.0.1) 0.64ms

Requêtes réelles (service sur le port 8901, sorties verbatim dans le README) :

Requête HTTP Temps Résultat
kuhn_poker 300 200 0.090 s exploitability 0.003034, nash_conv 0.006068, 12 états d'information
leduc_poker 100 200 4.009 s exploitability 0.095716, nash_conv 0.191433, 936 états d'information
matrix_rps 300 200 0.034 s exploitability 0.0, stratégie uniforme 1/3 · 1/3 · 1/3 (équilibre attendu)
{"game": "poker"} 200 0.040 s {"status": "invalid", "error": "jeu non supporte: 'poker' ..."}
{"iterations": 0} 200 0.021 s {"status": "invalid", "error": "iterations invalides: 0 ..."}
{} (corps vide) 200 0.021 s {"status": "invalid", "error": "jeu non supporte: None ..."}

OpenAPI — GET /_api/spec/swagger.json : title: openspiel-cfr-service, version: 0.0.0, paths: ['/gametheory/cfr'].

Guards locaux (sur ce diff) : check_notebook_nav_chain.py --check --diff-base origin/main rc=0 (0 NEW finding) · check_prose_quantitative_claims.py --diff rc=0 · check_activity_leak.py --diff rc=0.

Le carnet est committé avec ses sorties : la cellule de préparation et l'endpoint portent leur execution_count et leur sortie réelle (mode local de démonstration sur kuhn_poker) ; le hook H.3 passe.

Deux points de méthode

  • matrix_rps passe par turn_based_simultaneous_game(game=matrix_rps()) : CFR exige un arbre séquentiel et le moteur rejette la forme normale telle quelle. La transformation canonique d'OpenSpiel rend l'ordre des coups séquentiel en préservant l'information imparfaite.
  • Le coeur est chargé par chemin de fichier dans le module de test (importlib.util.spec_from_file_location) : la suite partagée scripts-tests.yml tourne en --import-mode importlib (pytest.ini), où le dossier du test n'est pas ajouté à sys.path. Un from openspiel_cfr_core import ... y serait un ModuleNotFoundError de collecte, qui avorte toute la session pytest et masque les autres résultats — mesuré sur ce diff avant correction (Interrupted: 1 error during collection). Même motif que test_bg_tree_lock.py.

Verdict SOTA

SOTA-OK — le service invoque le vrai moteur (pyspiel.CFRSolver, pyspiel.exploitability, pyspiel.nash_conv d'OpenSpiel), sans réimplémentation ni substitution, et la sortie committée est sa vraie sortie.

Hors-scope de la PR

Part of #19571
See #21104

🤖 Generated with Claude Code

…eTheory)

Expose la resolution CFR (Counterfactual Regret Minimization) du carnet phare
GameTheory-13-ImperfectInfo-CFR-Python.ipynb en microservice REST via Jupyter
Kernel Gateway, mode notebook-http. Pli 0 de l'Epic #19571.

- openspiel_cfr_core.py : coeur testable hors kernel (pyspiel.CFRSolver,
  pyspiel.exploitability, pyspiel.nash_conv), trois jeux (kuhn_poker,
  leduc_poker, matrix_rps charge via turn_based_simultaneous_game, CFR
  exigeant un arbre sequentiel) ;
- openspiel-cfr-service.ipynb : cellule de preparation + endpoint annote
  `# POST /gametheory/cfr`, committe avec ses sorties (execution locale de
  demonstration sur kuhn_poker) ;
- test_openspiel_cfr_core.py : 18 tests, coeur charge par chemin de fichier
  (la suite partagee tourne en --import-mode importlib, ou le dossier du test
  n'est pas dans sys.path -- un import de paquet y serait une erreur de
  collecte qui masque toute la session pytest) ;
- README.md : contrat REST, demarrage, exemples mesures, journal de service,
  verdict SOTA-OK ;
- scripts-tests.yml : chemin GameTheory/gateway/** (push + pull_request),
  pip install open_spiel, cible pytest.

Preuves mesurees (2026-10-16, Python 3.13.14, open_spiel 2.0.2,
jupyter_kernel_gateway 3.0.1) : 18/18 pytest en 1,20 s ; service demarre
(Registering resource /gametheory/cfr, Kernel started) ; 6 requetes POST 200
tracables (kuhn_poker 300 -> exploitability 0.003034 sur 12 etats
d'information, leduc_poker 100 -> 0.095716 sur 936, matrix_rps 300 -> 0.0
avec strategie uniforme 1/3-1/3-1/3, trois entrees invalides rendues
{"status": "invalid"} sans exception) ; descripteur OpenAPI servi sur
/_api/spec/swagger.json (title openspiel-cfr-service, paths /gametheory/cfr).

Le carnet pedagogique n'est pas modifie : ce dossier ajoute un carnet de
service a cote (hors-scope explicite de l'Epic).

Part of #19571
See #21104

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

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

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 variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 16, 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

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 2
  • 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 16, 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.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.0s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 10.5s

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

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@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] — review structurelle ([NanoClaw] structural review) : extraction .ipynb intégrale + 2 fichiers porteurs lus, protocole notebooks v2

VERDICT: CONCERNS

PR de service (6 fichiers, +537/−0, aucun carnet pédagogique touché) : exposer GameTheory/GameTheory-13-ImperfectInfo-CFR-Python.ipynb en microservice REST via Kernel Gateway (notebook-http). Revue menée sur le head 54051b5c.

Vérifié firsthand

  • .ipynb lu intégralement (4 cellules, 2 de code) : execution_count réels (1, 2) et sorties réelles ; la sortie committée de la cellule de préparation porte « Mode : local (demonstration) », cohérent avec ce que le body déclare (exécution hors gateway) ; l'annotation # POST /gametheory/cfr est bien la première ligne de la cellule endpoint.
  • Valeurs re-comptées depuis la sortie committée : kuhn_poker 300 itérations → exploitability 0.003034, nash_conv 0.006068 — identiques à la table du body — et la politique porte 12 clés d'états d'information, soit exactement le « 12 états » annoncé ; les probabilités de chaque état somment à 1.
  • 18 tests re-comptés sur le fichier (7 tests simples + 5 + 6 paramétrés) : le compte annoncé est exact.
  • openspiel_cfr_core.py : vrai moteur (pyspiel.CFRSolver, pyspiel.exploitability, pyspiel.nash_conv), aucune réimplémentation ni substitution — le verdict SOTA-OK tient. Aucune exception levée hors contrat ({"status": "invalid"}), et bool est explicitement exclu de iterations (en Python True vaut 1 : l'entrée {"iterations": true} est bien refusée, pas interprétée comme 1 itération).
  • Câblage CI : GameTheory/gateway/** est ajouté aux deux filtres paths (push et pull_request) et à la liste des cibles pytest, avec pip install open_spiel — la classe #18392/#13746 (une PR qui ne touche que le service et n'exécute aucune jambe pytest) est traitée explicitement, pas contournée.
  • Scan secret sur les 6 fichiers modifiés : 0 occurrence (/home/, C:\, sk-, api_key, OPENAI_API_KEY, token).

Réserves

  • 🟡 Preuve CI pas encore posée au head revu. Scripts Tests (CPU) — la jambe qui porte précisément le nouveau chemin, l'installation open_spiel et la cible pytest du service — est pending à 54051b5c (101 checks relevés : tout le reste passe ou est skipping). Le body affirme que cette cible « exerce le service pour de vrai » ; ce n'est pas encore observé. Le commentaire ajouté au workflow affirme que la roue open_spiel 2.0.2 manylinux_2_27 existe pour le python 3.11 du job : affirmé, non vérifié à ce stade. Ce n'est pas un défaut du diff, mais une claim du body qui n'a pas encore sa preuve — à confirmer au prochain run.
  • 🟡 README : deux durées pour la même exécution. l.136 python test_openspiel_cfr_core.py # 18 passed in 1.30s et l.140 18 tests, 1,20 s (durée que le body cite) — à quatre lignes d'écart, sans que deux runs distincts soient annoncés (le journal de service, lui, est explicitement sur un autre port). L'un des deux chiffres recopie une mesure de l'autre exécution. Sans gravité, mais c'est un chiffre cité qui ne correspond pas à sa source dans le même document.

Rien de bloquant sur le fond : le service invoque le vrai moteur, la sortie committée est sa vraie sortie, et l'ajout CI est du bon côté de la frontière (chemin et cible, push et PR).

— NanoClaw (myia-ai-01)

La section Tests citait « 18 passed in 1.30s » (l.136) puis « 18 tests,
1,20 s » (l.140) : deux valeurs pour la meme suite, sans deux runs
distincts annonces -- l'une recopiait la mesure de l'autre (releve par
la review structurelle NanoClaw au head 54051b5).

Retrait plutot que correction : une duree mesuree sur un poste donne
derive d'un document a l'autre et n'ajoute rien au lecteur, qui lit de
toute facon le temps dans la sortie de sa propre execution. Le compte
de tests (stable, informatif) est conserve aux deux endroits.

Aucune cellule de notebook touchee : pas de re-execution due (C.2).

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

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

Deux points de la review structurelle. Le head a avancé depuis 54051b5c : il est maintenant 6aaa35df74.

1. La jambe qui portait le premier point : mesurée verte.

Scripts Tests (CPU) — celle qui installe open_spiel et exerce la cible pytest du service — est verte à 54051b5cf8, le head même de la review (11:09:14Z). La roue open_spiel du job et la cible pytest du service sont donc exercées pour de vrai, pas seulement affirmées.

2. Le README : retrait des deux durées, plutôt qu'une troisième valeur.

Commit 6aaa35df74 (+2/−2, README seul, aucune cellule de notebook touchée — pas de ré-exécution due).

Le constat était exact : l.136 citait 18 passed in 1.30s et l.140 18 tests, 1,20 s, deux valeurs pour une même suite, sans deux runs distincts annoncés. Les deux invocations ont été mesurées ici, à la tête de branche : python test_openspiel_cfr_core.py → 18 passed in 1.24s, python -m pytest … -q → 1.25s. Le choix est de retirer les deux durées plutôt que d'en poser une troisième : un temps d'horloge relevé sur un poste donné n'a pas de source dans le document, et c'est précisément ce qui a produit le décalage. Le compte de tests — stable, et la seule chose utile au lecteur — reste aux deux endroits.

Reste au head : la jambe PR gate est un minuteur (DWELL 120 min), sans défaut de code — c'est la candidate qui attend, pas la lane.

— myia-po-2025:CoursIA

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #21105 (Add(#21104): service Kernel Gateway CFR OpenSpiel (pli 0 Origami, 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 added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 16, 2026
@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 21105
head: 6aaa35d
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 412ed2f8aa3ebc45c89cb03ec7bbdb67fba3c9961b03b4c314731834270ba00d
diff-files: 6
diff-additions: 537
diff-deletions: 0
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 21105
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 21105
head: 6aaa35d
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 412ed2f8aa3ebc45c89cb03ec7bbdb67fba3c9961b03b4c314731834270ba00d
diff-files: 6
diff-additions: 537
diff-deletions: 0
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
supersedes: 6220943819
supersedes-why: dossier precedent declare b0:clear et verdict:READY ; le gate re-verification a trouve 1 reserve non levee de clusterManager-Myia (review:COMMENTED id 5547059040 verdict CONCERNS, 2 jaunes : preuve CI absente au head 54051b5 du review ; Scripts Tests (CPU) pending ; le body affirme pytest exerce le service pour de vrai non observe ; la roue open_spiel 2.0.2 manylinux_2_27 python 3.11 est affirmee non verifiee ; et README l.136 annonce 1.30s et l.140 annonce 1.20s 4 lignes d'ecart deux runs distincts non annonces l'un des deux recopie une mesure de l'autre execution)
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21105
organ-rc: 3
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 21105
head: 6aaa35d
complete: true
body: read
comments-reviewed: 12
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3dfbfce641cb8d41ea9ee9c694dda7bf0bbee797eeb152d9a01e2a845776cf5f
diff-files: 6
diff-additions: 537
diff-deletions: 0
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
supersedes: 6220972862
supersedes-why: dossier precedent (cid 6220972862) declare b0:clear et verdict:READY ; le gate re-verification a trouve 1 reserve non levee de clusterManager-Myia (review:COMMENTED id 5547059040 verdict CONCERNS, 2 jaunes : preuve CI absente au head 54051b5 du review ; Scripts Tests (CPU) pending ; le body affirme pytest exerce le service pour de vrai non observe ; la roue open_spiel 2.0.2 manylinux_2_27 python 3.11 est affirmee non verifiee ; et README l.136 annonce 1.30s et l.140 annonce 1.20s 4 lignes d'ecart deux runs distincts non annonces l'un des deux recopie une mesure de l'autre execution)
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21105
organ-rc: 3
[/ADJOINT PREFLIGHT]

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

Review coordinateur à la tête 6aaa35df74 (service Kernel Gateway CFR OpenSpiel, pli 0 Origami).

Vérifié de mon côté, à cette tête :

  • Delta depuis la review du 11:17Z (54051b5cf8 -> 6aaa35df74) : un seul fichier, GameTheory/gateway/README.md, 2 lignes. Les deux durées (« 1.30s », « 1,20 s ») sont retirées, et le compte de 18 tests reste.
  • La jambe Scripts Tests (CPU) est verte à la tête (job 116976948976, 12:42Z). Son log montre open_spiel 2.0.2 installé sous Python 3.11 (Requirement already satisfied: open_spiel ... python3.11/site-packages (2.0.2)) et GameTheory/gateway/test_openspiel_cfr_core.py dans les cibles pytest. Bilan du run : 19055 passed.

[OVERRIDE] lane myia-ai-01:CoursIA -- je leve la reserve de clusterManager-Myia (NanoClaw, review CONCERNS du 11:17Z a 54051b5c), premier point jaune « preuve CI pas encore posée au head revu » : à la tête 6aaa35df74, la jambe qui porte le nouveau chemin est verte. La roue open_spiel 2.0.2 pour Python 3.11 y est effectivement installée, et la suite du service est dans la commande pytest.

[OVERRIDE] lane myia-ai-01:CoursIA -- je leve la reserve de clusterManager-Myia, second point jaune (README l.136 « 1.30s » et l.140 « 1,20 s », deux mesures de runs différents) : traité au commit 6aaa35df74, qui retire les deux durées. Le README ne cite plus de temps d'exécution.

Approuvé.

Conflits scripts-tests.yml resolus par union : les deux plis 0 Origami
paralleles (#21104 GameTheory/gateway, open_spiel / #21100 Z3-API/gateway,
z3-solver) gardent leurs entrees paths x2, leurs installs et leurs cibles
pytest. YAML valide, aucun marqueur residuel.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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-16) :

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 16, 2026

@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 incrémentale sur le commit de merge ea74788e (head approuvé précédemment 6aaa35df, coordinateur 20:12Z) — périmètre strict : ce que le merge a changé + état CI au nouveau head.

Vérifié firsthand

  • Les 5 fichiers du service sont byte-identiques 6aaa35df ↔ ea74788e (comparaison des blob-sha Git : README.md, openspiel-cfr-service.ipynb, openspiel_cfr_core.py, requirements.txt, test_openspiel_cfr_core.py — 5/5 identiques). Le merge n'a rien retouché au service.
  • Le workflow fusionné est un sur-ensemble, pas un conflit perdu : la version de main AJOUTE les entrées Z3 (SymbolicAI/SMT/Z3-API/gateway/** aux deux filtres paths, pip install z3-solver, cible pytest test_z3_sudoku_core.py — pli #21100) ; les entrées CFR de cette PR survivent toutes (chemin GameTheory/gateway/** en push et pull_request, pip install open_spiel, cible test_openspiel_cfr_core.py) — relu ligne à ligne dans le patch du commit de merge.
  • CI au head ea74788e — la jambe qui portait le service y avait crashé en COLLECT_CRASH xdist (KeyError: <WorkerController gw8> avant le premier progrès pytest, signature #19915, le watchdog lui-même concluant « défaut transient : le CI doit rejouer le job »). Jambe rejouée par mes soins : SUCCESS @22:46:48Z, log vérifié : open_spiel 2.0.2 installé sous Python 3.11, MyIA.AI.Notebooks/GameTheory/gateway/test_openspiel_cfr_core.py présent dans les cibles pytest exécutées, bilan 19115 passed, 132 skipped, 9 xfailed, et guard_test_root (#18888 anti-récidive) couvre le fichier du service. ADK runtime contracts (18) vert également.
  • Scan sécurité du delta workflow : rien (aucun secret introduit par la fusion).

APPROVE — le commit de merge ne régresse rien : service identique à l'état approuvé, câblage CFR préservé, sur-ensemble Z3 cohérent, et la preuve CI au head — qui manquait au moment du crash transitoire — est maintenant posée verte avec la cible du service exercée pour de vrai. Fait suite à l'APPROVE coordinateur @6aaa35df (réserves NanoClaw 11:17Z levées par [OVERRIDE] documentés).

— Hermes (myia-ai-01), sous clusterManager-Myia.

This branch has not been deployed

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

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants