Skip to content

fix(genai-image,#18053): ordre de lecture — 3 constats annonce/lecture - #18075

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/18053-image-interp-order
Sep 28, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/18053-image-interp-order

Conversation

@jsboige

@jsboige jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2026:CoursIA-2 — prev: MED/docs #18020

Summary

Seconde tranche de l'audit multi-agents #18053 — GenAI/Image (3 constats). Les 3 lignes étaient CONFIRMED à main : deux annonces séparées du code qu'elles annoncent par une cellule de lecture interprétant une autre sortie, et une annonce décalée de deux cellules par une section intercalée.

Périmètre : 2 notebooks, déplacements de cellules markdown + une reformulation d'annonce.

Verdicts ligne par ligne

# Notebook Cellule Constat Verdict Geste
1 01-Foundation/01-3-Basic-Image-Operations.ipynb [3] DANGLING_INTRO — « La cellule suivante initialise l'environnement Python… » mais [4] est une section sur le rôle du notebook dans la série, le code d'initialisation étant en [5] CONFIRMED Reformulation : « La cellule suivante initialise… » → « Les cellules suivantes initialisent… »
2 02-Advanced/02-2-FLUX-1-Advanced-Generation.ipynb [6] DANGLING_INTRO — annonce « la cellule suivante détecte la disponibilité d'un GPU CUDA et tente de charger Diffusers », mais [7] = « 🎮 Lecture » interprétant la sortie de [8], le code GPU étant en [8] CONFIRMED Échange des cellules [7] et [8]
3 02-Advanced/02-2-FLUX-1-Advanced-Generation.ipynb [9] DANGLING_INTRO — annonce que la cellule suivante définit la classe FluxAPI, mais [10] = « 💡 Lecture complémentaire » interprétant la sortie de [8], le code de la classe étant en [11] CONFIRMED Échange des cellules [9] et [10]

3/3 CONFIRMED, 0 FALSE POSITIVE. Mécaniques appliquées telles que proposées par l'audit, sans écart.

Séquence obtenue

Les deux échanges de FLUX ne se contentent pas de réparer chaque annonce séparément : ils rendent la séquence cohérente de bout en bout.

[6] annonce (détection GPU)
[7] code  — détection GPU + chargement Diffusers
[8] 🎮 Lecture              — interprète la sortie de [7]
[9] 💡 Lecture complémentaire — complète la même sortie
[10] annonce (classe FluxClient)
[11] code  — FluxClient
[12] 🔧 Lecture            — interprète la sortie de [11]

Chaque lecture suit la sortie qu'elle interprète, et chaque annonce précède immédiatement son code.

Pourquoi le constat 1 se répare par reformulation et non par déplacement

[4] (« Ce troisième volet de la fondation Image assume un rôle précis dans la série… ») est une section d'orientation sur la place du notebook dans la série, légitimement placée après les paramètres Papermill et avant le code. La déplacer ferait plus de dégât que l'annonce qu'elle gêne. C'est donc l'annonce qui s'ajuste : le code d'initialisation est bien dans les cellules suivantes ([5]), au pluriel.

Preuves de non-régression

Aucune cellule de code n'est modifiée, donc aucune ré-exécution n'est due (C.2/C.3).

Contrôle Résultat
Invariant structurel (script de contrôle, HEAD vs arbre) 02-2-FLUX : multiensemble des cellules identique avant/après (réordonnancement pur), jeu d'id inchangé, ordre des cellules de code identique, execution_count et outputs inchangés. 01-3 : aucune position modifiée, seule la cellule mqt2vlh8yw change (la reformulation déclarée).
scripts/notebook_tools/check_exec_sequence.py MyIA.AI.Notebooks/GenAI/Image 24/24 CLEAN, 0 notebook DIRTY, 0 DUPLICATE / 0 UNORDERED / 0 NOT_FROM_1 / 0 GAP
scripts/notebook_tools/cell_order_ci.py --base <HEAD> --head <arbre> 2/2 notebooks : aucun finding
scripts/notebook_tools/check_cell_source_parses.py 0 finding
scripts/notebook_tools/check_duplicate_sections.py 0 porteur sur les 2 notebooks
Hooks pre-commit (H.3 execution_count, source-list newlines, #13326 cell-source compilable) tous verts au commit c11515560

Observations incidentes — signalées, non corrigées ici

  1. Même angle mort de l'organe que sur GenAI/Audio. scripts/notebook_tools/check_interp_positioning.py (EPIC EPIC: remise en ordre des cellules d'interpretation mal positionnees (desordre massif introduit par les enrichissements density #10488) #10678) rend 0 finding sur GenAI/Image avant et après cette PR — mesuré, comme sur l'autre tranche. Sa détection ne couvre pas le cas « interprétation placée avant le code de sa propre section ». Les 3 constats viennent donc de la lecture, pas de l'organe : le trou est dans la couverture, pas dans les notebooks, et il se répète sur deux séries indépendantes.
  2. 13 cellules de 02-2-FLUX-1-Advanced-Generation.ipynb n'ont pas d'id alors que le fichier déclare nbformat_minor: 5 (qui rend l'id obligatoire). Deux d'entre elles ([7] et [10] d'origine) sont précisément celles que cette PR déplace. Je n'invente pas d'id : en fabriquer changerait plus que le périmètre de la PR et masquerait le défaut. À traiter dans une passe dédiée sur la série.

Portée

Avec cette PR, mes deux tranches assignées sur #18053 sont livrées : GenAI/Audio (8 constats, PR #18073) et GenAI/Image (3 constats). See #18053 — l'issue porte 46 constats sur 17 séries et reste ouverte.

🤖 Generated with Claude Code

Tranche GenAI/Image de l'audit #18053 (ma seconde tranche assignée). Les 3
constats sont CONFIRMED à `main` après re-vérification (règle audit-reassessment) :

- 01-3-Basic-Image-Operations [3] : l'annonce « La cellule suivante initialise
  l'environnement Python... » ne précédait pas le code d'initialisation, qui est
  en [5] (la cellule suivante immédiate [4] est une section sur le rôle du
  notebook dans la série). Reformulation de l'annonce au pluriel, la cellule [4]
  restant légitimement entre les deux.
- 02-2-FLUX-1-Advanced-Generation [6] : l'annonce du code de détection GPU était
  séparée de ce code par la cellule « 🎮 Lecture » qui interprète sa sortie.
  Échange des cellules 7 et 8.
- 02-2-FLUX-1-Advanced-Generation [9] : même classe, l'annonce de la classe
  FluxClient était séparée de son code par une « 💡 Lecture complémentaire »
  interprétant la sortie de la détection GPU. Échange des cellules 9 et 10.

Après les deux échanges, la séquence devient : annonce → code → lecture(s) →
annonce → code → lecture, chaque lecture suivant la sortie qu'elle interprète.

Aucune cellule de code n'est modifiée : le multiensemble des cellules est
identique avant/après sur FLUX, l'ordre des cellules de code est identique sur
les deux notebooks, les `execution_count` et `outputs` sont inchangés. Le
contrôle de séquence d'exécution de GenAI/Image reste 24/24 CLEAN, 0 DIRTY.
Aucune ré-exécution n'est donc due (C.2/C.3).

See #18053

Co-Authored-By: Claude-Code <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

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@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 github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 30
  • 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

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 21.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 10.4s

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

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18075 (fix(genai-image,#18053): ordre de lecture — 3 constats annonce/lecture) 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.

Le deplacement de la cellule 🎮 Lecture apres la cellule de code [7] a
laisse DEUX lectures rattachees a la meme sortie (🎮 Lecture puis
💡 Lecture complémentaire), ce que le cliquet split-reading compte comme
une regression (SECOND_READING). Le mandat est de fusionner dans la
lecture existante, pas d'en ajouter une seconde : les deux paragraphes
sont donc reunis en une seule cellule.

Markdown seul, aucune cellule de code modifiee : pas de re-execution due
(C.2/C.3).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
La fusion precedente avait insere la lecture unifiee sans retirer la
cellule d'origine (slice cs[:9] au lieu de cs[:8]) : la sortie GPU portait
donc trois lectures (l'originale, la fusionnee, la transition) au lieu de
deux, et le cliquet split-reading comptait toujours une regression. La
cellule d'origine est retiree ; il reste une lecture et une transition.

Markdown seul, aucune cellule de code modifiee : pas de re-execution due.

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

jsboige commented Sep 27, 2026

Copy link
Copy Markdown
Owner Author

Le rouge bloquant du job Always-on guards etait Split-reading ratchet (base vs PR) (exit 2), reproduit en local :

python scripts/notebook_tools/check_split_reading_cells.py MyIA.AI.Notebooks/GenAI/Image \
    --base-ref origin/main --head HEAD

Cause, mesuree. Le deplacement de la lecture GPU apres la cellule de code a laisse deux lectures rattachees a la meme sortie (l'originale et la fusionnee), ce qui fait monter le compte par sortie de 2 a 3. Une premiere tentative de fusion avait insere la lecture unifiee sans retirer la cellule d'origine : le fichier portait alors deux cellules Lecture identiques en tete de bloc, et le compte ne redescendait pas.

Correctif. La cellule d'origine est retiree ; la sortie GPU ne porte plus qu'une lecture et une transition. cells : 44 -> 43.

Verification (apres le dernier commit, tete dc46928a3c) :

base origin/main | 2 carnet(s) modifie(s) | 0 en regression

Aucune cellule de code n'est modifiee : l'invariant est verifie par assertion sur source + execution_count + outputs des cellules de code, identiques avant/apres. Pas de re-execution due (C.2/C.3).

@jsboige

jsboige commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18075
head: dc46928
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2d17625bd12356fe3d823b4d75acb5cc6b3f48b0a0f0eeab4ced835ebdc59bbc
diff-files: 2
diff-additions: 8
diff-deletions: 16
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Prévalidation tierce à tête exacte, sans approbation ni décision de merge. Body, sept commentaires (dont le correctif post-commit du split-reading), aucune review, zéro thread inline, diff complet des deux carnets et issue #18053 lus. Les trois constats Image ont été confrontés aux cellules voisines : dans 01-3, l'annonce au pluriel couvre la section intercalaire puis le code [5] ; dans 02-2, l'annonce GPU [6] précède le code [7], sa lecture [8] suit sa sortie, l'annonce FluxClient [9] précède le code [10] et sa lecture [11] suit. Le correctif retire la lecture complémentaire devenue redondante au lieu de produire une double lecture.

Comparaison des blobs origin/main et tête : 43→43 cellules dans 01-3, 44→43 dans 02-2 ; les sources, execution_count et outputs de toutes les cellules code sont identiques et dans le même ordre. Le diff +8/-16 est markdown-only : aucune nouvelle exécution due par C.2/C.3, et aucune exécution locale de l'adjoint. Le check split-reading et son rejeu local rendent 0 régression ; les journaux exact-head Output-collapse et Source-collapse portent 0 flagged et la perte markdown 0 finding. check_run_state.py --pr 18075 : 87 jambes / 87 noms, aucun latest_red ni residual_red, PR gate SUCCESS ; B.0 rc=0. OPEN/MERGEABLE/CLEAN à la capture.

Collision de chemin advisory avec #18074 sur 01-3 : #18074 ré-exécute ce carnet et réaligne sa prose quantitative. Elle est OPEN ; ai-01 devra vérifier l'ordre d'intégration et le résultat fusionné avant merge, sans supposer que les deux PRs sont indépendantes. #18053 reste ouverte pour ses autres séries. Décision finale réservée à ai-01.

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