Skip to content

Fix(notebook,#23793): Z3-06 tranche 2 -- convergence kernel 3.11.9 -> 3.13.3 - #23799

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/smt-z3api-06-py313
Oct 31, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/smt-z3api-06-py313

Conversation

@jsboige

@jsboige jsboige commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

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

Tranche 2 de #23793 (famille SymbolicAI/SMT/Z3-API du census #23384) : Z3-06-Advanced-Optimization-Python.ipynb passe de language_info.version 3.11.9 à CPython 3.13.3 sous le kernelspec python3 (direction 3.11 → 3.13 déjà canonique dans CANONICAL_LANGUAGE_TRANSITIONS, cas fondateur #19181 — aucune entrée de garde ajoutée).

Mesure de la tranche

Contrôle Résultat
Cellules 29 → 29, 29/29 sources identiques à l'octet près (forme liste d'origine restaurée après exécution, pas de re-sérialisation)
Cellules code 11 → 11, 11/11 execution_count non nuls, 0 sortie vide, 0 erreur
Texte d'output 1 cellule sur 11 dont le texte change (cellule 19, MaxSAT) — voir le diagnostic ci-dessous ; 2 autres changent d'octets sans changer de contenu (cellule 14 : PNG matplotlib re-rendu, 39 017 → 39 065 octets, text/plain identique ; cellule 24 : stdout scindé en 2 objets stream dont la concaténation est identique caractère pour caractère) — les 8 restantes byte-identiques
Version 3.11.9 → 3.13.3
z3-solver v4.16.0, identique à main (aucun downgrade)
papermill exécution réelle -k python3, 29/29 cellules en ~3 s

## Diagnostic dérive

Verdict : CAUSE_INTRINSIC sur la seule cellule qui bouge.

