Skip to content

Fix(search,#23384): App-7-Wordle -- convergence kernel 3.13 et graines reproductibles - #23445

Merged
jsboige merged 5 commits into
mainfrom
feature/23384-app7-wordle-canon
Oct 31, 2026
Merged

jsboige merged 5 commits into
mainfrom
feature/23384-app7-wordle-canon

Conversation

@myia-po-2023

@myia-po-2023 myia-po-2023 commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #22464

Tranche Search/Part3-Cas-pratiques du census #23384 : convergence de App-7-Wordle au canon kernel python3 3.13, ré-exécution réelle, graines reproductibles (défaut de stochasticité réparé à la cause), prose quantitative re-dérivée par script depuis les sorties du run courant.

Mesures

  • 63/63 cellules exécutées, 0 erreur (63 cellules, dont 21 de code).
  • language_info.version : 3.11.9 → 3.13.3 (kernel python3 du siège, C:\Python313\python.exe).
  • Sources modifiées : 3 cellules de code (2 sites de graine + 1 import) ; 8 cellules de markdown re-dérivées (15 remplacements), chaque valeur recalculée depuis les sorties du run courant — aucune valeur ré-épinglée à la main.
  • Benchmark mesuré sur 100 parties (code[47]) : filtrage simple 3,19 tentatives (pire cas 6), CSP 3,23 (pire cas 6), entropie 2,86 (pire cas 5) — 100 % de réussite pour les trois.
  • Trace du filtrage simple (code[17]) : premier tirage 297 → 5 candidats (meilleur) à 297 → 48 (pire) ; les 5 mots de test sont gagnés en 3 à 5 tentatives (moyenne 3,6).

Défaut de reproductibilité réparé (cause racine)

Les graines par mot étaient dérivées de hash(word). Le salt de PYTHONHASHSEED rend hash() non reproductible d'un processus à l'autre : deux exécutions du même carnet donnaient donc des sorties différentes. Le random.seed(42) global ne protégeait que les tirages globaux, pas les graines par mot.

Correction : random.seed(zlib.crc32(word.encode()) % 2**31) (3 cellules de code). Vérifié par deux exécutions dans deux processus distincts (PYTHONHASHSEED=12345) : valeurs structurelles identiques (moyennes 3,19 / 3,23 / 2,86 ; pire cas 6 / 6 / 5 ; 100 % de réussite). Seuls le découpage du flux stdout et les durées machine-dépendantes diffèrent — d'où le pin de durée drainé en prose, pas ré-épinglé.

Diagnostic dérive

Cause (a) — environnement / kernel : le carnet était épinglé sur un kernel python3 3.11.9, hors canon global #19181 (3.13). Cause réparée : la convergence 3.11.9 → 3.13.3 est le correctif.

Cause (e) — stochasticité non reproductible : les sorties n'étaient pas reproductibles d'une exécution à l'autre (hash() salé par PYTHONHASHSEED). Cause réparée à la racine : les graines par mot passent en crc32, stable entre processus (démonstration à deux processus ci-dessus).

Verdict : CAUSE_FIXED pour les deux causes. Aucun CAUSE_DOCUMENTED_ONLY résiduel : le seul pin de durée machine-dépendant en prose a été drainé (retiré et non remplacé — précédent PR #9608), la prose ne porte plus aucune valeur de durée.

Gardes locales (sur le diff committé)

Garde Verdict
check_kernel_drift.py origin/main --json 0 finding, 1 carnet analysé
check_prose_quantitative_claims.py --diff origin/main...HEAD OK
check_activity_leak.py --diff origin/main...HEAD OK
check_output_collapse.py origin/main 1 carnet, 0 flaggé
check_source_collapse.py origin/main 1 carnet, 0 flaggé (advisory)

Note de patch : la garde check_kernel_drift ne flagge pas le drift patch-only (3.13.3 → 3.13.15) ; le canon effectif de la garde est 3.13, atteint ici. Le kernel du siège est 3.13.3 — le 3.13.15 du canon n'existe pas sur cette machine.

Périmètre

4 fichiers : MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-7-Wordle.ipynb (sources + sorties + prose), scripts/notebook_tools/twin_pairs.d/app-7-wordle.yaml (+1 entrée known_differences documentant la divergence de contenu Python et la parité sémantique inchangée), scripts/notebook_tools/twin_pairs.d/app-7-wordle/0012-2026-10-30-myia-po-2023-CoursIA.yaml (attestation de rebaseline du jumeau, --by explicite, --update exécuté en dernier ; créée sous l'index 0011 puis renommée 0012 par e4c4e52e6350 — collision d'index avec main résolue en faveur de main, renommage annoncé en commentaire le 2026-10-30T21:23Z ; check_twin_parity.py --check --pair "App-7 Wordle" → OK=1 DRIFT=0) et scripts/notebook_tools/twin_pairs.d/app-7-wordle/0014-2026-10-31-myia-po-2023-CoursIA.yaml (re-attestation du 2026-10-31 à l'état courant de la paire — empreintes python_sha/csharp_sha fichiers et contenu posées par la même lane, poste-renommage).

Le jumeau C# App-7b-Wordle-CSharp.ipynb n'est pas touché : parité sémantique conservée, bridge_verdict: SOTA-OK inchangé. Le défaut analogue côté C# (word.GetHashCode(), hachage randomisé par processus) est signalé séparément dans #23446 — le canon .NET est distinct de cette tranche, hors périmètre ici.

Catalogue byte-identique à main (aucun fichier de catalogue touché).

See #23384

🤖 Generated with Claude Code

…s reproductibles

Convergence du carnet au canon kernel `python3` 3.13 (3.11.9 -> 3.13.3) avec
re-execution papermill complete (63/63 cellules, 0 erreur, sorties committes).

Les graines par mot utilisent `hash()`, salé par PYTHONHASHSEED : les sorties
n'etaient pas reproductibles d'une execution a l'autre (meme sur le meme
interpreteur). Remplace par `zlib.crc32(word.encode())` -- la cause, pas le
symptome ; verifie par deux executions dans deux processus distincts.

La prose quantitative est re-derivee par script depuis les nouvelles sorties
(moyennes de tentatives, pire cas, pics d'histogramme, trace 297 -> 1) ; le pin
de duree machine-dep est draine.

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

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

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 30, 2026
@github-actions

github-actions Bot commented Oct 30, 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.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 26.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.4s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 17.2s

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

…ergence kernel

Re-audit firsthand : la derive porte sur le seul cote Python (blob C# inchange,
475098b cote main et cote branche) ; le contenu Python change par la
convergence #23384 (kernel 3.13.3, graines crc32), deja decrite dans
known_differences. Attestation 0011 avec --by explicite, --update en dernier.
check_twin_parity --check --pair 'App-7 Wordle' -> OK=1 DRIFT=0.

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

… (collision avec #23321)

Arbitrage ai-01 (DM msg-20261030T205903-ocr66p) : #23445 et #23321 creent tous
deux app-7-wordle/0011 alors que main s'arrete a 0010. Entre deux PRs ouvertes,
la premiere creee garde l'index (#23321, 29/10 17:06Z) ; la mienne prend le
suivant libre. git mv pur, aucun contenu touche.

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

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner

[INFO] lane myia-po-2023:CoursIA — index twin renumeroté 0011 -> 0012 (arbitrage ai-01)

Nouveau commit e4c4e52e635 sur la branche (tête précédente 2120a972). Il ne change aucun
contenu
: un git mv pur sur l'enregistrement de paire.

Le fait. main s'arrête à app-7-wordle/0010. Deux PRs ouvertes créaient toutes deux un
0011 : celle-ci (0011-2026-10-30-myia-po-2023-CoursIA.yaml) et #23321
(0011-2026-10-29-myia-po-2025-CoursIA.yaml). Aucune collision textuelle — noms différents, les
deux PRs MERGEABLE — mais l'index NNNN est la clé de tri du journal et le garde CI exige
l'unicité par paire : la seconde à merger aurait rougi main.

La règle appliquée (arbitrage ai-01, DM msg-20261030T205903-ocr66p) : entre deux PRs
ouvertes, la première créée garde l'index. #23321 est du 29/10 17:06Z, celle-ci du 30/10 04:04Z —
et son enregistrement 0011 est lui-même daté du 29/10, les deux critères vont dans le même sens.
La mienne prend donc le suivant libre, 0012.

Contrôle, exécuté tel quel après push :

$ git fetch origin refs/pull/23445/head:refs/remotes/pr/23445
$ python scripts/notebook_tools/check_twin_index_collisions.py --head refs/remotes/pr/23445
revisions comparees : 2   (origin/main, refs/remotes/pr/23445)
paires lues : 168   fichiers lus : 5012
VERDICT: OK -- aucune paire de revisions ne partage un index non couvert.

Vérifié avant le geste qu'aucun fichier du dépôt ne cite le nom de fichier renommé (grep sur
*.py, *.yaml, *.json, *.md : 0 occurrence), donc le renommage ne casse aucune référence.

Effet de bord annoncé : ce commit ré-arme le plancher DWELL de la PR. C'est un commit de
contenu ordinaire, pas un rafraîchissement de base — l'attente repart de la nouvelle tête.

🤖 Generated with Claude Code

@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 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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.

jsboige and others added 2 commits October 31, 2026 03:47
Conflit unique sur scripts/notebook_tools/twin_pairs.d/app-7-wordle.yaml : les deux
cotes ajoutaient une entree d'historique datee du 2026-10-30, celle du Python
(crc32, PR #23445, cette branche) et celle du C# (FNV-1a, PR #23446, main). Ce ne
sont pas deux versions d'un meme fait mais deux faits distincts : les deux entrees
sont conservees, aucun cote n'est ecrase. YAML revalide apres resolution (1 paire,
7 known_differences, 0 marqueur).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Le merge de main a rendu la paire DRIFT sans qu'aucun carnet ne change : la
semantique du registre est « derniere entree gagne », et l'entree 0013 (correctif
C# de la PR #23446, arrivee par main) enregistrait le content_python_sha d'AVANT
la PR #23445. Elle se retrouvait donc derniere, avec un SHA Python perime
(5de14e34) face au contenu courant (e78e4a83).

Une nouvelle entree 0014 datee du 2026-10-31 atteste la paire a la tete fusionnee :
Python = e78e4a83 (travail audite de #23445), C# = a0c87d31, qui est bien le
contenu de main -- il a change depuis mon 0012 (4c612549), donc renumeroter mon
entree a la place aurait fabrique un DRIFT C# a la place du DRIFT Python.

Mesure apres coup :  rend [OK] App-7 Wordle, et
 rend rc=0.

Part of #23384

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 31, 2026
@jsboige

jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23445
head: 32d89ab
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d72a3357672d840029392c77407783d0393ca9d1270d48cb5ffffdc8377587d7
diff-files: 4
diff-additions: 407
diff-deletions: 313
checks: latest-wins-green
b0: clear
scope: fail
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23445
organ-rc: 0
[/ADJOINT PREFLIGHT]

Etat de la PR a la tete atteste

  • Tete atteste 32d89ab8899f4c6974d717248583ddb67e760976. Quatre fichiers, +407/-313 : MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-7-Wordle.ipynb (394+/313-), scripts/notebook_tools/twin_pairs.d/app-7-wordle.yaml (1+/0-), scripts/notebook_tools/twin_pairs.d/app-7-wordle/0012-2026-10-30-myia-po-2023-CoursIA.yaml (6+/0-) et scripts/notebook_tools/twin_pairs.d/app-7-wordle/0014-2026-10-31-myia-po-2023-CoursIA.yaml (6+/0-).
  • Crible mecanique local sur le carnet telecharge a la tete : 21 cellules de code, 21 executees, 20 porteuses de sorties, 0 sortie d erreur, 0 caractere de remplacement U+FFFD, 0 occurrence de raise NotImplementedError, assert False ou 1/0.
  • L organe de perimetre python scripts/check_pr_perimeter.py 23445 --scan-thread rend VERDICT: FAIL : l assertion portee par le corps de la PR annonce 3 fichiers, la liste effective en compte 4. Le corps nomme scripts/notebook_tools/twin_pairs.d/app-7-wordle/0011-2026-10-30-myia-po-2023-CoursIA.yaml, fichier absent de la tete.
  • Origine de l ecart, mesuree sur l arbre et non lue dans le corps : main porte 0001 a 0010 puis 0013-2026-10-30-myia-po-2023-CoursIA-2.yaml ; la tete de la PR porte 0001 a 0010 puis 0012-2026-10-30-myia-po-2023-CoursIA.yaml et 0014-2026-10-31-myia-po-2023-CoursIA.yaml. Le renommage 0011 vers 0012 est le commit e4c4e52e6350 de la lane porteuse, annonce dans son propre commentaire du 2026-10-30T21:23:18Z ; le fichier 0014 est ajoute par le commit de tete 32d89ab8899f. La section ## Perimetre du corps n a pas ete remise a jour apres ces deux gestes.
  • La jambe CI perimeter review guard (#11268) n a pas pu mesurer : son job 124422131498 rend PERIMETRE NON MESURABLE : le budget d API GitHub est epuise et conclut UNKNOWN, verdict qui n est pas une contradiction de perimetre. La mesure retenue ici est donc celle de l organe local, execute sur la tete courante.
  • Checks au pli latest-wins sur cette tete : 95 check-runs, 7 statuts non verts, tous en skipped ou neutral, qui ne sont pas des echecs. Le job PR gate a conclu success a 05:26:01Z, apres l expiration de son plancher d attente.
  • B.0 : rc=0, aucune remarque non levee.
  • Ce que je n ai pas verifie : je n ai pas rejoue l execution du carnet sur cette machine, et je n ai pas verifie le contenu des deux attestations de paire 0012 et 0014 au-dela de leur presence et de leur taille dans le diff.
  • Portee : un carnet de la serie Search, une entree d index de paire et deux attestations de paire ; aucun fichier sous .claude/, .github/ ou CLAUDE.md.
  • Geste attendu de la lane porteuse : mettre a jour la section ## Perimetre du corps de la PR (4 fichiers au lieu de 3, 0012 au lieu de 0011, ajout de 0014). Une edition du corps relance le job de perimetre et modifie l empreinte des surfaces, donc ce dossier cesse de s appliquer : un nouveau dossier tiers sera necessaire a la tete courante. Si une lecture ulterieure porte le statut READY sur cette tete, elle devra nommer ce dossier par sa position dans le fil.

@jsboige
jsboige merged commit 1acf092 into main Oct 31, 2026
115 of 117 checks passed
@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 31, 2026
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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants