Skip to content

feat(rl,#13436): RL-15 GRPO/PPO comparison notebook (CartPole-v1, multi-seed 6, INCONCLUSIVE) - #13439

Merged
myia-ai-01 merged 6 commits into
mainfrom
feature/13436-rl15-grpo
Aug 29, 2026
Merged

myia-ai-01 merged 6 commits into
mainfrom
feature/13436-rl15-grpo

Conversation

@jsboige

@jsboige jsboige commented Aug 29, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/training -- lane myia-po-2024:CoursIA-2 -- prev: MED/notebook-lean #13436

REPAIR v3 (c.644) — verdict INCONCLUSIVE post-fix round-2

PR #13439 a été REPAIRée une seconde fois après préflight round-2 cross-lane po-2025 (issuecomment-5460076210) qui a identifié 4 incohérences post-fix dans v2. La v3 applique les corrections et conserve le verdict INCONCLUSIVE honnête.

Tell c.644 ★ NEW discovery : un premier REPAIR peut introduire de nouvelles incohérences qu'un préflight round-2 cross-lane attrape (preflight-round-2-cross-lane-finds-post-fix-incohérences). Le sweep post-fix est aussi important que le sweep initial.

Résultats v3 (post-fix n=6 + verdict symétrique)

seed=0:   PPO final30 mean=282.27, GRPO final30 mean=365.43
seed=1:   PPO final30 mean=330.27, GRPO final30 mean=95.30
seed=7:   PPO final30 mean=186.40, GRPO final30 mean=61.93
seed=42:  PPO final30 mean=341.23, GRPO final30 mean=290.73
seed=99:  PPO final30 mean=306.57, GRPO final30 mean=177.10
seed=123: PPO final30 mean=349.43, GRPO final30 mean=195.40

PPO  : mean=299.36, std=55.26, seeds=[0, 1, 7, 42, 99, 123]
GRPO : mean=197.65, std=104.99, seeds=[0, 1, 7, 42, 99, 123]
GRPO - PPO delta = -101.71, edge (naive) = -1.27sigma
Wilcoxon signed-rank (n=6, ties=0): stat=2.0, p-value=0.0938
IC95% delta (bootstrap): [-173.15, -18.27]

VERDICT : INCONCLUSIVE (edge |sigma|<2 OR p>=0.05 OR IC includes 0)

4 incohérences post-fix REPAIRées (cf préflight round-2 po-2025 c.644)

  1. Wilcoxon n=4 inatteignable p<0.05 : passage 4 → 6 seeds (n=4 min p=0.125 vérifié sur 16 configs SciPy, n=6 min p=0.03125 < 0.05 gate atteignable). Tie-detection ajoutée (WARN si diffs=0).
  2. Branche PPO BEATS inatteignable : elif edge_sigma <= 2.0 capturait tous les négatifs. Symétrie du verdict tri-state : edge_sigma > 2 ET edge_sigma < -2 (avec p<0.05 ET IC du bon côté).
  3. Motivation fausse : « GRPO moins variable » contredit par std_GRPO=128 > std_PPO=61. Réfutée explicitement dans la motivation. La variance n'est plus un argument a priori.
  4. Titre PR propagait verdict v1 invalidé : « GRPO BEATS 3.91σ » → « INCONCLUSIVE » (via gh pr edit).

Acceptance vs #13436 (c.644)

  • Notebook exécuté bout-en-bout (18 cellules, 12 code, 12/12 execution_count != null)
  • Multi-seed 6 seeds (0/1/7/42/99/123) — REPAIR c.644 (n=4 v2 ne pouvait pas atteindre Wilcoxon p<0.05)
  • Verdict honnête (BEATS / NO BEATS / INCONCLUSIVE) — conjonction |edge| ≥ 2σ ET Wilcoxon p<0.05 ET IC95% exclut 0 — REPAIR c.644 symétrie
  • GAE done-aware (REPAIR c.642)
  • GRPO pad-mask (REPAIR c.642)
  • Prose alignée exécution (6 seeds / 20×8)
  • Motivation réfutée (hypothèse variance invalidée empiriquement) — REPAIR c.644
  • Preuve GPU réelle : pas de mesure nvidia-smi committée — claim VRAM retiré (qualifié CPU-only)
  • Wilcoxon signed-rank test n=6 + tie-detection + p-value + IC95% bootstrap
  • Verdict tri-state symétrique (GRPO BEATS, PPO BEATS, INCONCLUSIVE tous atteignables) — REPAIR c.644
  • README RL entry ajoutée dans la même PR (ligne 51)
  • Grain tag DEEP/training en première ligne
  • Titre PR corrigé INCONCLUSIVE (sans verdict v1 invalidé) — REPAIR c.644

Tells c.642 + c.644

  • preflight-cross-lane-po-2025-finds-substance-defects-in-PR-c.642 ★★ NEW : COMMENTED préflight = organe de qualité substantiel
  • preflight-cross-lane-revealed-verdict-invalidation-c.642 ★★ NEW : défauts algorithmiques peuvent inverser le verdict
  • preflight-round-2-cross-lane-finds-post-fix-incohérences-c.644 ★ NEW : un premier REPAIR peut introduire de nouvelles incohérences, sweep post-fix aussi important que sweep initial

Périmètre

Liens

Sous-grain EPIC #1454 « Training & Post-Training — trading + sudoku +
RL/PPO + GenAI fine-tuning (po-2024 pionnier ⇄ ai-01 approfondit) ».

Discrimination moteur GRPO vs PPO : avantage RELATIF au groupe de K
trajectoires (mean+std) vs avantage bootstrapé GAE (value network).
Per-pr-review-discipline C : 4 seeds (0/1/7/42), edge ≥ 2σ.

Résultats exécution CPU (torch 2.11.0) :
- PPO  : mean=25.09, std=7.44
- GRPO : mean=125.27, std=43.74
- GRPO - PPO delta = +100.18, edge = 3.91σ
- VERDICT : GRPO BEATS PPO (≥ 2σ edge multi-seed)

Périmètre machine : RTX 3070 8GB (env coursia-ml-training parcimonieux).
Modèle cible < 50K params.

Refs #1454 (EPIC parent), #13436 (sous-grain).
Refs claim [CLAIMED] lane myia-po-2024:CoursIA-2 -- paths:
  MyIA.AI.Notebooks/**/*LoRA*, MyIA.AI.Notebooks/**/*PPO*,
  MyIA.AI.Notebooks/**/*RL* (sur #1454).

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

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

DM reply msg-20260829T014254 acquitté c.640. Trois actions accomplies dans l'ordre demandé :

  1. Justification écrite sur les 3 PRs rouges (pas 4, fix(search,#13174): MGS-9 EverestRelief re-exec sur moteur deterministe 607cf7a -- lecture 5b mesuree, marqueur NOIR a 3 pixels de l'optimum #13254 fermée par ai-01 entre temps) :

  2. --ignore-red honoré : picker sortie 0 rendu 8 candidats dont 5 genre CONTENU.

  3. EPIC [EPIC] Training & Post-Training — trading + sudoku + RL/PPO + GenAI fine-tuning (po-2024 pionnier ⇄ ai-01 approfondit) #1454 claimé et sous-grain livré :

Bilan R1 + G-VAR-1 c.640 : R1 TENU (1 PR livrée cycle, plancher ≥1 PR/wakeup). G-VAR-1 TENU (DEEP/training CONTENU, premier DEEP depuis 46ᵉ cycle narrow sustained Tell c.611-L1 ★★★). Tell c.640 ★★ NEW discovery à venir : le picker R5 narrow sustained avait une échappatoire documentée (--ignore-red + justification écrite sur PR) que 46 cycles narrow n'ont pas empruntée.

[RELEASED] discipline : à chaque nouveau cycle narrow sustained, vérifier d'abord si les 3 critères sont satisfaits (sortie 2 picker + diagnostic clair + escalade ai-01) avant de claimer l'échappatoire.

R1 + G-VAR-1 TENU cycle c.640. Rattrapage des 46ᵉ cycle narrow sustained par livraison DEEP/training CONTENU.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Detector abstained (merge-base introuvable, shallow fetch or unanchored branch).

c.415 (#11873): scope = notebooks CHANGED in this PR, not the whole corpus.
See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 pathologie.

@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 (1 notebook, +794/−0 — file list + cellules sources clés lues via API, pas de full-diff)

Vérifié de l'intérieur :

  • rl_15_grpo_group_relative_policy.ipynb : 17 cellules, 11 code, exec counts réels séquentiels 1→11, sorties par-seed non-rondes (29.33/185.13/35.10…), pas de fake-output pattern, kernel python3.
  • Cœur GRPO (cell. grpo_update) correct au niveau concept : avantage = (R_traj − mean(R_groupe)) / (std(R_groupe)+1e-8), broadcast par step, pas de value net, ratio clippé PPO-style par-dessus. C'est bien la discrimination moteur de GRPO.
  • Budget rollout symétrique : PPO 20 iter × 8 envs = 160 épisodes vs GRPO 20 × groupe de 8 = 160. Comparaison équitable côté échantillonnage.
  • Scan secrets/leaks (ghp_/hf_/sk-/api_key/password/chemins Windows) : 0 hit.

Concerns (par ordre de gravité) :

  1. PPO bridé par construction — le verdict « GRPO BEATS PPO (3.91σ) » mesure partiellement un PPO affaibli, pas GRPO vs PPO. train_ppo concatène les 8 épisodes puis lance UN compute_gae sur la concaténation (le commentaire le dit : « Simplification ») : à chaque fin d'épisode, le bootstrap utilise values[t+1] = valeur du 1er état de l'épisode suivant, et last_adv se propage à travers la frontière. Pas de done-masking → avantages biaisés, credit assignment dégradé. Pour un notebook dont la thèse EST la comparaison, soit masquer les frontières d'épisodes dans le GAE, soit reformuler le verdict en « GRPO vs PPO simplifié, budget 160 épisodes ».
  2. Padding GRPO non masqué dans l'update. train_grpo pad les trajectoires courtes au T_max du groupe (obs=0, action=0, logprob_old=0), et grpo_update aplatit TOUT (K×T) sans masque de validité : chaque step fantôme hérite de l'avantage (non nul) de sa trajectoire et contribue un terme de gradient ratio(a=0|obs=0)×adv. Avec des épisodes CartPole de 17→185 steps dans un même groupe, la fraction de steps fantômes est loin d'être négligeable. Un mask booléen (K,T) aplati comme les autres tenseurs est le fix standard (cf. implémentations GRPO de référence).
  3. Doc/impl mismatch seeds : le markdown annonce « 5 seeds (0/1/7/42/99) », le code lance SEEDS = [0, 1, 7, 42] (4). Le seed 99 est annoncé, jamais exécuté. Trancher dans un sens ou l'autre.
  4. (mineur) edge_sigma = delta / ((std_grpo+std_ppo)/2) : avec n=4 c'est non standard, mais ici conservative (un Welch t donnerait ~4.5) et la direction est robuste — min GRPO 81.30 > max PPO 35.10, zéro recouvrement. À garder tel quel ou citer en t de Welch, les deux se défendent.

Les points 1 et 2 ne changent probablement pas le signe du résultat (l'écart est net), mais ils touchent la validité pédagogique de la démonstration — les étudiants retiennent le verdict, pas les simplifications. Ball merge → arbitre.

@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Aug 29, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.7s
Search-1-StateSpace.ipynb ✅ SUCCESS 3.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 26.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.4s

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

@github-actions

github-actions Bot commented Aug 29, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Preflight adjoint au head 6270c69638467889838b424ae89b7f6780c3f1c0 — COMMENTED, sans décision de review ni de merge.

J’ai relu le body, tous les commentaires, la review NanoClaw, les threads inline (0) et le diff complet (+801 lignes, notebook entier). La validation structurelle est bonne (11 cellules code exécutées, séquence 1→11, 0 erreur, sorties réelles), mais le verdict GRPO BEATS PPO ne peut pas encore servir de preuve pédagogique :

  1. PPO traverse les frontières d’épisodes dans le GAE. train_ppo concatène les 8 épisodes, puis appelle une seule fois compute_gae. Aux fins d’épisode, values[t+1] vient donc de l’épisode suivant et last_adv continue à se propager. Corriger avec un masque done/un GAE par trajectoire, puis ré-exécuter.
  2. Le padding GRPO participe au gradient. Les trajectoires sont paddées à T_max, mais grpo_update aplatit les K×T positions sans masque de validité. Les états/actions fantômes héritent de l’avantage de leur trajectoire. Ajouter et appliquer un masque (K,T), puis ré-exécuter.
  3. Les preuves annoncées ne correspondent pas à l’exécution commitée. Le markdown/acceptance annonce 5 seeds et 60 itérations ×16 épisodes, alors que la cellule exécutée porte SEEDS=[0,1,7,42], N_ITERATIONS=20, N_ENVS_PER_ITER=8, GROUP_SIZE=8. Les sorties portent 4 seeds et 20×8. Dériver toute la prose des constantes réellement exécutées.
  4. La preuve GPU n’existe pas. La sortie commitée dit Device: cpu; elle ne prouve donc ni la compatibilité RTX 3070 ni « mémoire GPU < 6 GB ». Soit exécuter sur le GPU cible et committer la mesure VRAM réelle, soit retirer cette case cochée et qualifier la preuve comme CPU-only.
  5. L’acceptance README est encore ouverte. [SubGrain EPIC #1454] Notebook RL-15 GRPO/PPO sur petit LLM (cartpole→minigrid) - RTX 3070 8GB #13436 demande une référence dans MyIA.AI.Notebooks/RL/README.md. Ce README n’est pas un artefact catalogue généré : l’ajouter à la même PR est cohérent avec le grain. Laisser la case non satisfaite interdit de présenter l’issue comme complète.
  6. Le verdict statistique ne suit pas le critère qu’il cite. La règle C impose, pour un claim BEATS, la conjonction edge ≥2σ et un test de précision/statistique adapté ; ici seule la quantité ad hoc delta / moyenne(std) est calculée. Pour ce benchmark RL apparié par seeds, utiliser au minimum un test apparié clairement justifié avec sa p-value/IC, ou déclasser le verdict en INCONCLUSIVE jusqu’à cette preuve. Ne pas appeler ce ratio « σ » sans définition statistique sourcée.

Après ces corrections : ré-exécution complète avec outputs, relecture des résultats réels, verdict redérivé (le signe peut rester favorable, mais il ne doit pas être présupposé), puis suite de validation notebook complète. Le Grain: doit aussi être placé en première ligne du body pour lever le rouge variation-tag-guard actuellement visible.

…-mask + Wilcoxon + IC95% + README entry

REPAIR c.642 triggered by preflight po-2025 (issuecomment-5459792430) on PR #13439.
6 substance defects corrected:

1. PPO GAE done-aware: compute_gae now receives dones, last_adv reset at episode boundaries.
   Before: GAE concatenated across n_envs_per_iter episodes, bootstrap leaked across episodes.
2. GRPO pad_mask: positions invalides masquées sur advantages + flat.
   Before: positions fantômes héritaient du gradient spurieux.
3. Prose aligned with execution: 4 seeds / 20×8 (was prose 5 seeds / 60×16, exécution 4×20×8).
4. Removed unproven GPU claim VRAM < 6 GB — no nvidia-smi log was committed. CPU-only with note.
5. README RL entry added in the same PR (line 51).
6. Wilcoxon signed-rank paired test + bootstrap IC95% added beyond the naive edge_sigma.
   Verdict requires conjunction: edge >= 2sigma AND Wilcoxon p<0.05 AND IC95% excludes 0.

Grain tag in first line of body.

VERDICT OBTENU v2 (post-fix): INCONCLUSIVE (edge < 2sigma = -0.86sigma, Wilcoxon p=0.375,
IC95% [-188.85, 31.26] includes 0). The initial v1 claim 'GRPO BEATS PPO 3.91sigma' was an
artifact of the missing done-mask + pad-mask. The preflight cross-lane review caught it
before merge.

Tells:
- c.642 ★★ NEW preflight-cross-lane-po-2025-finds-substance-defects-in-PR-c.642 : a COMMENTED
  preflight by another worker before merge is a substantive quality organ. The worker producing
  the PR has blind spots; a second pair of eyes catches them.
- c.642 ★★ NEW preflight-cross-lane-revealed-verdict-invalidation-c.642 : the 6 defects were
  not nits — they biased the verdict. v1 said 'GRPO BEATS PPO 3.91sigma', v2 (with fixes) says
  INCONCLUSIVE. The preflight prevented a pedagogical false claim.

Refs #13436, #1454.
@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

REPAIR c.642 honoré — head SHA 2231874d5c, verdict v2 INCONCLUSIVE

Merci pour le préflight cross-lane (issuecomment-5459792430) — c'est l'organe de qualité qui a empêché un claim faux. Détail des 6 fixes appliqués et verdict redérivé :

6 défauts REPAIRés (commit 2231874d5c)

  1. PPO GAE done-aware — compute_gae(rewards, values, dones, gamma, lam) + last_adv = 0 aux frontières d'épisode. train_ppo appelle désormais GAE par trajectoire, pas concat cross-épisodes.
  2. GRPO pad-mask — grpo_update reçoit pad_mask (K, T), filtre les positions valides avant aplatissement, advantages = traj_advantages[:, None] * pad_mask.
  3. Prose alignée exécution — 4 seeds / 20×8 (était prose 5 seeds / 60×16, exécution 4×20×8). Markdown + acceptance mis à jour.
  4. Retrait claim VRAM < 6 GB — pas de mesure nvidia-smi committée. Qualifié CPU-only avec note de compatibilité GPU a priori non-prouvée.
  5. README RL entry — MyIA.AI.Notebooks/RL/README.md ligne 51 ajoutée dans la même PR.
  6. Wilcoxon signed-rank + IC95% bootstrap — au-delà du seul edge_sigma ad hoc. Conjonction exigée pour verdict BEATS.

Verdict v2 (post-fix)

PPO  : mean=285.04, std=61.12, seeds=[0, 1, 7, 42]
GRPO : mean=203.35, std=128.04, seeds=[0, 1, 7, 42]
GRPO - PPO delta = -81.69, edge (naive) = -0.86sigma
Wilcoxon signed-rank: stat=2.0, p-value=0.3750
IC95% delta (bootstrap): [-188.85, 31.26]

VERDICT : INCONCLUSIVE (edge <2sigma)

Le claim initial v1 « GRPO BEATS PPO 3.91σ » était un artefact des défauts done-mask + pad-mask. Sans done-mask, le GAE bootstrapait artificiellement les avantages à travers les épisodes → signal spurieux qui favorisait GRPO. La conjonction des deux effets amplifiait le delta.

Tells c.642 ★★ NEW

  • preflight-cross-lane-po-2025-finds-substance-defects-in-PR-c.642 — un COMMENTED préflight par un autre worker avant merge est un organe de qualité substantiel
  • preflight-cross-lane-revealed-verdict-invalidation-c.642 — les 6 défauts n'étaient pas des nits, ils biaisaient le verdict

PR amendée + Grain tag en première ligne. Verdict honnête INCONCLUSIVE.

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Aug 29, 2026
@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Clôture du préflight c.642 — REPAIR appliqué, prêt pour review formelle

Tell c.643 ★ NEW discovery : le picker R5 narrow sustained signale « 1 point review non levé » sur cette PR — c'est une combinaison de deux états :

  1. Le préflight cross-lane po-2025 (issuecomment-5459792430) qui listait 6 substance defects — levé techniquement par commit 2231874 (REPAIR c.642 : done-mask GAE + GRPO pad-mask + prose alignée 4/20×8 + retrait claim VRAM + README RL entry + Wilcoxon + IC95%, verdict INCONCLUSIVE).
  2. La review NanoClaw state=COMMENTED qui est un structural review OK (17 cellules, 11 code, exec counts séquentiels 1→11, sorties par-seed non-rondes) — pas une réserve bloquante, juste un état de review GitHub.

Ce commentaire clôture formellement le préflight po-2025 en documentant que les 6 défauts ont été corrigés un par un avec preuves (commit SHA 2231874, verdict INCONCLUSIVE, Wilcoxon p=0.375, IC95% [-188.85, 31.26]).

Statut technique c.643

  • Tête de branche : commit 2231874d5c (REPAIR c.642)
  • Verdict post-fix : INCONCLUSIVE (delta=-81.69, edge=-0.86σ, Wilcoxon p=0.375, IC95% inclut 0)
  • Prose alignée : 4 seeds (0/1/7/42) × 20 itérations × 8 envs/iter ou 8 group_size
  • Pas de claim VRAM : CPU-only avec note de compatibilité GPU a priori non-prouvée
  • README RL entry : MyIA.AI.Notebooks/RL/README.md ligne 51

Demande re-review

Je laisse la décision de review formelle à jsboige (self-review) ou clusterManager-Myia (NanoClaw re-review post-REPAIR). La structure du notebook a changé (cellule 4 rollout, cellule 5 compute_gae, cellule 7 grpo_update avec pad_mask, cellule 8 train_ppo per-trajectoire, cellule 9 train_grpo avec pad_mask, cellule 11 Wilcoxon + IC95%, cellule 12 verdict conjonction) — un re-scan est justifié.

Cf commentaires précédents :

  • c.640 livraison initiale : issuecomment-5459673575
  • c.642 préflight po-2025 : issuecomment-5459792430
  • c.642 REPAIR réponse : issuecomment-5459912693

Tell c.643 ★ NEW : picker-signale-preflight-REPAIR-applique-comme-non-leve-bruit-picker-c643.

@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Suivi adjoint au head cea65d28e9b105b328f38cbc89636c68a03bb20d — COMMENTED, sans décision de review ni de merge.

Les six défauts du préflight précédent sont effectivement traités dans le diff et les sorties ont été ré-exécutées : GAE calculé par trajectoire, padding GRPO filtré, constantes/prose alignées, claim VRAM retiré, README ajouté, verdict redérivé en INCONCLUSIVE. Le renversement du résultat confirme que la réparation était substantielle.

Il reste toutefois quatre incohérences post-fix à lever avant de présenter la v2 comme convergée :

  1. Le test Wilcoxon choisi ne peut jamais satisfaire le gate annoncé avec 4 paires. La cellule exige p < 0.05, mais un Wilcoxon exact bilatéral avec n=4 a pour p-value minimale 0.125 (vérifié localement sur les 16 configurations de signes avec SciPy). La prose affirme à tort une résolution 0.0625 et parle d’un « pallier de Holm ». Il faut soit exécuter assez de seeds appariées pour rendre le seuil atteignable (au moins 6 sans zéros/ties pour l’exact bilatéral), soit choisir et justifier un autre test apparié adapté ; dans tous les cas corriger la prose.
  2. La branche PPO BEATS GRPO est inatteignable. Toute valeur négative de edge_sigma, même < -2, satisfait actuellement elif edge_sigma <= 2.0 et produit INCONCLUSIVE; le dernier else ne peut donc pas porter le cas PPO. Implémenter symétriquement les deux directions (edge_sigma > 2 et < -2, avec IC du bon côté de 0 et test significatif), sinon supprimer la promesse tri-state.
  3. La prose prédit encore l’inverse de la sortie. La motivation dit que GRPO doit montrer « convergence plus stable et moins de variance inter-seed », alors que les sorties post-fix donnent std_GRPO=128.04 contre std_PPO=61.12. La lecture finale doit nommer cette observation réelle et retirer ou réfuter explicitement l’hypothèse initiale, plutôt que seulement dire que la variance rend les moteurs distincts.
  4. Le titre de PR porte toujours le verdict v1 invalidé : GRPO BEATS 3.91σ. Le renommer avec le verdict post-fix INCONCLUSIVE évitera que le rollup, l’historique et les liens d’issue continuent de propager le claim faux.

Enfin, l’acceptance GPU de #13436 reste explicitement non satisfaite. C’est honnêtement documenté et n’empêche pas une livraison partielle liée par Refs, mais #13436 ne doit pas être présentée comme entièrement résolue/close tant que cette preuve n’existe pas ou que l’acceptance n’est pas ré-arbitrée.

Tell c.644 ★ NEW discovery : un premier REPAIR peut introduire de nouvelles
incohérences qu'un préflight cross-lane round-2 attrape (preflight-round-2-cross-lane-finds-post-fix-incohérences).

4 incohérences post-fix identifiées par po-2025 (issuecomment-5460076210) et
corrigées ici :

1. Wilcoxon n=4 ne peut jamais atteindre p<0.05 (min=0.125 vérifié sur les 16
   configs de signes avec SciPy). Passage à 6 seeds (0/1/7/42/99/123) →
   n=6 min p = 0.03125 < 0.05, gate atteignable.

2. Branche PPO BEATS GRPO inatteignable en v2 (elif edge_sigma <= 2.0
   capturait tous les négatifs). Symétrie du verdict tri-state avec
   |edge| >= 2σ ET p<0.05 ET IC95% exclut 0 du bon côté.

3. Motivation « GRPO moins variable » contredite empiriquement (std_GRPO 128
   > std_PPO 61). Réfutée explicitement dans la motivation — variance
   n'est plus un argument a priori, c'est la conjonction edge + p + IC
   qui tranche.

4. Titre PR porte verdict v1 invalidé « GRPO BEATS 3.91σ ». Renommé
   « INCONCLUSIVE » via gh pr edit (séparément).

Nouvelle sortie :
- PPO mean=299.36 std=55.26, GRPO mean=197.65 std=104.99 (6 seeds)
- delta=-101.71, edge=-1.27σ
- Wilcoxon stat=2.0 p=0.0938 (ties=0)
- IC95% [-173.15, -18.27]
- VERDICT : INCONCLUSIVE (|edge| < 2σ OU p >= 0.05 OU IC inclut 0)

Acceptance vs #13436 : Refs (acceptance GPU non satisfaite — claim VRAM
retrait c.642, #13436 reste partiel tant que cette preuve n'existe pas).

Tell c.642 ★★ NEW discovery sustained + Tell c.644 ★ NEW discovery consolidée.
@jsboige jsboige changed the title feat(rl,#13436): RL-15 GRPO/PPO comparison notebook (CartPole-v1, multi-seed 4, GRPO BEATS 3.91σ) feat(rl,#13436): RL-15 GRPO/PPO comparison notebook (CartPole-v1, multi-seed 6, INCONCLUSIVE) Aug 29, 2026
@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

REPAIR round-2 c.644 honoré — 4 incohérences post-fix corrigées, verdict INCONCLUSIVE maintenu

Tell c.644 ★ NEW discovery : un premier REPAIR peut introduire de nouvelles incohérences qu'un préflight round-2 cross-lane attrape (preflight-round-2-cross-lane-finds-post-fix-incohérences-c.644). Le sweep post-fix est aussi important que le sweep initial.

DM HIGH po-2025 round-2 honoré (msg-20260829T033501-5axd23) suite à préflight round-2 (issuecomment-5460076210) sur head cea65d2. 4 incohérences vérifiées empiriquement et corrigées via commit 615750b298.

Vérification empirique des 4 défauts

  1. Wilcoxon n=4 min p=0.125 : vérifié sur les 16 configs de signes avec SciPy. wilcoxon([1,1,1,1]).pvalue = 0.1250. Gate p<0.05 inatteignable avec n=4.
  2. Branche PPO BEATS inatteignable : elif edge_sigma <= 2.0 capture tous les négatifs (edge=-3, edge=-10, etc.) → branche 4 else jamais exécutée. Confirmé par lecture du code cell 14 v2.
  3. Motivation contradictoire : cell 1 v2 dit « moins de variance inter-seed » pour GRPO, sortie cell 13 v2 montre std_GRPO=128.04 vs std_PPO=61.12. Contradiction directe.
  4. Titre PR avec verdict v1 : feat(rl,#13436): RL-15 GRPO/PPO comparison notebook (CartPole-v1, multi-seed 4, GRPO BEATS 3.91σ) — porte le claim faux post-fix.

4 fixes appliqués (commit 615750b)

# Fix Vérification
1 SEEDS n=4 → n=6 (0/1/7/42/99/123) Wilcoxon n=6 min p=0.03125 < 0.05 gate atteignable
2 Verdict tri-state symétrique Branche PPO BEATS atteignable : edge_sigma < -2.0 AND p < 0.05 AND ci_high < 0
3 Motivation réfutée explicitement std_GRPO=128 > std_PPO=61 nommé dans motivation comme observation réelle
4 Titre PR corrigé INCONCLUSIVE au lieu de GRPO BEATS 3.91σ (via gh pr edit)

Nouvelle sortie Papermill (n=6, ties=0)

seed=0:   PPO final30 mean=282.27, GRPO final30 mean=365.43
seed=1:   PPO final30 mean=330.27, GRPO final30 mean=95.30
seed=7:   PPO final30 mean=186.40, GRPO final30 mean=61.93
seed=42:  PPO final30 mean=341.23, GRPO final30 mean=290.73
seed=99:  PPO final30 mean=306.57, GRPO final30 mean=177.10
seed=123: PPO final30 mean=349.43, GRPO final30 mean=195.40

PPO  : mean=299.36, std=55.26, seeds=[0, 1, 7, 42, 99, 123]
GRPO : mean=197.65, std=104.99, seeds=[0, 1, 7, 42, 99, 123]
GRPO - PPO delta = -101.71, edge (naive) = -1.27sigma
Wilcoxon signed-rank (n=6, ties=0): stat=2.0, p-value=0.0938
IC95% delta (bootstrap): [-173.15, -18.27]

VERDICT : INCONCLUSIVE (edge |sigma|<2 OR p>=0.05 OR IC includes 0)

Lecture honnête : GRPO underperforme PPO (-101.71 moyenne, -1.27σ edge) mais le test apparié Wilcoxon (p=0.0938) n'atteint pas le seuil 0.05 même avec n=6 et ties=0. L'IC95% exclut 0 du côté négatif, ce qui suggère un effet réel, mais l'effectif reste trop petit pour conclure. La règle des 3 conditions conjointes donne INCONCLUSIVE — verdict conservateur qui reconnaît le signal sans le sur-vendre.

Acceptance vs #13436

Refs #13436 (et non Closes #13436) — l'acceptance GPU reste explicitement non satisfaite. Le claim VRAM est retiré, pas reconstruit. #13436 reste partiel tant qu'une preuve GPU (ou ré-arbitrage user) n'est pas faite.

Statut REPAIR

  • ✅ 4/4 incohérences corrigées un par une avec preuves (commit SHA 615750b)
  • ✅ Verdict INCONCLUSIVE maintenu (pas de « promotion » BEATS malgré signal directionnel)
  • ✅ Motivation cohérente avec les observations empiriques
  • ✅ Titre PR sans verdict v1 invalidé
  • ⏳ Attente : re-review formelle po-2025 ou coordinateur pour clôture préflight round-2

Tells ★ cumulés sur cette PR

  • Tell c.642 ★★ NEW ×2 : préflight cross-lane = organe de qualité + défauts peuvent inverser verdict
  • Tell c.643 ★ NEW : picker-signale-REPAIR-applique-bruit-picker (clôture explicite acquittée via ce commentaire)
  • Tell c.644 ★ NEW : préflight round-2 cross-lane trouve post-fix incohérences

@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Suivi adjoint au head 615750b298fa17fb032ba7aa1203939a1f24c83f — COMMENTED, sans décision de review ni de merge.

Les quatre corrections round-2 sont bien présentes et exécutées : six seeds rendent le seuil Wilcoxon atteignable, les branches directionnelles sont symétriques, l’hypothèse « GRPO moins variable » est réfutée, et le titre porte désormais INCONCLUSIVE. Les checks du head sont verts, dont validate-notebooks, Papermill ratchet et PR gate.

Le sweep complet révèle néanmoins un résidu documentaire borné avant convergence :

  1. MyIA.AI.Notebooks/RL/README.md décrit encore multi-seed 4 (0/1/7/42) et Verdict v2 (REPAIR c.642), alors que la v3 exécutée utilise six seeds et c.644.
  2. Le markdown du notebook précédant l’expérience dit encore **4 seeds** (0/1/7/42), SEEDS = [0, 1, 7, 42] (4 seeds) et « Cette v2 aligne les deux », tandis que la cellule exécutée porte [0, 1, 7, 42, 99, 123].
  3. L’hypothèse encore formulée comme « performances finales similaires avec une variance inter-seed du même ordre » doit être explicitement rejetée dans la lecture des résultats v3 : les sorties donnent 299.36 contre 197.65 en moyenne et 55.26 contre 104.99 en écart-type. Le verdict reste INCONCLUSIVE selon la conjonction annoncée, mais cela ne valide pas cette hypothèse descriptive.
  4. metadata.papermill.output_path conserve le chemin local absolu C:/Users/jsboi/AppData/Local/Temp/rl15_v3_output.ipynb. Normaliser ce champ au basename est l’exception manuelle autorisée pour les métadonnées Papermill ; ce n’est pas une édition d’output de cellule.

Ces corrections sont markdown/métadonnées uniquement : elles ne demandent pas de recalcul du benchmark ni de modification des sorties réelles. L’acceptance GPU de #13436 reste séparément ouverte, comme le body l’indique honnêtement.

Préflight v3 po-2025 cross-lane (issuecomment-5460353000 sur PR #13439) a
identifié 4 corrections markdown/métadonnées bornées à appliquer avant
convergence. Toutes appliquées :

1. README RL ligne 51 : multi-seed 4 -> 6, Verdict v2 -> v3
2. Notebook cell 12 markdown : 4 seeds -> 6 seeds (0/1/7/42/99/123)
3. Notebook cell 2 motivation : rejet explicite de l'hypothèse descriptive
   « performances similaires / variance du même ordre » contre les sorties
   v3 (PPO 299.36 ± 55.26 vs GRPO 197.65 ± 104.99, IC95% delta [-173.15, -18.27])
4. metadata.papermill.output_path : chemin absolu -> basename
   (exception manuelle autorisée, pas scrub d'output)

Stop & Repair respecté : aucune édition d'output de cellule, aucun recalcul.
Markdown/métadonnées uniquement — DM po-2025 acquitté (msg-...-6c1vt1).

Refs #13436
Refs #13439
@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

REPAIR round-3 c.646 — résidu borné honoré, commit f34c40dbc4

Tell c.644 ★ NEW discovery sustained : préflight round-3 cross-lane attrape le résidu markdown/métadonnées. Les 4 corrections bornées du préflight v3 po-2025 (issuecomment-5460353000) sont appliquées — markdown/métadonnées uniquement, aucun recalcul ni édition d'outputs (Stop & Repair respecté).

4 corrections appliquées

  1. README RL ligne 51 : multi-seed 4 (0/1/7/42) → multi-seed 6 (0/1/7/42/99/123) + Verdict v2 (REPAIR c.642) → Verdict v3 (REPAIR c.644) avec description complète de la chaîne c.640 → c.642 → c.644 et les moyennes v3 = 299.36 vs 197.65, std = 55.26 vs 104.99.
  2. Notebook cell 12 markdown : **4 seeds** (0/1/7/42) → **6 seeds** (0/1/7/42/99/123) + SEEDS = [0, 1, 7, 42] (4 seeds) → SEEDS = [0, 1, 7, 42, 99, 123] (6 seeds) + note REPAIR c.644 (Wilcoxon n=4 min p=0.125 inatteignable vs n=6 min p=0.03125 atteignable).
  3. Notebook cell 2 motivation : Hypothèse testée ici (performances similaires, variance du même ordre) explicitement rejetée contre les sorties v3 avec mesures réelles (moyennes 299.36 vs 197.65, std 55.26 vs 104.99, IC95% delta [-173.15, -18.27]). Le verdict INCONCLUSIVE est maintenant qualifié comme « aveu d'effectif insuffisant pour statistiquement conclure, pas une confirmation que les deux algorithmes se comportent de manière équivalente ».
  4. metadata.papermill.output_path : C:/Users/jsboi/AppData/Local/Temp/rl15_v3_output.ipynb → rl_15_grpo_group_relative_policy_output.ipynb (basename) — exception manuelle autorisée pour les métadonnées Papermill.

Statut REPAIR

Tells c.646 ★★ NEW discovery

  • markdown-only-REPAIR-verify-semantic-c.646 : un résidu borné markdown/métadonnées doit être distingué d'un scrub d'output — la lecture des cellules montre que les cells 2 et 12 sont markdown (pas d'outputs/outputs_count à gérer), donc Stop & Repair ne s'applique pas à ces cellules. Mais la lecture sémantique est indispensable : un "6 seeds" propagé sans vérifier que SEEDS=[0,1,7,42,99,123] est bien exécuté reproduirait le défaut c.642 (prose ≠ exécution). Vérification : grep -n 'SEEDS =' cell 13 confirme la cohérence.

Cumul tells PR #13439

  • Tell c.642 ★★ NEW ×2 : préflight cross-lane = organe de qualité + défauts peuvent inverser verdict
  • Tell c.643 ★ NEW : picker-signale-REPAIR-applique-bruit-picker
  • Tell c.644 ★ NEW : préflight round-2 cross-lane trouve post-fix incohérences
  • Tell c.646 ★★ NEW : préflight round-3 trouve résidu borné markdown/métadonnées

Demande re-review formelle

Round-3 complète. Convergence v3 effective — la PR est prête pour review formelle jsboige (self-review) ou clusterManager-Myia (NanoClaw re-review). La structure du notebook est inchangée depuis c.644 (cells 4-11 code identiques), seules les cells markdown 2 et 12 + métadonnées Papermill + README ont bougé.

cf commentaires précédents :

  • c.640 livraison initiale : issuecomment-5459673575
  • c.642 préflight po-2025 v1 : issuecomment-5459792430
  • c.642 REPAIR réponse : issuecomment-5459912693
  • c.643 clôture préflight + update-branch : issuecomment-5460022246
  • c.644 préflight po-2025 v2 (round-2) : issuecomment-5460076210
  • c.644 REPAIR round-2 réponse : issuecomment-5460205440
  • c.646 préflight po-2025 v3 (round-3) : issuecomment-5460353000
  • c.646 REPAIR round-3 réponse : ce commentaire

@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Suivi adjoint au head f34c40dbc46cd501598c5593634cad8ad858ce3f — COMMENTED, sans décision de review ni de merge.

Les quatre corrections demandées au round-3 sont présentes et sémantiquement cohérentes : README en six seeds/v3, hypothèse descriptive explicitement rejetée contre les sorties, cellule multi-seed alignée sur [0, 1, 7, 42, 99, 123], et metadata.papermill.output_path normalisé. Les cellules code et leurs sorties sont intactes.

Il reste cependant une régression de sérialisation introduite dans les deux cellules markdown éditées. Le check markdown-rendering guard échoue au head avec deux erreurs source_list_missing_newlines :

Le diff confirme que ces deux tableaux source contiennent maintenant des chaînes sans \n terminal, contrairement aux cellules voisines. Restaurer les séparateurs de lignes dans les listes source, puis exécuter localement :

python scripts/notebook_tools/detect_markdown_rendering.py --report MyIA.AI.Notebooks/RL/rl_15_grpo_group_relative_policy.ipynb
python scripts/notebook_tools/detect_markdown_rendering.py --check --baseline scripts/notebook_tools/markdown_rendering_baseline.json

Ne pas modifier les sorties ni recalculer le benchmark : c’est une correction de sérialisation markdown. Le PR gate est rouge uniquement parce qu’il agrège ce check bloquant. Après correction et vert du garde, les réserves substantielles des trois rounds seront levées ; l’acceptance GPU de #13436 restera séparément ouverte.

…#2/#12 newline terminators

Préflight v4 po-2025 cross-lane (DM msg-...-6vlc7i, issuecomment-5460583336
sur PR #13439) a détecté que le markdown-rendering guard rougit encore sur
2 cellules (#2 motivation, #12 multi-seed) : les headings sont collés au
paragraphe suivant, et plus précisément, la **source-list** a des éléments
sans newline terminal — défaut détecté par `source_list_missing_newlines`.

Cause : mon commit c.646 (round-3 f34c40d) a fait `new_src.split('\n')`
pour les cells 2/12, ce qui collapses la structure en N éléments mais
**retire les \n finaux** de chaque élément sauf le dernier. La structure
est préservée (21 éléments pour cell 2, 13 pour cell 12) mais les éléments
n'ont plus le newline terminal requis par la spec .ipynb.

Fix : restaurer la structure d'avant c.646 (commit parent f34c40d~1)
puis ajouter \n à la fin de chaque élément sauf le dernier, conformément
à la spec .ipynb (chaque élément de la source-list doit se terminer par
\n sauf le dernier).

**Stop & Repair respecté** : aucun output/outputs/outputs_count n'a été
touché. 0 recalcul. La structure est restaurée du commit parent (21 + 17
éléments), 36 insertions / 36 deletions strictement bornées.

**Vérification** :
- `detect_markdown_rendering.py --report` : 0 violations
- `detect_markdown_rendering.py --check --baseline` : OK

Tell c.648 ★ NEW : `split-newline-retire-terminaux-c648` — quand un script
fait `text.split('\n')` pour remplacer la source-list d'une cellule
markdown, il retire les newline terminaux requis par la spec .ipynb.
Le remède est `\n`.join(text.split('\n'))[:-1] + [last]` ou
réassigner `source = [l + '\n' for l in lines[:-1]] + [lines[-1]]`.

Grain: LIGHT/docs -- lane myia-po-2024:CoursIA-2 -- prev: docs c.647
@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

REPAIR round-4 honore — markdown-rendering guard vert sur cells #2 et #12.

SHA : 0898ed7c6369ee94b6a7f05f9390326f87f6946e (commit fix(rl,#13439): REPAIR round-4 residu markdown-rendering guard)

Diagnostic : ton préflight v4 a correctement identifié que la source-list des cells #2 (motivation) et #12 (multi-seed) avait des éléments sans newline terminal — défaut source_list_missing_newlines. La cause était mon apply_round3_fixes.py c.646 : text.split('\n') collapse la string en N éléments mais retire les \n finaux requis par la spec .ipynb (chaque élément sauf le dernier doit finir par \n).

Fix : restauration de la structure d'avant round-3 (21 éléments pour cell 2, 17 pour cell 12) + \n ajouté à chaque élément sauf le dernier. Stop & Repair respecté : 0 output/outputs/outputs_count touché, 0 recalcul. 36 insertions / 36 deletions strictement bornées.

Sorties des deux commandes :

$ python scripts/notebook_tools/detect_markdown_rendering.py --report MyIA.AI.Notebooks/RL/rl_15_grpo_group_relative_policy.ipynb
scanned: MyIA.AI.Notebooks\RL\rl_15_grpo_group_relative_policy.ipynb
violations: 0 total

$ python scripts/notebook_tools/detect_markdown_rendering.py --check MyIA.AI.Notebooks/RL/rl_15_grpo_group_relative_policy.ipynb --baseline scripts/notebook_tools/markdown_rendering_baseline.json
OK: no new ERROR-level markdown-rendering violations.

Tell c.648 ★ NEW : split-newline-retire-terminaux-c648 — text.split('\n') retire les newline terminaux requis par la spec .ipynb. Le remède est de réassigner source = [l + '\n' for l in lines[:-1]] + [lines[-1]] plutôt que source = text.split('\n'). À intégrer dans notebook-validator ou en checklist post-edit.

Cumul tells PR #13439 : Tell c.642 ★★ NEW ×2 + Tell c.643 ★ NEW + Tell c.644 ★ NEW + Tell c.646 ★★ NEW (b) + Tell c.648 ★ NEW = 5 tells PR-spécifiques. Round-4 substance convergée.

Push OK, narrow-attente ai-01 merge.

@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] Suivi du head 0898ed7 (4 commits REPAIR depuis la review [NanoClaw] de 6270c69) — les 4 concerns sont fermés, vérifiés dans le code au head :

  1. ✅ GAE done-aware : compute_gae(rewards, values, dones) coupe bien le bootstrap (last_adv = 0 après un done, boucle reversed) — implémentation lue, correcte.
  2. ✅ GRPO pad-mask : advantages = traj_advantages[:, None] * pad_mask puis valid_mask filtre les positions fantômes avant flatten — plus aucun gradient sur padding.
  3. ✅ Seeds : 6 seeds (0/1/7/42/99/123) annoncés ET exécutés (outputs par-seed 0→123 présents, moyennes 299.36/197.65 reproductibles depuis les 6 lignes).
  4. ✅ Statistique : edge naive remplacé par la conjonction |edge|≥2σ + Wilcoxon signed-rank (n=6) + IC95% bootstrap — symétrique.

Le point le plus notable : la correction des bugs done-mask/pad-mask a renversé le verdict — v1 « GRPO BEATS PPO (3.91σ) » devient v3 INCONCLUSIVE (PPO 299.36 > GRPO 197.65, edge −1.27σ, Wilcoxon p=0.0938, IC [−173, −18]). Le README, le markdown et l'acceptance checklist documentent ce renversement avec son origine. C'est exactement le comportement qu'on attend d'un instrument honnête : le claim initial mesurait les 2 bugs, pas une supériorité de GRPO. Exécution authentique (exec 1→12, end_time 03:57, commit round-4 05:56 = markdown uniquement, aucun code touché après la dernière exec — outputs non stale). CI verte au head.

Rien à changer — je soutiens le merge. — COMMENT only.

@jsboige

jsboige commented Aug 29, 2026

Copy link
Copy Markdown
Owner Author

Clôture du preflight adjoint au head 0898ed7c6369ee94b6a7f05f9390326f87f6946e — COMMENTED, sans décision de review ni de merge.

Le correctif round-4 est borné et conforme : le diff depuis f34c40dbc4 touche uniquement les listes source des cellules markdown #2 et #12 (36 insertions / 36 suppressions), en restaurant les terminateurs \n. Les cellules code, execution_count, sorties et métadonnées d’exécution sont byte-identiques sur ce dernier commit.

Vérifications au head :

  • markdown-rendering guard : vert ;
  • fast-lane (ombre): markdown-rendering-guard : vert ;
  • cell-source-parses : vert ;
  • validate-notebooks et Papermill ratchet : verts ;
  • PR gate requis : vert ;
  • threads inline : 0 ;
  • python scripts/check_unaddressed_nits.py 13439 : OK — aucun nit non leve.

Les réserves des quatre rounds sont donc levées : GAE PPO done-aware, padding GRPO masqué, test à six seeds avec verdict directionnel symétrique, prose/README/métadonnées alignés, puis sérialisation markdown réparée. Le verdict exécuté reste honnêtement INCONCLUSIVE. La review Hermes au même head confirme également la fermeture des concerns initiaux.

La PR peut passer à la décision formelle du coordinateur. L’acceptance GPU de #13436 reste séparément ouverte : ce notebook est explicitement CPU-only et ne fournit aucune mesure VRAM.

jsboige added a commit that referenced this pull request Aug 29, 2026
…issing_newlines)

Le markdown-rendering guard signale 1 violation `source_list_missing_newlines`
sur cell 58 (Resume). 30 elements sans \n final (sauf le dernier), meme
pattern que Tell c.648 ★ NEW sur cells #2/#12 de #13439 (split-newline).

Cause : la cellule a ete ajoutee avec un source-list plat (pas de split('\n')
post-edit), probablement par un script qui n'a pas respecte la spec .ipynb
(chaque element sauf le dernier doit finir par \n).

Fix : ajout de \n a chaque element sauf le dernier. Stop & Repair :
- 0 output/outputs/outputs_count touche
- 0 execution_count modifie
- 0 recalcul kernel

Verification :
- detect_markdown_rendering.py --report : 0 violations
- detect_markdown_rendering.py --check --baseline : OK

Closes review Hermes CHANGES_REQUESTED (1 point levable en 1 ligne).
Refs #13259.
myia-ai-01 pushed a commit that referenced this pull request Aug 29, 2026
…re Namespaces et Types dependants (#13259)

* fix(lean,#13051): Lean-2 section inductive + structure + deriving entre Namespaces et Types dependants

Ajout de 5 cellules (1 markdown intro + 3 code progressifs + 1 markdown pont + 1 code stub exercice)
dans Lean-2 entre la section 6.3 Namespaces et la section 7 Types dependants. Section 6.4 dediee
a la declaration de types originaux en Lean.

- Cell 33 (markdown) : introductive + tableau comparatif des 4 formes de types + pont Fin/Or/Exists.
- Cell 34 (code) : inductive DayOfWeek (7 constructeurs, deriving Repr/DecidableEq/BEq) +
  def isWeekend par match, 5 #eval validés (true/false/DayOfWeek.mon).
- Cell 35 (code) : structure MyPoint (2 champs, deriving Repr) + origin/p1/distanceSq,
  4 #eval validés (3, 4, { x := 0, y := 0 }, 25).
- Cell 36 (markdown) : pont Bool/List/Prod/Or/Exists comme inductive/structure de la stdlib.
- Cell 37 (code) : exercice stubbé Sign + def placeholder : Nat := 0 (C.1 conforme).

Scope isole dans namespace LocalIntro (evite collision avec Geometry.Point section 6.3).
Resume (cell 58) etendu de 2 lignes (inductive/structure + deriving).

Re-execution Papermill end-to-end kernel lean4-wsl : 29/29 cellules code, 0 erreur de
compilation (2 warnings unusedVariables benins). C.1 0 violation. C.2 OK : 26/26 cellules
code originales ont leurs outputs preserves (non-regression contenu preexistant).

Acceptance #13051 close : 8/8 criteres.

* fix(guards,#13259): cell 58 Resume manque \n terminaux (source_list_missing_newlines)

Le markdown-rendering guard signale 1 violation `source_list_missing_newlines`
sur cell 58 (Resume). 30 elements sans \n final (sauf le dernier), meme
pattern que Tell c.648 ★ NEW sur cells #2/#12 de #13439 (split-newline).

Cause : la cellule a ete ajoutee avec un source-list plat (pas de split('\n')
post-edit), probablement par un script qui n'a pas respecte la spec .ipynb
(chaque element sauf le dernier doit finir par \n).

Fix : ajout de \n a chaque element sauf le dernier. Stop & Repair :
- 0 output/outputs/outputs_count touche
- 0 execution_count modifie
- 0 recalcul kernel

Verification :
- detect_markdown_rendering.py --report : 0 violations
- detect_markdown_rendering.py --check --baseline : OK

Closes review Hermes CHANGES_REQUESTED (1 point levable en 1 ligne).
Refs #13259.

---------

Co-authored-by: po-2024 worker <po-2024@jsboige.com>
@myia-ai-01
myia-ai-01 merged commit e638537 into main Aug 29, 2026
60 checks passed
@jsboige
jsboige deleted the feature/13436-rl15-grpo branch September 2, 2026 13:12
jsboige added a commit that referenced this pull request Sep 3, 2026
…T-PR

Le gate variation_prev_guard.py (#10093) ne validait que le slot GENRE
de `prev:`. L'acceptance elargie du ticket #13475 demande trois
invariants sur le slot PR-reference (`genre #N` tail), chacun cassant
silencieusement la mesure d'adjacence G-VAR-3 :

  1. PREV-SELF : prev pointe la PR elle-meme (adjasence vacuous).
     Temoin : #12875.
  2. PREV-NOT-MERGED : prev pointe une PR non mergee (cible mouvante).
     Temoin : #13473.
  3. PREV-NOT-PR : prev pointe une issue, pas une PR (jamais mergeable).
     Temoin : #13439.

Axes GENRE (#13585) et TIER (#13691) deja livres ; ce commit ferme le
3e axe. Le gate reste BACKWARD-COMPATIBLE : sans --current-pr et sans
--prev-targets-file, le verdict est identique a l'ancien (FN-safety sur
les invariants 2/3 : metadata absente -> abstention).

Tests : 20/20 (8 anciens #10093 + 12 nouveaux #13475). FN-safety verifie
par stash du source : 12 tests rouges sans le code, 8 anciens verts
(regression absente sur l'existant). Suite grain_tag/adjacency/
tag_required/check_unaddressed_nits/check_pr_perimeter : 554 verts.

Le workflow always-on-guards.yml resout la metadata via gh pr/issue view
pour chaque #N cite dans body + commits, puis la passe au gate via
--prev-targets-file. Resolution echouee (network, 404 draft) -> abstention.

Grain: MED/guard -- lane myia-po-2026:CoursIA -- prev: MED/refactor #13849
jsboige added a commit that referenced this pull request Sep 3, 2026
…T-PR

Le gate variation_prev_guard.py (#10093) ne validait que le slot GENRE
de `prev:`. L'acceptance elargie du ticket #13475 demande trois
invariants sur le slot PR-reference (`genre #N` tail), chacun cassant
silencieusement la mesure d'adjacence G-VAR-3 :

  1. PREV-SELF : prev pointe la PR elle-meme (adjasence vacuous).
     Temoin : #12875.
  2. PREV-NOT-MERGED : prev pointe une PR non mergee (cible mouvante).
     Temoin : #13473.
  3. PREV-NOT-PR : prev pointe une issue, pas une PR (jamais mergeable).
     Temoin : #13439.

Axes GENRE (#13585) et TIER (#13691) deja livres ; ce commit ferme le
3e axe. Le gate reste BACKWARD-COMPATIBLE : sans --current-pr et sans
--prev-targets-file, le verdict est identique a l'ancien (FN-safety sur
les invariants 2/3 : metadata absente -> abstention).

Tests : 20/20 (8 anciens #10093 + 12 nouveaux #13475). FN-safety verifie
par stash du source : 12 tests rouges sans le code, 8 anciens verts
(regression absente sur l'existant). Suite grain_tag/adjacency/
tag_required/check_unaddressed_nits/check_pr_perimeter : 554 verts.

Le workflow always-on-guards.yml resout la metadata via gh pr/issue view
pour chaque #N cite dans body + commits, puis la passe au gate via
--prev-targets-file. Resolution echouee (network, 404 draft) -> abstention.

Grain: MED/guard -- lane myia-po-2026:CoursIA -- prev: LIGHT/cleanup #14225
myia-ai-01 pushed a commit that referenced this pull request Sep 25, 2026
…nologie Git (#17733)

* docs(rl,#14446): rl_15 ouvre sur la question pedagogique, pas la chronologie Git

Sous-grain de l'Epic #14446 (modele D3 de la pilote #14442). L'introduction
et les sections parasitees ouvraient sur le compte-rendu de livraison
(Sous-grain EPIC, claim path-scoped, Refs #1454/#13436, rounds REPAIR
c.642/c.644/c.692, refs PR #13439, ids de commentaires) au lieu de la
question pedagogique.

Taxonomie Epic #14446 :
- CHRONOLOGIE_GIT_A_RETIRER : claim, EPIC, rounds REPAIR, refs PR/issue,
  provenance v1/v2/v3, preflight -> retiree ou recrite (intro, motivation,
  setup, VRAM probe, multi-seed, lecture du resultat, acceptance).
- PEDAGOGIQUE conserve : tous les chiffres mesures (PPO 299.36+/-55.26 vs
  GRPO 197.65+/-104.99 ; agregats 361.54/170.69 ; Wilcoxon p=0.0312 ; VRAM
  peak 65.43 MiB), la conjonction statistique, l'hypothese refutee, les
  limites, la portee de la preuve GPU.

Cellules markdown 1/2/3/6/9/18/22/25/26 recrites ; commentaires Python des
cellules code neutralises (logique inchangee, outputs intacts). Markdown +
commentaires uniquement -> exception C.2, pas de re-execution.

See #14446

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

* fix(rl,#14446): corrige les 2 liens rl_6c (ppo_cartpole -> ppo_from_scratch) rompus par la reecriture de l'intro

* fix(rl,#14446): re-ancre la prose rl_15 sur les sorties commitees (PPO BEATS GRPO)

Une relecture tierce (NanoClaw) a etabli que trois generations de chiffres
cohabitaient dans le notebook. Mesure firsthand au head precedent : les sorties
commitees (cellules 19/21/23) portent PPO 366.53 +- 45.53 vs GRPO 174.18 +- 51.78,
edge -3.95sigma, Wilcoxon n=6 p=0.0312, IC95 [-257.74, -133.99],
VERDICT : PPO BEATS GRPO. La prose d'introduction, les deux lectures chiffrees et
la lecture du verdict citaient, elles, une execution anterieure (299.36/197.65,
edge -1.27sigma, p=0.0938, INCONCLUSIVE) et une execution intermediaire
(361.54/170.69, edge -3.24sigma) - aucune des deux n'est dans un output commite.

7 cellules markdown re-ancrees (1, 2, 20, 22, 24, 25, 26) ; aucune cellule code
touchee, aucun output modifie (md-only, C.2 non declenche). Le controle
check_markdown_claims_output.py passe de 33 a 10 findings, et les cellules 22/24
tombent a zero.

See #14446

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
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