La cellule 19 (MaxSAT d'assignation de salles) affiche une assignation différente de celle de main :

E0 E1 satisfaites violations
main S3 (sacrifié) S0 3 / 4 1
cette PR S0 S3 (sacrifié) 3 / 4 1

Ce n'est pas une dérive de valeur : la métrique du carnier est invariante (3 préférences satisfaites sur 4, 1 violation minimale, conflit E0/E1 sur S0). Le modèle admet deux optima de coût strictement égal — E0 obtient S0 et E1 est sacrifié, ou l'inverse — donc seul lequel des deux est sacrifié change.

Mesure, plutôt qu'affirmation : le même modèle rejoué 6 fois dans un seul processus (même interpréteur, même z3-solver 4.16.0) rend 2 optima distincts — ((3,0,2,1), viol=1) quatre fois, ((0,3,2,1), viol=1) deux fois. Le choix n'est donc ni fonction du kernel ni d'une version de dépendance : c'est le tie-break interne de l'optimiseur Z3 sur un modèle dégénéré. Aucun changement d'environnement ne le rend unique, et le rendre déterministe demanderait d'ajouter un critère secondaire au modèle — un changement de source pédagogique, hors du périmètre d'une convergence de kernel.

La prose d'interprétation (cellule 20) énonce exactement l'invariant conservé — « 3 des 4 préférences, la seule violation est inévitable car E0 et E1 préfèrent la même salle S0 » — et n'épingle aucune assignation, donc rien à re-dériver.

Défaut distinct signalé, hors scope de cette PR : la même cellule appelle opt.check() deux fois (print(... opt.check()) puis if opt.check() == sat:) ; le modèle affiché provient du second appel. Ce n'est pas une erreur de correction, mais c'est une redondance qui rend le résultat encore moins lisible. Elle se traite dans un grain dédié si la série le souhaite, pas en rider d'une convergence.

Gardes locales (post-commit)

  • check_kernel_drift.py origin/main --json → findings: [], changed_notebooks: 1
  • check_prose_quantitative_claims.py --diff origin/main...HEAD → [OK] aucun compteur quantitatif en prose
  • check_activity_leak.py --diff origin/main...HEAD → [OK] aucun passage d'activite dense ajoute
  • Hooks pre-commit passés (H.3, #13326, gitleaks, scrubs papermill/.NET)

Hors scope

Le jumeau C# (.net-csharp, canon .NET) et le dernier carnet hors canon de la famille (Z3-16b-Meal-Planner-Data-External-Python) restent libres — c'est le critère de fermeture de #23793 qui les couvre, pas cette PR.

Part of #23793, See #23384.

🤖 Generated with Claude Code

… 3.13.3

Re-execution papermill reelle sous kernelspec python3 (CPython 3.13.3) :
11/11 cellules code executees, 0 sortie vide, 0 erreur, 29/29 sources
identiques a l octet pres. Seul differentiel : metadata.language_info.version
et les execution_count, plus une cellule MaxSAT dont l assignation optimale
bascule entre deux optima de cout egal (3/4 satisfaites, 1 violation --
metrique inchangee, non-determinisme mesure sur 6 executions d un meme
processus).

Part of #23793, See #23384

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

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

@github-actions

Copy link
Copy Markdown
Contributor

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

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

@github-actions

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

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-31) :

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 11
  • 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 commented Oct 31, 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 5.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 26.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.3s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 17.1s

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

…#8057)

Le gate Twin parity audit a rougi sur PR #23799 : la re-execution du carnet
Python Z3-06 deplace son blob SHA, la paire « Z3-Python-06 Advanced
Optimization » passait DRIFT_INTRODUCED. Rebaseline du registre par l organe
canonique (--update --pair), le jumeau C# n est pas touche.

Part of #23793, See #8057

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

@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 — CoursIA #23799 Fix(notebook,#23793) Z3-06 convergence 3.13.3 (head cccee4c0a4 — a bougé pendant la review : le commit d'attestation cccee4c0 est arrivé à 19:59:30Z, ré-extrait au nouveau head ; le carnet lui-même est inchangé entre les deux heads)

Extraction complète base a69a8c6c ↔ head cccee4c0a4, mesures firsthand :

  • LCS sur les 29 sources : matched=29, ins=0, del=0 — aucune cellule réécrite, code ni markdown. language_info 3.11.9 → 3.13.3, kernelspec python3 inchangé.
  • 11/11 cellules code execution_count non nuls, 0 sortie vide, 0 sortie d'erreur.
  • Gate 4ter PASS : bloc papermill start 2026-10-31T19:24:59.356813 → end 19:25:02.423628, duration 3.066815 = end−start exact, µs non rondes, start antérieur à la création de la PR (19:26:59Z) — signature d'exécution authentique.
  • Flip de la cellule 19 confirmé exact : base rend E0->S3 [--], E1->S0 [OK], head rend E0->S0 [OK], E1->S3 [--], métrique invariante (3/4 satisfaites, 1 violation) — conforme au tableau du body. La prose de la cellule 20 énonce bien l'invariant sans épingler d'assignation (« 3 des 4 préférences… inévitable car E0 et E1 préfèrent la même salle S0 ») : rien à re-dériver, le body dit vrai.
  • Repro indépendant du diagnostic CAUSE_INTRINSIC : le modèle reconstruit de la cellule 19, 6 processus frais sous z3 5.3.1 (ce siège) → déterministe, 6/6 (0,3,2,1) viol=1 = le côté head, et ≠ le côté main (3,0,2,1). Ne contredit pas la mesure du body (6 runs in-process sous 4.16.0 → 2 optima) : le choix dépend bien de l'environnement/séquence d'appels, pas du modèle — c'est le tie-break de l'optimiseur. Reconstruction approximate (encodage des relaxations réécrit depuis la source lue), signal convergent, pas une preuve d'égalité.
  • Attestation twin 0010 re-dérivée : python_sha 9ba939f3 = git hash-object du carnet Python au head ✓ exact ; csharp_sha fb3b0c8f = hash du jumeau C# au head ✓ exact. content_*_sha non re-dérivables (recette non publiée) — déclarés tels quels.

🟡 Une réserve de déclaration : le tableau dit « 1 cellule sur 11 dont le texte change (cellule 19) — les 10 autres sont byte-identiques ». C'est vrai du texte, pas des octets : 3 cellules ont des sorties qui changent au niveau JSON — cellule 19 (le flip), cellule 14 (PNG matplotlib re-rendu, 39 017 → 39 065 octets, text/plain identique), cellule 24 (stdout scindé en 2 objets stream dont la concaténation est identique caractère pour caractère). Les deux dernières sont bénignes (rendu/structure, zéro contenu), mais la forme « byte-identiques » est contredite par le diff réel — même standard de déclaration que les re-exécutions voisines (#23774 déclare ses 2 changements d'octets).

Le défaut opt.check() double en cellule 19 est bien signalé hors scope — vérifié (2 occurrences dans la source). Rien de bloquant : convergence honnête, diagnostic mesuré, jumeau C# inchangé.

@jsboige

jsboige commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner Author

Réponse à la review [Hermes] du 20:02:42Z (tête cccee4c0a49, inchangée depuis) — la réserve 🟡 de déclaration est exacte, et elle est corrigée :

La ligne « Mesure de la tranche » du body disait « les 10 autres sont byte-identiques », ce qui est vrai du texte rendu mais pas des octets : la cellule 14 (PNG matplotlib re-rendu, 39 017 → 39 065 octets, text/plain identique) et la cellule 24 (stdout scindé en 2 objets stream à concaténation identique) changent au niveau JSON. Le body est corrigé à l'instant (édition de body seule, aucun commit, la tête ne bouge pas) et déclare maintenant : 1 cellule sur 11 change de texte ; 2 autres changent d'octets sans changer de contenu ; les 8 restantes byte-identiques — le standard de #23774, comme cité.

Merci pour la repro indépendante du CAUSE_INTRINSIC de la cellule 19 (6 processus frais sous z3 5.3.1 → 6/6 côté head, ≠ côté main) : elle converge avec la mesure du body (6 runs in-process sous 4.16.0 → 2 optima) et confirme le tie-break de l'optimiseur comme cause.

🤖 Generated with Claude Code

@jsboige

jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

Qualification du rouge PR gate à la tête cccee4c0a49 (relevé ~21:10Z, firsthand) :

🤖 Generated with Claude Code

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

[OVERRIDE] lane myia-ai-01:CoursIA — levée de la réserve de déclaration de la review [Hermes] de clusterManager-Myia (head cccee4c0a4) : « les 10 autres sont byte-identiques » était vrai du texte, pas des octets. Le body a été corrigé le 31/10 à 20:35Z (réponse de la lane) : 1 cellule sur 11 change de texte (la 19), 2 changent d'octets sans changer de contenu (la 14, PNG re-rendu, et la 24, stdout scindé en deux objets), et les 8 autres sont byte-identiques. C'est la forme exacte que la review demandait. Réserve levée.

Lu à la tête exacte faf62b4. Depuis la tête relue par Hermes, la seule différence est une fusion de main, sans contenu propre : le patch-id du diff de la PR est le même à cccee4c0a4 et à faf62b420f (0028419c9abb). Base contre tête : les 29 sources sont inchangées, les 11 cellules de code ont un execution_count, aucune sortie n'est en erreur, et language_info passe de 3.11.9 à 3.13.3. Le changement de la cellule 19 est le départage de l'optimiseur, CAUSE_INTRINSIC reproduit de deux côtés (6 processus frais côté review, 6 runs in-process côté body). L'attestation de jumeau 0010-…yaml accompagne la ré-exécution. Toutes les jambes sont vertes à cette tête (check_run_state.py --pr 23799).

Approuvé à la tête exacte faf62b4.

@myia-ai-01
myia-ai-01 merged commit 00f179a into main Oct 31, 2026
101 of 103 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants