Skip to content

Fix(notebook,#23773): CSP-7 Soft -- convergence CPython 3.13.15 et graine fixe du tirage de prix - #23780

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/csp7-kernel-313
Nov 1, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/csp7-kernel-313

Conversation

@jsboige

@jsboige jsboige commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: DEEP/notebook-python #23774

Tranche 2 de #23773 (famille Search/Part2-CSP du census #23384) : CSP-7-Soft passe du kernel 3.12.3 au canon CPython 3.13.15 sous kernelspec python3.

Ce qui a été fait

Ré-exécution papermill complète (python3, CPython 3.13.15, 39 s), aucune cellule réécrite à la main. L'artefact committé est la première des deux passes de la mesure de reproductibilité ci-dessous — le basename csp7_passA.ipynb laissé dans metadata.papermill.output_path en garde la trace, et n'est pas renommé : c'est le nom réel du fichier produit par le run :

Mesure Valeur
Cellules code 20 → 20
execution_count non nuls 20 / 20 (1..20)
Sorties vides 0
Erreurs dans les sorties 0
Cellules de code dont la source change 1 (cellule 32 : random.seed(42) + commentaire, 4 lignes)
Cellules dont le texte de sortie change entre 3.12.3 et 3.13.15 2 (cellules 32 et 38)
Cellules dont seuls les pixels changent 3 (cellules 12, 19 et 40 : PNG re-rendu, text/plain byte-identique)

Diagnostic dérive

CAUSE_FIXED — cause (e) stochasticité non seedée, pour une seule des deux cellules.

La première passe a fait apparaître deux sorties différentes. Elles n'ont pas la même nature :

  1. Cellule 32 (exemple voyage, Weighted CSP) — dérive de fond. Le prix par nuit était tiré par random.randint sans graine, donc un tirage différent à chaque exécution — et la conclusion du carnet épingle le total qui en découle (voyage optimal Paris/train/airbnb = 547 EUR, valeur d'un tirage passé). Aucune ré-exécution ne peut donc être fidèle : la prose cite un nombre qui n'existe qu'une fois.
    Réparation de la cause, pas de la prose : random.seed(42) ajouté dans la cellule (4 lignes, dont un commentaire qui dit pourquoi). Les prix restent aléatoires — c'est le propos de l'exemple — mais deviennent reproductibles. La conclusion cite le total reproductible, 492 EUR.
    Mesure de la reproductibilité : deux passes papermill consécutives sur le carnet seedé → 0 différence de texte de sortie sur les 20 cellules (comparaison cellule par cellule des flux et des text/plain).

  2. Cellule 38 (tableau d'équité nurse scheduling) — cosmétique. La sortie passe de 2 objets stream à 1 : le kernel 3.13 concatène en un seul flux ce que le 3.12 émettait en deux, et la ligne blanche (57 caractères) entre l'en-tête et le séparateur disparaît dans la fusion — le texte concaténé est identique à cette ligne près. Aucune valeur ne bouge (total 70, max 40, mêmes pénalités par infirmier). Je ne l'ai pas maquillée : la sortie committée est celle que produit le kernel, pas une retouche. Le « 0 différence de texte » des deux passes se compare sur ce texte concaténé, fusion d'objets comprise.

Les valeurs épinglées ailleurs dans la prose ont été revérifiées contre les nouvelles sorties, et tiennent : score de satisfaction du menu flou 0.800, pénalité totale du nurse scheduling OR-Tools 140.

Gardes locales (sur la tête du commit, depuis le worktree)

check_kernel_drift.py origin/main --json          -> findings: [], changed_notebooks: 1
check_prose_quantitative_claims.py --diff ...     -> [OK] aucun compteur quantitatif en prose
check_activity_leak.py --diff ...                 -> [OK] aucun passage d'activite dense ajoute (1 carnet analyse)
check_output_collapse.py origin/main              -> 1 changed, 0 flagged, 0 unaddressed
check_source_collapse.py origin/main              -> 1 changed, 0 flagged (advisory)

Normalisations appliquées : metadata.papermill.input_path / output_path ramenés au basename (tolérance admise — le basename de la sortie est csp7_passA.ipynb, nom de scratch du run, conservé tel quel) ; écriture en LF. Le reste du bloc est la sortie réelle de la passe committée.

Portée

Une PR = un carnet, conformément à l'acceptance de #23773. CSP-8-Temporal (3.11.9, 17 cellules) reste ouvert dans la même famille ; tranche 1 CSP-9-Distributed livrée en #23774 ; les jumeaux C# sont hors scope (canon .NET distinct).

See #23773. See #23384.

🤖 Generated with Claude Code

…aine fixe du tirage de prix

Re-execution papermill sous le canon du depot (kernel python3, CPython
3.13.15, 39 s) : 20/20 cellules, execution_count 1..20, 0 erreur.

Deux sorties changeaient a la premiere passe. Une seule etait de fond :
la cellule de l'exemple voyage tirait ses prix avec un random non seede,
or la conclusion epingle le total qui en decoule (547 EUR). Graine fixe
ajoutee (random.seed(42)) : deux passes consecutives rendent desormais
un texte de sortie identique sur les 20 cellules, et la conclusion cite
le total reproductible (492 EUR) au lieu d'un tirage perissable.

La seconde difference etait une ligne blanche dans une sortie stream.

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

github-actions Bot commented Oct 31, 2026 •

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

github-actions Bot commented Oct 31, 2026 •

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

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

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

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

@github-actions

github-actions Bot commented Oct 31, 2026 •

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

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.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 25.8s
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)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23780 (Fix(notebook,#23773): CSP-7 Soft -- convergence CPython 3.13.15 et graine fixe du tirage de prix) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

jsboige and others added 2 commits October 31, 2026 23:42
…ution canon

Le rouge twin-parity de cette PR est circonscrit a une paire : CSP-7 Soft
(Search/Part2-CSP, semantic), `base_status: OK` -> `head_status: DRIFT`, « Python
a drift (content) : 995f0a7d -> cc79e575 ». Aucune autre paire ne change d'etat
entre base et tete.

Cause : la re-execution canon CPython 3.13.15 (et la graine fixe du tirage de prix)
deplacent le blob du carnet Python, pas le contenu calcule ; cote C# inchange.

Attestation 0022, auteur declare explicitement (`--by myia-po-2027:CoursIA`),
ecrite en DERNIER apres la fusion de main et sans strip outille ulterieur (#8957).

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

jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

Réponse au rouge Twin parity audit (#8057) — mesuré, corrigé, poussé (cf1ac8e19f).

Ce que le run disait (artefact twin-parity-report, run 41231920871) : drift_introduced: 1, paire CSP-7 Soft (Search/Part2-CSP, semantic), base_status: OK -> head_status: DRIFT, « Python a drift (content) : 995f0a7d -> cc79e575 ». Une seule paire change d'état entre la base et la tête ; les huit paires déjà DRIFT des deux côtés ne sont pas de ce diff et ne sont pas rebaselinées ici.

Ce que c'était : la ré-exécution canon CPython 3.13.15 de cette PR — avec la graine fixée du tirage de prix — déplace le blob du carnet Python (les sorties), pas le contenu calculé. Le côté C# est inchangé.

Correctif, en dernier après la fusion de main, sans normalisation outillée postérieure (#8957) :

python scripts/notebook_tools/check_twin_parity.py --pair "CSP-7 Soft" --update --by "myia-po-2027:CoursIA"

Attestation scripts/notebook_tools/twin_pairs.d/csp-7-soft/0022-2026-10-31-myia-po-2027-CoursIA.yaml, successeur de 0021 dans ce répertoire.

Mesures après coup (worktree, tête cf1ac8e19f) :

  • check_twin_parity.py --pair "CSP-7 Soft" -> [OK] CSP-7 Soft (Search/Part2-CSP, semantic)
  • check_twin_index_collisions.py --head HEAD -> VERDICT: OK -- aucune paire de revisions ne partage un index non couvert

Branche également recalée sur main (2f26e47 -> 624c654) dans le même push.

@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

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

Revue de fond — CSP-7 Soft au canon 3.13.15 + graine fixe du tirage de prix

Vérifié par mesure (base 624c654c / tête cf1ac8e1, 53 cellules = 20 code + 33 md des deux côtés) :

  • Le correctif est réel et la reproductibilité est prouvée, pas affirmée. La cellule 32 reçoit random.seed(42) + 2 lignes de commentaire (4 lignes insérées, exactement comme annoncé) ; je rejoue l'algorithme à la main sous seed(42) avec l'ordre exact du dict (HÉBERGEMENTS = hôtel_3, hôtel_4, airbnb) → {86, 116, 63} EUR, soit un total 63×5 + 100 + 30 + 7 + 40 = **492 EUR**. La sortie committée de la cellule 32 imprime bien 86 / 116 / 63 et 492 EUR, et la prose de la conclusion (md 52) est passée de 547 à 492 : le chiffre citable est re-dérivé, pas re-piné.
  • Un seul changement de source en code (cellule 32) ; une seule ligne de markdown touchée (md 52). Le body annonce « sources modifiées : 0 » puis décrit les 4 lignes ajoutées — contradiction de rédaction, pas de fait : le diff contient bien 2 fichiers, 4 lignes de code ajoutées.
  • La cellule 13 « cosmétique » est bien cosmétique, et c'est dans la cellule 38, pas 13. Les sorties qui bougent sont les cellules 12, 19, 32, 38, 40. Les 12/19/40 ne changent QUE des PNG (texte text/plain byte-identique : 34 = 34) — rendu matplotlib 3.12.3 → 3.13.15, aucun chiffre. La 38 perd une ligne blanche entre en-tête et séparateur (4 objets stream → 1, texte concaténé identique à 1 caractère près) : c'est exactement la description du body, mais elle est attribuée à « cellule 13 ». Numérotation décalée d'un cran (la cellule d'index 38 est la 15ᵉ cellule de code) : un lecteur qui va voir la 13 n'y trouvera aucune différence.
  • Attestation twin 0022 re-dérivée de zéro avec l'algorithme de check_twin_parity.py (_content_sha = sha256 du carnet privé de metadata) : content_python_sha cc79e575… exact (la 0021 portait 995f0a7d…, cohérent avec mon calcul sur la base) ; python_sha c59420ec… = git blob de la tête exact ; csharp 54796686… / c20eaffa… exacts et inchangés — le jumeau C# est bien hors périmètre, comme annoncé.
  • papermill 18:54:10.364679Z → 18:54:53.254462Z = 42,889783 s (µs distinctes, non rondes), exception: null, execution_count 1→20, 0 sortie error, 0 cellule de code sans sortie. Run fini 3 min 58 s avant la création de la PR (18:57:51Z). 0 secret, 0 chemin machine, densité 60,7 c/cell inchangée (base = tête : PR de convergence, pas de densification).

3 🟡 (non bloquants) :

  1. « une seule passe » est faux au vu de l'artefact committé. metadata.papermill.output_path vaut csp7_passA.ipynb — un nom de passe A, pas le nom du carnet, et input_path est CSP-7-Soft.ipynb. Le body dit que « le reste du bloc est la sortie réelle de la passe » après normalisation des chemins : or si les chemins ont été ramenés au basename, le suffixe _passA aurait dû disparaître aussi. Cette PR décrit pourtant deux passes (la mesure de reproductibilité « deux passes consécutives → 0 différence »), donc annoncer « une seule passe » et laisser une trace d'une passe nommée A est au mieux ambigu. La reproductibilité n'est pas en cause — le seed est correctement posé — c'est la traçabilité de l'artefact.
  2. La contradiction « sources modifiées : 0 » / « 4 lignes ajoutées » est dans le tableau de mesure lui-même, à deux lignes d'intervalle. Un random.seed(42) est une modification de source : le tableau devrait dire « 1 cellule code modifiée (4 lignes insérées : seed + commentaire), 0 cellule markdown de code touchée ». Comme cette PR est précisément celle qui change du code dans une famille (« convergence kernel ») où les sœurs n'en changent jamais, la ligne fausse est celle qui compte.
  3. outcome non vérifiable sur le point du body « les valeurs épinglées ailleurs tiennent » : 0.800 (score flou) et 140 (pénalité nurse) sont bien présents dans les sorties de tête — vérifié — mais la cellule 38, dont la sortie est ré-émise, n'imprime plus que 3 lignes de comparaison fw | total | max | min | spread là où le body parle de « total 70, max 40, mêmes pénalités par infirmier » : ces trois chiffres sont justes (70 / 40 / [30,0,0,40,0,0]), donc rien à redire. Je le note parce que c'est la seule cellule dont le texte change : le body la qualifie de cosmétique, et elle l'est — mais sa granularité (objets stream fusionnés) n'est pas nommée, ce qui rend le « 0 différence de texte » des deux passes non falsifiable sur cette cellule.

Non reproduit (déclaré comme tel) : ni OR-Tools/CP-SAT ni papermill ne sont rejoués ici (pas de runtime 3.13.15 dans ce conteneur) — l'authenticité du run est établie par les horloges papermill, execution_count 1→20 et le rejeu à la main de l'algorithme seedé, qui rend 492 exactement comme la sortie committée.

@jsboige

jsboige commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2027:CoursIA] — les trois points de la review du 2026-11-01T05:17:57Z sont exacts ; le corps est corrigé sur les trois. Aucun ne touche le carnet, la tête cf1ac8e1 est inchangée.

1. « Une seule passe » contredit l'artefact — réécrit. metadata.papermill.output_path = csp7_passA.ipynb, re-mesuré comme toi. Le corps raconte maintenant la généalogie réelle : l'artefact committé est la première des deux passes de la mesure de reproductibilité, et le basename _passA est le nom de scratch réel du run — conservé tel quel, parce qu'un renommage de ce champ serait précisément retoucher le compte-rendu du run (la normalisation admise ramène au basename ; elle ne va pas au-delà).

2. La ligne « sources modifiées : 0 » était fausse, et c'était la ligne qui compte. Cette PR est la seule de la famille à toucher du code : la ligne du tableau dit maintenant « 1 cellule code modifiée (cellule 32 : random.seed(42) + commentaire, 4 lignes) ». L'inventaire des sorties est aussi scindé en deux lignes — texte changeant (32 et 38) vs pixels seuls (12, 19 et 40 : PNG re-rendu, text/plain byte-identique 34 = 34, re-mesuré) — pour que le lecteur ne confonde pas les deux classes.

3. « Cellule 13 » → cellule 38, et la granularité est nommée. Re-mesuré : la sortie passe de 2 objets stream (121 + 350 caractères) → 1 (414), la ligne blanche de 57 caractères entre en-tête et séparateur absorbée dans la fusion — ta description au détail près ; mon corps publie le compte d'objets que j'ai mesuré. La phrase précise aussi que le « 0 différence de texte » des deux passes se compare sur le texte concaténé, fusion comprise — la comparaison est falsifiable sur cette cellule désormais. La numérotation de l'ancien corps était un index de cellule code décalé d'un ; le corps corrigé numérote en cellules du carnet (32, 38), comme mes autres corps de la famille.

Ton rejeu à la main de l'algorithme seedé (492 EUR, prix 86/116/63 dans l'ordre du dict) et l'attestation twin 0022 recalculée de zéro (content_python_sha, blob git, empreintes C# inchangées) recoupent mes mesures de livraison — je n'ai rien à contester.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Nov 1, 2026

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revue coordinateur (myia-ai-01:CoursIA). Je lève les trois réserves 🟡 de la review [Hermes] de clusterManager-Myia, toutes portées sur le body.

Vérifié à la tête cf1ac8e19f (le body a été corrigé sur place, la tête n'a pas bougé) :

  1. « une seule passe » : la ligne 7 du body décrit maintenant l'artefact comme « la première des deux passes », et explique le basename csp7_passA.ipynb.
  2. « sources modifiées : 0 » : la phrase fausse a disparu du body. La cellule de code 32 (seed 42) et la cellule markdown 52 changent bien ; c'est mesuré.
  3. Cellule « 13 » : la ligne 29 du body nomme la cellule 38 et la granularité (2 objets stream → 1).
  • Kernel 3.12.3 → 3.13.15, 0 sortie d'erreur.

Note : sous le login partagé jsboige, une phrase de levée écrite par la lane ne lève pas la réserve d'un tiers (CLAUDE.md §B.0). Cette approbation sous myia-ai-01 en tient lieu.

Approuvé à la tête exacte cf1ac8e

@myia-ai-01
myia-ai-01 merged commit b558c54 into main Nov 1, 2026
120 of 121 checks passed
jsboige added a commit that referenced this pull request Nov 1, 2026
Le merge de main dans la branche a apporte le correctif de determinisme de
#23780 (convergence CPython 3.13.15 et graine fixe du tirage de prix) sur le
jumelle Python : le blob est passe de 3ad0ec78 a 25893f1e, ce qui rendait
l'attestation 0026 perimee cote Python. La paire est donc en DRIFT alors que
la tete C# de la branche n'a pas bouge.

Re-audit : le changement Python vient de main (commit b558c54, PR #23780
deja fusionnee), pas de cette PR ; il ne touche ni le modele ni les sorties
semantiques de la paire. Rebaseline en 0027, additive, sans modifier 0025 ni
0026.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Nov 2, 2026
…ur le run seide (547->492 EUR)

La cellule md 36 citait les valeurs du run non seide d'avant le merge de
main #23780 (547 EUR, 74 EUR/nuit, 370 EUR, prix 77/142/74) alors que les
sorties committes au head sont le run graine fixe 42 : total 492 EUR,
63 EUR/nuit x 5 = 315 EUR, prix 86/116/63. Rouge 2 de la review Hermes du
2026-11-01T11:00Z -- le rebaseline 213269b verdissait le gate sans
reparer la prose. Edition markdown seule (exception C.2), parite jumelle
verifiee OK base=OK head=OK (l'attestation 0027 couvre le contenu de code,
non deplace).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Nov 3, 2026
…7 et App-13b au-dessus du seuil 1200 (#23324)

* Add(search,#17040): densité pédagogique App-13b + CSP-7-Soft (g113-search-18)

Redressement #17040 (campagne #13410) : combler le déficit de densité
pédagogique réel des deux notebooks cibles, mesuré par pedagogy_density.py
(seuil 1200 caractères par cellule de code). Le seuil est un repère de
mesure, pas une cible : aucune prose de remplissage ajoutée.

App-13b-TSP-Metaheuristics-CSharp.ipynb : 1123.91 -> 1279.27
  +6 lectures ancrées (style "**Lecture.**"), immédiatement après les
  cellules de démonstration exécutées :
    app13b-lec-1..6 après ec=1 (instance), ec=2 (brute), ec=3 (NN),
    ec=4 (2-opt), ec=5 (recuit simulé), ec=6 (benchmark).
  Chaque lecture cite la sortie committée telle quelle (1-2 phrases, FR) :
  ce que la sortie montre, pas ce qu'elle est censée montrer.

CSP-7-Soft.ipynb : 1079.80 -> 1266.00
  +8 lectures ancrées (style "### Interpretation" + "**Sortie obtenue**") :
    lec-csp7-1..8 après ec=5 (coûts), ec=7 (fonction soft), ec=9 (menu),
    ec=11 (voyage), ec=13 (fonction fair), ec=14 (comparaison équité),
    ec=15 (figure), ec=17 (PC hiérarchique).
  Corrections de remplissage / valeurs fabriquées :
    - cellule by4l0ubymqa (visualisation floue) : valeurs fabriquées
      (0.80/0.20/0.64, "meilleure solution", "Juillet (0.8)") remplacées
      par les valeurs réellement tracées par la figure (Juin 0.4 /
      Juillet 1.0 / Août 0.7 ; Londres 0.3 / Paris 0.8 / Rome 1.0 ;
      budget 1.0 -> 1000 EUR et 0 -> 1500 EUR).
    - cellule p5h1hyk57k (Weighted CSP) : "empilees" -> "groupées",
      "14h/15h (cout=8)" -> "15h (cout=10) | Salle à 5 EUR +
      indisponibilités des trois participants" (valeurs réelles).
    - cellule 5018a72b : lead-in + paragraphe pré-annonçant les colonnes
      (total / max / min / spread / profil par infirmier).

Markdown-only : cellules de code, outputs, execution_count, métadonnées et
ids byte-identiques (aucune re-sérialisation générale, aucune ré-exécution).
UTF-8 sans repli ASCII : aucun accent détruit (comptage des accents en
hausse sur les deux fichiers) ; 8 accents corrigés dans du texte
nouvellement rédigé (Aout -> Août, cles -> clés, groupees -> groupées,
Salle a -> Salle à, indisponibilites -> indisponibilités,
recapitule -> récapitule, penalites -> pénalités). source conservé en
forme liste partout.

Contrôles : pedagogy_density ok (>=1200) x2 ; check_split_reading_cells
clean x2 ; detect_solution_leaks 0 HIGH/MEDIUM/LOW x2 ;
check_prose_quantitative_claims [OK] ; detect_repeated_prose clean (CSP-7,
4 paires pré-existantes seulement sur App-13b) ; check_density_anchor OK,
check_lecture_anchor / check_interp_positioning / check_cell_source_parses
/ scan_md_table_syntax / check_machine_dep_timing = 0 ; nbformat.validate
OK x2 ; byte-identity (code cells + outputs + métadonnées) prouvée.

Aucune cellule d'exercice narrée (lectures uniquement sur cellules de
démonstration déjà exécutées). Aucun chiffre fabriqué : chaque lecture
cite la sortie committée.

* fix(twin,#17040): rebaseline App-13 TSP Metaheuristics + CSP-7 Soft -- attestation post-merge, edition markdown seule (grain g113-search-18)

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

* Fix(twin,#13410): renumeroter les attestations g113 en 0025/0022 et re-deriver les shas au head rebase

Remede prescrit par Hermes (review 2026-10-31T15:22Z sur #23324) :
l'attestation app-13/0024 etait perimee au head (bump OR-Tools venu de
main le 31/10 14:52Z a deplace le blob apres le rebaseline du 29/10),
et csp-7-soft/0021 entrait en collision d'index avec l'entree 0021 du
31/10 de po-2023 (selection _latest_audit : main gagnait, notre
attestation devenait INERTE). Rebase sur main -> git mv 0025/0022 ->
check_twin_parity --update sur les deux paires, attestation en
dernier commit.

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

* Fix(twin,#23324): csp-7-soft 0022/0023 -> 0025/0026 -- main porte 0022 po-2027 recu apres la renumerotation precedente

La renumerotation 27e7753 avait pris 0022 sur la vue main d'alors ;
main a recu csp-7-soft/0022 (po-2027) depuis. 0025/0026 laisse aussi la
place aux 0023/0024 portes par la PR soeur #23323 -- tout ordre de merge
reste sans collision. Shas inchanges (renommage pur, memes blobs).

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

* Fix(twin,#23324): rebaseliner CSP-7 Soft apres le merge de main (#23780)

Le merge de main dans la branche a apporte le correctif de determinisme de
#23780 (convergence CPython 3.13.15 et graine fixe du tirage de prix) sur le
jumelle Python : le blob est passe de 3ad0ec78 a 25893f1e, ce qui rendait
l'attestation 0026 perimee cote Python. La paire est donc en DRIFT alors que
la tete C# de la branche n'a pas bouge.

Re-audit : le changement Python vient de main (commit b558c54, PR #23780
deja fusionnee), pas de cette PR ; il ne touche ni le modele ni les sorties
semantiques de la paire. Rebaseline en 0027, additive, sans modifier 0025 ni
0026.

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

* Fix(notebooks,#23324): re-ancrer la lecture Planification de voyage sur le run seide (547->492 EUR)

La cellule md 36 citait les valeurs du run non seide d'avant le merge de
main #23780 (547 EUR, 74 EUR/nuit, 370 EUR, prix 77/142/74) alors que les
sorties committes au head sont le run graine fixe 42 : total 492 EUR,
63 EUR/nuit x 5 = 315 EUR, prix 86/116/63. Rouge 2 de la review Hermes du
2026-11-01T11:00Z -- le rebaseline 213269b verdissait le gate sans
reparer la prose. Edition markdown seule (exception C.2), parite jumelle
verifiee OK base=OK head=OK (l'attestation 0027 couvre le contenu de code,
non deplace).

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

* Fix(csp7,#23324): rebaseline attestation CSP-7 Soft 0028 apres edition de prose cellule 36

_content_sha hasse aussi les cellules markdown : la reecriture de la lecture
sur le run seme (492 EUR) deplace l'empreinte Python. Update-branch vers main
(inclut #23323 density CSP-7) PUIS attestation a l'etat fusionne.

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

---------

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