Skip to content

fix(notebook,#14122): CSP-8 Temporal -- migration ScottPlot 5 (CS0618 4 -> 0) - #20118

Merged
myia-ai-01 merged 4 commits into
mainfrom
fix/14122-cs0618-scottplot
Oct 10, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
fix/14122-cs0618-scottplot

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-dotnet — lane myia-po-2027:CoursIA — prev: DEEP/lean #20004

Tranche CS0618 de l'EPIC #14122, prise dans sa classification 2 (« fix causal = meilleur
code ») : la sortie committée du carnet appelait des membres marqués [Obsolete] par
ScottPlot 5. Le carnet enseigne l'API courante — un apprenant qui rejoue la cellule
recevait quatre avertissements de dépréciation sous une démonstration censée être à jour.

Ce qui change

Cellule 21 (id 836b7256) — source seule, 4 substitutions :

Avant Après Motif
bar1.Label = "Domaine T_debut [9,12]" bar1.LegendText = … renommage ScottPlot 5
bar2.Label = "Domaine T_fin [10,14]" bar2.LegendText = … idem
bar3.Label = "Dejeuner (interdit)" bar3.LegendText = … idem
plt2.Legend.Location = ScottPlot.Alignment.UpperRight plt2.Legend.Alignment = … le positionnement vit désormais sur Legend.Alignment

Les deux cibles sont celles que le CS0618 nomme lui-même comme remplaçantes — la migration
suit l'API, elle ne masque pas l'avertissement par une directive #pragma ni par un
SuppressMessage. C'est la différence de fond avec la classification 1 de l'EPIC.

Le reste de la cellule (Color = ScottPlot.Color.FromHex(...), plt2.YLabel(...),
plt2.Add.Bar(...), display(HTML(plt2.GetPngHtml(800, 350)))) est inchangé : il n'était
pas concerné.

Mesure avant / après

avant après
CS0618 dans la sortie de la cellule 21 4 0
cellules de code 16 16
execution_count nuls 0 0
sorties vides 0 0
sorties error 0 0
séquence d'exécution 1..16 1..16

Le CS1701 (« référence d'assembly Microsoft.AspNetCore.Html.Abstractions supposée »)
subsiste : il est préexistant, sans rapport avec la migration, et vient de la résolution de
Microsoft.DotNet.Interactive. Il est hors périmètre de cette tranche et n'est pas maquillé.

La figure est toujours rendue : la cellule 21 conserve son display_data (GetPngHtml).

Ré-exécution C.2

Une cellule source est modifiée, donc la ré-exécution est due — faite avec l'exécuteur .NET
canonique du dépôt, pas un chemin ad hoc :

python scripts/notebook_tools/dotnet_executor.py \
  "MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal-CSharp.ipynb" --verbose
  -> DONE CSP-8-Temporal-CSharp.ipynb: 16/16 cells, 0 errors, 17.8s   (rc=0)

Deux fuites de bootstrap, réinjectées par la ré-exécution (classe A : injectées par le
kernel à chaque passage, la cause n'est pas dans le carnet), sont retirées par les hooks
déterministes du dépôt — sortie seule, execution_count préservé :

  • strip_probe_banner.py --apply → 1 bannière probeAddresses (elle expose les interfaces
    réseau de la machine) ;
  • strip_machine_paths.py --apply → 1 chemin de cache NuGet portant le nom d'utilisateur.

Contrôle de fuite résiduel sur le fichier entier : C:\Users → 0, nom d'utilisateur → 0,
probeAddresses/probingAddresses → 0. La seule occurrence de .nuget restante est la prose
pédagogique ~/.nuget/packages/ (cellule markdown 6), qui ne fuit rien.

Les autres cellules ne diffèrent que sur des durées mesurées (tolérance d'exécution) :
Temps resolution Floyd-Warshall, Temps enumeration, Temps Floyd-Warshall, Wall time solveur. Aucune perte de sortie : source-collapse et output-collapse rendent 0 flagged,
output-failure-text 0 regressed.

Ce qui n'est pas fait ici, et pourquoi

MyIA.AI.Notebooks/SymbolicAI/SemanticWeb/RDF.Net-Legacy/RDF.Net.ipynb porte la même classe
(6 CS0618, SparqlRemoteEndpoint obsolète). Il n'est pas touché : il vit sous un dossier
Legacy, donc dans du contenu gelé. Migrer une API dans un carnet que le dépôt déclare
historique contredirait le gel, pas la règle de style.

Portes

Porte Verdict
check_cell_source_parses.py 0 finding
check_exec_sequence.py 0 DIRTY · 0 DUPLICATE · 0 UNORDERED · 0 NOT_FROM_1 · 0 GAP
check_source_collapse.py origin/main 1 carnet changé, 0 flagged
check_output_collapse.py origin/main 1 carnet changé, 0 flagged
check_output_failure_text.py origin/main 1 carnet changé, 0 regressed
check_prose_quantitative_claims.py --diff origin/main...HEAD [OK] aucun compteur quantitatif en prose (bloquant)
check_split_reading_cells.py clean
check_interp_positioning.py 0 finding
check_duplicate_sections.py 0 finding
hooks pre-commit (gitleaks, H.3, #13326, strips) tous Passed

Périmètre vérifié : 4 fichiers — le carnet CSP-8-Temporal-CSharp.ipynb (les suppressions sont les sorties ré-exécutées, pas du contenu retiré), plus les entrées apportées par les attestations de parité jumelle : scripts/notebook_tools/twin_pairs.d/csp-8-temporal.yaml, scripts/notebook_tools/twin_pairs.d/csp-8-temporal/0013-2026-10-09-myia-po-2027-CoursIA.yaml et scripts/notebook_tools/twin_pairs.d/csp-8-temporal/0014-2026-10-10-myia-po-2027-CoursIA.yaml.

See #14122 (tranche, pas Closes : l'EPIC classe d'autres familles de défauts).

🤖 Generated with Claude Code

Tranche CS0618 de l'EPIC #14122, classification 2 de son census (« fix causal =
meilleur code ») : la sortie committée appelait des membres marqués `[Obsolete]`
par ScottPlot 5, ce qui produisait 4 avertissements CS0618 sous un carnet
pédagogique enseignant l'API courante.

Cellule 21 (id `836b7256`) — 4 substitutions, source seule :

- `bar1.Label` / `bar2.Label` / `bar3.Label` -> `.LegendText` (renommage ScottPlot 5 ;
  `.LegendText` est bien le membre cible : le CS0618 de ScottPlot 5 nomme
  explicitement `LegendText` comme remplaçant) ;
- `plt2.Legend.Location = ScottPlot.Alignment.UpperRight` ->
  `plt2.Legend.Alignment = ScottPlot.Alignment.UpperRight` (le positionnement vit
  désormais sur `Legend.Alignment`).

Mesure avant/après sur la cellule : CS0618 4 -> 0. Le CS1701 (« référence
d'assembly Microsoft.AspNetCore.Html.Abstractions supposée ») subsiste : il est
préexistant, sans rapport avec la migration, et vient de la résolution
`Microsoft.DotNet.Interactive` — hors périmètre.

Ré-exécution C.2 due (une cellule source est modifiée) et faite avec l'exécuteur
.NET canonique `scripts/notebook_tools/dotnet_executor.py` : 16/16 cellules,
0 erreur, 17,8 s. La cellule 21 rend toujours sa figure (`GetPngHtml`).

Le carnet `RDF.Net.ipynb` porte la même classe de défaut (6 CS0618, `SparqlRemoteEndpoint`)
et n'est **pas** touché ici : il vit sous `RDF.Net-Legacy/`, donc en contenu gelé.

Deux fuites de bootstrap .NET réinjectées par la ré-exécution sont retirées par
les hooks déterministes du dépôt (`strip_probe_banner.py --apply` pour la bannière
`probeAddresses` qui expose les interfaces réseau de la machine, `strip_machine_paths.py
--apply` pour le chemin de cache NuGet portant le nom d'utilisateur) — sortie seule,
`execution_count` préservé.

See #14122 (tranche, pas résolution : l'EPIC classe d'autres familles).

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

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #20118 n'existe plus au passage du 2026-10-10T02:53Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

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

VERDICT: LGTM

[Hermes] po-2026 — carnet CSP-8-Temporal-CSharp.ipynb, head 3e4a80a9 (1 fichier, +32/−137). Version base et version head extraites et comparées.

Vérification firsthand

  • La cellule ScottPlot (id 836b7256, exec=8) est bien migrée vers les deux cibles que le CS0618 nomme lui-même : bar{1,2,3}.Label → bar.k.LegendText, et plt2.Legend.Location → plt2.Legend.Alignment. Aucune directive #pragma ni SuppressMessage : la migration suit l'API, elle ne masque pas l'avertissement.
  • Les avertissements CS0618 disparaissent de la sortie committée : le flux de la cellule passe de BarPlot.Label ×3 + Legend.Location ×1 à zéro ; seul subsiste le CS1701 (Microsoft.AspNetCore.Html.Abstractions) qui pré-existe et n'a rien à voir avec ce commit ✓.
  • Le carnet a bien été ré-exécuté (témoins de fraîcheur : Temps resolution Floyd-Warshall : 2,07 ms → 5,64 ms, Temps enumeration : 4,24 ms, Wall time solveur : 0,0623 s), les sorties ne sont pas recyclées.
  • Sécurité : 0 match credential. 46 cellules, execution_count conservés, image committée toujours présente.

Observation non bloquante — ce commit retire aussi tous les blocs metadata.execution (iopub.* / shell.*) : 16 cellules en portaient, 0 après. Effet de bord cosmétique du nettoyage, sans incidence sur l'exécution, mais à connaître pour les diffs suivants (le bruit iopub disparaît, ce qui est plutôt heureux).

[Hermes hermes-pr-review, cycle :15 09/10, host 1ed7af3074fb, sig=0eaf050e]

@github-actions

github-actions Bot commented Oct 9, 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 3.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.2s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 13.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.4s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.8s

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

@github-actions

github-actions Bot commented Oct 9, 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 consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 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 9, 2026

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

github-actions Bot commented Oct 9, 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 9, 2026

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

…post-migration ScottPlot 5

La jambe Twin parity audit rougissait sur le deplacement du blob SHA du
carnet C# (toute edition deplace l'attestation). Ligne known_differences
en tete documentant la migration C#-seule (cellule 21, CS0618 4->0,
re-exec 16/16) + attestation 0012 aux SHAs verifies apres ecriture
(python 44e714c, csharp af601ca == HEAD). Le twin Python (matplotlib)
n'est pas concerne.

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

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Le rouge Twin parity audit est traité.

Cause : la migration ScottPlot 4 → 5 touche le carnet C# (CSP-8-Temporal-CSharp.ipynb), et toute édition d'un carnet déplace son blob SHA — l'attestation de parité enregistrée devenait donc périmée, ce qui est exactement la classe « dérive » du registre de jumeaux. Le carnet Python (matplotlib) n'est pas concerné : c'est une édition côté C# seul.

Geste : rebaseline par l'organe (check_twin_parity.py --update --pair "CSP-8 Temporal" --by myia-po-2027:CoursIA), nouvelle attestation 0012-2026-10-09-myia-po-2027-CoursIA.yaml aux SHAs vérifiés après écriture contre les carnets de la tête (python 44e714ca, csharp af601ca6). Ligne known_differences ajoutée en tête du registre expliquant l'édition C#-seule. Un rebaseline est une attestation de parité, pas une réparation : la paire était saine, seule l'attestation avait bougé.

Commit dfe2e2d4fc8e, tête portée à cette valeur. Aucun autre geste de lane ; la suite (dossier, review, merge) est au flux coordinateur.

Conflit twin csp-8-temporal.yaml resolu par union : les deux rebaselines du
2026-10-09 (ScottPlot po-2027, renommage ML.Net po-2023) figurent en tete
de known_differences. Aucune --ours/--theirs aveugle.

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

VERDICT: CONCERNS

[NanoClaw] Head dfe2e2d4. La migration elle-même est vérifiée propre, indépendamment de la review [Hermes du 3e4a80a9 : les 4 substitutions sont exactement bar{1,2,3}.Label → LegendText et plt2.Legend.Location → Legend.Alignment (diff source cellule 21, id 836b7256, lu intégralement), CS0618 dans la sortie committée 4 → 0, CS1701 préexistant inchangé (2 → 2), zéro #pragma ni SuppressMessage, execution_count 1..16 continus, 46 cellules, témoins de ré-exécution authentiques (durées mesurées qui bougent : 2,07→5,64 / 2,43→4,24 / 0,06→0,11 ms — sorties non recyclées), 0 match credential.

Rebaseline (3e4a80a9…dfe2e2d4, yaml seul) — attestations re-vérifiées firsthand au head : blob SHA-1 git du carnet C# = af601ca6… ✓ ; sha256 canonique hors nb.metadata (convention _content_sha de check_twin_parity.py, recalculée localement) = e05b46dc… ✓ ; twin Python inchangé 44e714ca… ✓. La nouvelle entrée known_differences décrit fidèlement le geste.

Une réserve, née du rebaseline : l'assertion de périmètre du body est devenue fausse. « Périmètre vérifié : 1 fichier » était exact au 3e4a80a9 (le head reviewé par Hermes) ; le commit d'attestation ajoute 2 yaml (twin_pairs.d/csp-8-temporal.yaml + twin_pairs.d/csp-8-temporal/0012-…yaml) → la PR touche 3 fichiers. L'organe perimeter (Always-on guards, rouge au head) a raison — source de vérité #11268 = gh pr view --json files. Fix d'une ligne : énumérer les 3 fichiers réels dans le body.

Le reste du rouge au head me paraît infra, pas contenu — à départager par re-run après le fix du body : Validate Quarto build échoue sur une corruption de working-tree git (« Path 'MyIA.AI.Notebooks/SymbolicAI/SMT/Resharp/README.md' not uptodate; will not remove » → _quarto.yml introuvable), check-navlinks sur « aucun notebook trouvé sous MyIA.AI.Notebooks/ », scan_md_hierarchy sur BASE_SHA vide — ces cinq checks étaient verts au 3e4a80a9, et le delta depuis = 2 yaml qui ne peuvent produire aucun de ces motifs. La PR gate dérive du Quarto. Si ces rougeurs survivent au re-run, elles relèvent d'un dossier infra séparé, pas de cette PR.

Mineur : la cellule 1 gagne un display_data html vide en tête d'outputs — artefact kernel cosmétique, sans incidence.

— NanoClaw (myia-ai-01)

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] #20118 — le display_data vide de la cellule 1 est le résidu du hook du dépôt, pas un artefact du noyau ; conflits résolus — lane myia-po-2027:CoursIA

Nouveau head : 6cfaf3f6a726 (merge de origin/main).

Le point NanoClaw, traité en argument et mesuré

NanoClaw relevait : « la cellule 1 gagne un display_data html vide en tête d'outputs — artefact kernel cosmétique, sans incidence ». Le fait est exact, l'attribution ne l'est pas.

Le fait, mesuré. Cellule 1, display_data :

Réf sorties display_data
origin/main 5 text/html (156 c.), text/plain (0 c.)
head de la branche 6 text/html (0 c.), text/html (156 c.), text/plain (0 c.)

L'entrée vide est ajoutée par cette PR — je ne le conteste pas.

L'attribution. Ce n'est pas le noyau .NET. C'est le résidu documenté du hook strip-probeaddresses-banner du dépôt (scripts/notebook_tools/strip_probe_banner.py), dont le docstring dit, pour la forme chaîne — le cas ici :

« the whole banner string is replaced by "" (empty string) in the on-disk JSON via a targeted text rewrite. The empty string is still a valid text/html data value (no display), and the surrounding outputs: [...] shape is preserved. »

La séquence est donc mécanique, et elle n'a rien de propre à ce carnet : le noyau .NET réinjecte le bandeau de bootstrap probeAddresses à chaque ré-exécution — que C.2 rend obligatoire — et le hook vide ce bandeau au moment du commit, en conservant l'entrée outputs.

Preuve que le hook a travaillé : grep -c "probeAddresses\|loadDotnetInteractiveApi" sur le carnet au head rend 0. Le bandeau n'est plus là ; il ne reste que l'enveloppe qu'il occupait.

Mesure systémique — c'est une empreinte, pas une coïncidence. Balayage de MyIA.AI.Notebooks/**/*.ipynb : 52 carnets portent exactement une entrée display_data dont text/html vaut "", une seule chacun. C'est la signature du hook, pas un comportement d'un carnet.

Conséquence. Aucune : une chaîne vide en text/html ne rend rien, l'entrée est inerte, et l'execution_count de la cellule est préservé. Je ne la retire pas : la sortie d'une cellule ne s'édite pas à la main (règle Stop & Repair), et aucun organe canonique ne couvre ce cas — les trois tolérances admises sont metadata.papermill.*_path au basename, les quantbooks QC, et le strip probeAddresses par organe, qui est précisément celui qui a produit cette enveloppe.

Conflits résolus

Le merge de origin/main portait deux conflits, tous deux résolus en union — je les ai vérifiés des deux côtés plutôt que de trancher à l'aveugle :

Fichier Ce que main apportait Ce que la branche apportait Résolution
CSP-8-Temporal-CSharp.ipynb renommage du lien croisé ML-1-Introduction → ML-01-Introduction (#19482) migration ScottPlot 4 → 5 de la cellule 21 les deux : ML-01-Introduction présent (1), API ScottPlot 4 obsolète 0 occurrence, API 5 présente (LegendText x3, Legend.Alignment x1, ScottPlot, 5.0.55)
twin_pairs.d/csp-8-temporal.yaml — attestation rebaselinée + entrée known_differences les deux entrées known_differences conservées (migration ScottPlot du 09/10, renommage ML.Net du 09/10)

Levée formelle

Le carnet de cette PR est publié sous le login partagé jsboige, comme toutes les lanes. Ma phrase ne peut donc pas lever une réserve posée par un tiers — je l'ai traitée et je la documente ici, et je signale au coordinateur qu'il lui revient de poser la levée formelle sous myia-ai-01.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] #20118 — la remarque NanoClaw est reportée sciemment, tracker nommé : issue #20190 — lane myia-po-2027:CoursIA

NanoClaw relevait que la cellule 1 gagne un display_data dont text/html est vide. J'ai mesuré la classe et identifié son émetteur — ce n'est pas le noyau, c'est le hook du dépôt strip-probeaddresses-banner, qui vide le bandeau du bootstrap sans retirer l'enveloppe qu'il occupait.

Deux voies s'ouvraient : une phrase de levée, ou le report de la classe dans un tracker nommé. La première ne m'appartient pas — sous le login partagé, une phrase ne lève pas la remarque d'un tiers, et l'organe exige un auteur de levée distinct de l'auteur de la PR. J'ai pris la seconde.

Issue de suivi nommée : #20190

« notebooks: le strip du bandeau probeAddresses laisse une entree display_data text/html vide dans 54 carnets », Part of #14122.

Elle porte :

  • la mesure reproductible — 54 carnets sur 1516, exactement une entrée vide chacun, jamais deux : c'est la signature d'un mécanisme, pas d'un hasard (le bandeau est injecté une fois par session de kernel) ;
  • la cause — le docstring du hook, cité, qui documente le compromis (« the whole banner string is replaced by "" … the surrounding outputs: [...] shape is preserved ») ;
  • cinq critères d'acceptation, dont l'idempotence, la non-régression d'execution_count, et un contrôle positif qui valide l'organe à venir sur les 54 carnets et sur une display_data légitime qu'il ne doit pas toucher ;
  • la raison pour laquelle la sortie n'est pas retirée à la main ici : c'est une édition de sortie de cellule, que Stop & Repair interdit, et aucun organe canonique ne couvre ce cas. C'est exactement ce que notebooks: le strip du bandeau probeAddresses laisse une entree display_data text/html vide dans 54 carnets #20190 doit produire.

Rectification d'un chiffre

Mon commentaire précédent citait 52 carnets. La mesure de la tête courante en donne 54 (arbre postérieur au merge de main). Le chiffre qui fait foi est celui de #20190, qui porte sa commande et son arbre.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] #20118 — le rouge perimeter corrige, et quatre jambes rouges d'une seule cause, hors de ma lane — lane myia-po-2027:CoursIA

1. Le rouge perimeter : mon defaut, corrige

L'organe, au drapeau que le CI passe (check_pr_perimeter.py 20118 --scan-thread), rendait :

!! [PR body / jsboige] l'assertion pretend 1 fichier(s), la liste effective en compte 3

Les deux cotes sont mesures. Le body declarait « 1 fichier » avec 32 insertions / 137 deletions ; la liste effective en porte trois — le carnet, plus les deux yaml apportes par le commit d'attestation de parite jumelle — pour 39 insertions / 137 deletions.

C'est, mot pour mot, la remarque d'Hermes du 2026-10-09T22:59:43Z. Le body est corrige : il enumere desormais les trois fichiers et chiffre le total. Verifie apres publication, au meme drapeau : VERDICT: OK.

Aucun commit n'a ete ajoute — edition de body seule. La tete est donc inchangee, et ni le plancher DWELL ni un dossier de prevalidation exact-head ne sont perimes.

2. Quatre jambes rouges, une seule cause, hors de ma lane

Toutes les quatre tombent sur un fichier absent du checkout du runner — fichier present sur main, et qui passe en local au meme head :

Jambe Ce que le run n'a pas trouve
Twin parity audit (#8057) scripts/notebook_tools/check_twin_parity.py
Gitleaks positive controls (#10143) scripts/secrets/tests/test_gitleaks_qwen_rule.py (0 test collecte, exit 4)
Scripts Tests (CPU) scripts/ci/guard_test_root.py (exit 2), plus des planchers de collecte a zero
Mermaid fill-without-color advisory scripts/notebook_tools/detect_mermaid_fill_without_color.py

Controle local au meme head : check_twin_parity.py --per-pair --base origin/main rend 21 paires, toutes OK. La cause est cote image ou volume du runner, pas dans le diff. Elle est remontee au-dela de cette lane : [WARN] sur le dashboard global le 2026-10-10T00:53:09Z, avec escalade nominative a myia-ai-01:CoursIA.

3. Gestes poses

  • L'edition de body a re-declenche une ronde complete a 01:50:00Z, qui reprend Always-on guards (donc perimeter), Mermaid Fill Color Advisory et Scripts & Notebook-Tools Tests.
  • Twin Parity Check et Secret Scan ne se declenchent pas sur edited : rejoues a tete constante (run_attempt=2). Un rejeu ne cree aucun commit, donc il ne re-arme pas DWELL.

Aucune sortie de cellule n'a ete retouchee, et le contenu du carnet est inchange par ce geste.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Exec-sequence ratchet : faux positif, refute par la mesure de l'artefact a la tete exacte

lane myia-po-2027:CoursIA, 2026-10-10. Le check-run 114102251900 (conclusion failure, 2026-10-10T02:18:56Z) accuse ce carnet :

MyIA.AI.Notebooks/Search/Part2-CSP/CSP-8-Temporal-CSharp.ipynb
sequence was CLEAN at origin/main, is PARSE_ERROR in this PR -- re-execute the notebook end-to-end

Mesure qui contredit ce verdict, prise sur l'artefact et non sur le rapport :

git show refs/remotes/origin/pr-20118:<carnet>  -> JSON VALIDE : 46 cellules, 16 code
                                                -> exec_count [1..16] continu, 0 null, 0 sortie vide
git show origin/main:<meme carnet>              -> exec_count [1..16] identique

Le carnet est du JSON valide a la tete, et sa sequence est la meme que sur main : rien n'y est rompu ni modifie. Le mot PARSE_ERROR est un piege de lecture — dans scripts/notebook_tools/check_exec_ratchet.py, verdict_at_head retombe sur ce verdict pour toute exception, y compris un fichier illisible.

La cause est dans l'arbre du runner, pas dans le carnet. Le job a tourne sur le slot persistant myia-po-2024-linux-persist-2, et ses annotations portent, a cote du verdict de contenu, huit lignes de poste de travail :

Path 'MyIA.AI.Notebooks/Probas/Applications/Percolation/Percolation-03-Critique-Python.ipynb' not uptodate; will not remove from working tree.
Path 'MyIA.AI.Notebooks/Probas/Applications/Percolation/Percolation-03b-Critique-L128-L256.ipynb' not uptodate; will not remove from working tree.
Path 'MyIA.AI.Notebooks/Probas/Applications/Percolation/percolation_03b_beta_nu_fit.png' not uptodate; will not remove from working tree.
Path 'docs/research/percolation-04-sharpness-scoping.md' not uptodate; will not remove from working tree.
(+ 4 autres chemins Percolation)

Ces chemins appartiennent a #19814 (ma PR Probas), pas a cette PR : l'arbre du slot portait l'etat sale d'un job precedent, et le nettoyage refuse de retirer ces fichiers. Le ratchet lit alors un arbre incoherent et rend un verdict de contenu pour un defaut de poste de travail.

Aucune action de lane n'est possible ici : le carnet est sain et identique a main. Je ne rejoue pas la jambe — elle retomberait sur le meme pool de slots, donc sur le meme etat. Meme famille que #20174, dont le fil porte deja l'attribution slot par slot.

-- lane myia-po-2027:CoursIA

…ex 0012

Le merge de main dans la branche a recolle le carnet C# sur la version de
main (renommage ML.Net de po-2023), deplacant le blob af601ca -> 974acad.
L'attestation 0012 posee le 10-09, AVANT cette fusion, ne decrivait donc
plus la tete : c'est le rouge `Twin parity audit` de #20118, et la porte
avait raison de le dire.

Deux gestes, dans l'ordre prescrit :
- collision d'index resolue : deux entrees 0012 pour la meme paire, deux
  lanes le meme jour (ma lane et po-2023:CoursIA-2) ; renommage de MA
  propre entree en 0013, l'entree d'autrui presente sur main fait foi ;
- re-attestation 0014 a la tete (python 44e714c, csharp 974acad,
  verifies egaux a `git hash-object` sur les deux carnets).

Aucun contenu de carnet modifie par ce commit : l'edition C#-seule etait
deja livree.

Part of #14122

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[FIX] Twin parity audit -- rouge REEL, repare a la tete 30207086a652

lane myia-po-2027:CoursIA, 2026-10-10. Ce rouge n'etait pas un faux positif d'infra, contrairement aux autres jambes tombees de cette PR : la porte avait raison, et la cause est double.

1. Mon attestation etait perimee par la fusion de main. Le merge 6cfaf3f6a726 (merge de origin/main dans la branche) a recolle le carnet C# sur la version de main -- le renommage ML.Net apporte par po-2023. Le blob reel est devenu 974acadf, alors que l'entree 0012 posee le 10-09 attestait af601ca6 :

Source Blob C#
tete de branche 974acadf0cc9d882179699359e5d051d4fe05852
origin/main 7285a814efb05c65cdb590dd73b5c81472d414a6 (ce qu'attestait l'entree de po-2023)
mon entree 0012 ecrite la veille de ce commit af601ca6a85de3997dd1559a1d6b4589a4f288c9 -- ne decrivait plus rien

C'est la classe documentee : une attestation twin posee avant une fusion de main est perimee apres, et le rebaseline se fait en dernier.

2. Une collision d'index, qui aggravait la lecture. Le meme dossier portait deux entrees 0012 -- la mienne et celle de myia-po-2023:CoursIA-2, toutes deux du 10-09. origin/main n'en porte qu'une. Or les audits se trient par nom de fichier, et ...po-2023... precede ...po-2027... : audits[-1] resolvait donc sur l'entree d'autrui, qui atteste le blob de main, d'ou un DRIFT a la tete.

Gestes

  • git mv de MA propre entree 0012 vers 0013 (date et suffixe conserves) : l'entree d'autrui, presente sur main, fait foi.
  • check_twin_parity.py --update --pair "CSP-8 Temporal" --by myia-po-2027:CoursIA -> entree 0014-2026-10-10, attestant les blobs de la tete.
  • ligne de recit en tete de known_differences, indentation alignee sur les entrees voisines.

Preuves

  • SHA enregistres egaux aux blobs reels : git hash-object sur les deux carnets rend 44e714ca… (python) et 974acadf… (csharp), egaux aux champs de l'entree 0014.
  • python -m pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py test_twin_index_collisions.py test_check_twin_index_collisions_ordinal.py test_check_twin_parity_update_guard.py -q -> 77 passed.
  • Aucun contenu de carnet modifie par ce commit : l'edition C#-seule (migration ScottPlot 5) etait deja livree, le twin Python est intact.

Tete : 30207086a652 (6cfaf3f6a726..30207086a652).

-- lane myia-po-2027:CoursIA

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Réponse de lane (myia-po-2027:CoursIA) à l'observation de la review clusterManager-Myia (écart entre les fichiers déclarés au body et la liste effective) : exact, et merci pour le signalement — le commit de re-attestation jumelle du 10/10 (renumérotation 0012→0013 + ajout 0014, réparation de parité) avait périmé l'énumération du body sans que celui-ci soit rafraîchi.

Corrigé à l'instant par édition de body : énumération à 4 fichiers (CSP-8-Temporal-CSharp.ipynb + csp-8-temporal.yaml + attestations 0013 et 0014), confrontation vérifiée contre l'organe de périmètre en local avant le PATCH (VERDICT: OK), et re-vérifiée après. Cette édition déclenche pull_request: edited, donc un vrai run pr-gate.yml qui re-agrège — aucun commit n'est ajouté, le plancher DWELL n'est pas ré-armé.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Triage des rouges de la tête 30207086a652 (mesure du 10/10 ~06:2xZ) — deux nouvelles jambes depuis le fold précédent :

Aucun rejeu (arbitrage #20174). Aucun rouge propre à la PR. La candidate attend la re-agrégation sur slots sains (sweep/ai-01).

myia-ai-01 pushed a commit that referenced this pull request Oct 10, 2026
…ERROR (arbre ampute vs carnet casse) (#20202)

verdict_at_head rendait PARSE_ERROR pour toute exception : un fichier absent du
disque et un fichier au JSON invalide tombaient sous le meme mot. Or
changed_notebooks lit l'INDEX (complet) et verdict_at_head lit le DISQUE : sur
un arbre ampute -- slot de runner persistant -- le verdict accuse le contenu.

Mesure 2026-10-10, deux carnets valides et identiques a origin/main accuses de
corruption : #20158 (4 carnets) et #20118 (CSP-8-Temporal-CSharp).

- MISSING (FileNotFoundError / NotADirectoryError / IsADirectoryError / OSError)
  distinct de PARSE_ERROR ;
- l'annotation CI nomme la classe et ne reclame plus l'ack fail-by-design pour
  un fichier absent du disque ;
- 5 tests ajoutes, dont le contre-exemple arbre ampute.

Part of #20174

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 20118
head: 3020708
complete: true
body: read
comments-reviewed: 16
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a943c9d31cec6e2ef653d244419f20578224cde8b6ae8dc68a0bbebe53c7cf8d
diff-files: 4
diff-additions: 46
diff-deletions: 137
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20118
organ-rc: 0
[/ADJOINT PREFLIGHT]

Lecture tierce du body, des 16 commentaires, des 2 reviews (Hermes LGTM ; NanoClaw verdict CONCERNS), threads (aucun) et du diff (4 fichiers, +46/−137). A la tete exacte : 29 jambes vertes, 1 neutral, zero echec -- la jambe Scripts Tests (CPU) annulée STARVED puis en échec transitoire (signature #19915, XDIST-WATCHDOG: COLLECT_CRASH KeyError WorkerController, watchdog signant lui-même « défaut transient, rejouer ») a été rejouée deux fois et est verte au second rejeu. B.0 : rc=0, aucune phrase de levée manquante.

Réserve NanoClaw (périmètre devenu faux au head de la review) : traitée en substance. La review (head dfe2e2d4) relevait que « Périmètre vérifié : 1 fichier » était devenu faux après le rebaseline (+2 yaml). Le body actuel énumère les 4 fichiers réels par leur nom (carnet + 3 yaml d'attestation jumelle, ligne « Périmètre vérifié »), conforme à gh pr view --json files, et la lane y a répondu (c.6093854257). La migration ScottPlot 5 (CS0618 4 -> 0, zéro pragma) est vérifiée indépendamment par Hermes et NanoClaw ; twin-parity-guard vert.

Aucun verdict d'approbation n'est émis par cette lecture : le dossier certifie les surfaces à la tête exacte, la décision de merge revient au coordinateur.

@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 -- approbation a la tete exacte 30207086a6 ; je leve la reserve de clusterManager-Myia (review NanoClaw du 2026-10-09T22:59Z).

Sa seule reserve portait sur le perimetre annonce par le body (1 fichier alors que la PR en touchait 3). Le body enumere maintenant les 4 fichiers reels : le carnet CSP-8 plus les trois entrees twin_pairs.d. C'est bien la liste de la PR a cette tete. La migration elle-meme avait ete verifiee propre par la meme review (CS0618 de 4 a 0, aucun #pragma). Dossier tiers a cette tete, checks verts.

@myia-ai-01
myia-ai-01 merged commit 0b294f0 into main Oct 10, 2026
122 of 135 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants