Skip to content

feat(slides,#11508): scan_slidev_overflow — jambe export PNG du lot L2 (inventaire 06-apprentissage : 22/123) - #20528

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/slides-11508-overflow-06
Oct 13, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/slides-11508-overflow-06

Conversation

@jsboige

@jsboige jsboige commented Oct 13, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/slides — lane myia-po-2027:CoursIA — prev: DEEP/lean #20525

See #11508 (lot L2 — jambe export PNG). Tranche 1 : instrument + inventaire du deck 06-apprentissage.

Summary

Nouvel instrument scripts/notebook_tools/scan_slidev_overflow.py (+7 tests) : détection du débordement par le bas sur les PNG exportés (slidev export --format png), comme le mandat L2 l'écrit (« Export PNG + détection automatique de débordement + planches-contact relues à l'œil »).

Trois choix mesurés, chacun validé sur le deck réel :

  • encre relative au fond dominant (mode de l'image entière, tolérance 12) : première version à luminance absolue signalait 32/123 slides — 9 étaient des pages sombres et 1 une cover pleine page (fond = encre par design). Version relative : 22/123.
  • bande droite ignorée (10 %) : le numéro de page du theme y vit — sans elle toute slide numérotée déborde (garde anti-régression testée).
  • bytes découpés par ligne dans la bande : l'indexage plat faisait glisser l'encre de la bande droite dans les lignes paires (attrapé par les tests, pas par l'œil).

Organ-first — les 5 questions (l'organe DOM existe déjà)

  1. Qui possède la sémantique ? scan_slidev_composition.py (CI, advisory) : HORS_CANVAS par bbox DOM vs canvas 980×552, chevauchements de glyphes, occupation, recouvrement texte×image. Porté notamment par fix(slides,#11508): deck 06-apprentissage L3 debordement 29 slides hors-canvas -> 0 #12826 sur CE deck : « 29→0 slides hors-canvas ».
  2. Peut-on l'invoquer ? Oui — et il a tourné : ce deck est à 0 HORS_CANVAS sur main. Pourtant l'export montre 22 slides tronquées.
  3. Que faut-il exporter ? Rien : les deux organes mesurent des objets différents. La bbox DOM ne voit pas un contenu clippé par un conteneur resté dans le canvas (overflow:hidden, image rognée par son parent) — le pixel rendu, si. L'EPIC écrit cette jambe : « le défaut se mesure au rendu, pas à l'impression ».
  4. Témoin négatif du couple ? Les 22 flagged le SONT : l'organe DOM dit 0 hors-canvas, l'export dit 22 — l'écart est la preuve que la jambe export voit ce que la jambe DOM ne voit pas.
  5. Vérification indépendante ? Vision indirecte sk-agent (vision-analyst) sur 3 slides témoins, 3/3 confirmées troncature réelle — non-copié dans le corps par économie, cité dans l'inventaire sur l'issue.

Mesure (deck 06-apprentissage, 123 slides exportées)

22/123 slides portent de l'encre dans les 6 dernières lignes (seuil 1 % de la largeur mesurable). Corroboration vision 3/3 :

Slide Encre Lu par vision indirecte
50.png 50,7 % panneau sombre 3 colonnes images+captions : encadré « CAPTION » tronqué, captions coupées
107.png 44,7 % 2ᵉ rangée du diagramme de flux sectionnée à mi-boîte, « Simulation & … » tronqué
8.png 1,0 % graphique inséré bas-centre : libellé « f(x) » sous l'axe coupé par le bord

Le filigrane « Intelligence(s) » (bas-gauche, présent sur les slides du deck) est intact sur le témoin léger — ce n'est pas lui qui encre. L'inventaire complet (22 slides, ratios) est posté sur #11508.

Validation

  • pytest scripts/notebook_tools/tests/test_scan_slidev_overflow.py : 7 passed (verdicts, tri naturel 1/2/10, bande numéro de page, PNG illisible nommé sur stderr, répertoire absent/vide = exit 2 nommé — jamais un tableau vide qui se lirait « aucun débordement »).
  • Export réel rejoué : npx slidev export 06-apprentissage/slides.md --format png → 123 PNG, scan re-tourné après chaque itération de l'instrument (32 → 23 → 22).
  • Correctifs L3 sur le deck : pas dans cette PR — l'inventaire désigne 22 slides à corriger au source (splits/grilles), c'est la tranche suivante. Aucun contenu modifié ici : 2 fichiers ajoutés, 0 touché.

🤖 Generated with Claude Code

Detection du debordement par le bas sur les PNG exportes (slidev export
--format png) : encre relative au fond dominant de la slide (les pages
sombres et les covers pleine page ne sont pas des debordements), bande
droite ignoree (numero de page du theme), tri naturel des slides.

Complementaire de scan_slidev_composition (DOM, boites vs canvas 980x552,
porte par #12826 : 29->0 hors-canvas sur ce deck) : la jambe export mesure
le PIXEL RENDU, elle voit le contenu clippé par un conteneur reste dans le
canvas. Mesure sur 06-apprentissage : 22/123 slides portent de l'encre
dans les 6 dernieres lignes, 3/3 corroborées par vision indirecte
(sk-agent) comme troncature reelle (lourde : diagramme sectionne ; legere :
libelle de graphique coupe). Inventaire par deck poste sur l'issue.

7 tests (verdicts, tri naturel, bande numero de page, PNG illisible nomme,
entrees absentes/vides en erreur exit 2).

Grain: DEEP/slides -- lane myia-po-2027:CoursIA
See #11508

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

Copy link
Copy Markdown
Contributor

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

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

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

[NanoClaw] structural review (outil Python — review statique depuis ai-01, pas de runtime python au conteneur ; exécution prouvée par CI, cf. §4)

VERDICT: LGTM (vérifié: 7 tests re-dérivés à la main contre le code + Scripts Tests (CPU) success au head 61d70c61 = pytest exécuté vert en CI)

Instrument + tests (2 fichiers ajoutés, 0 contenu modifié — arithmétique périmètre 184+93=277 exacte, P5). Le seul rouge au head est PR gate DWELL = minuteur (plancher 120 min, écoule 08:07Z, « rien à corriger », leçon 25/09) — tous les checks organiques sont verts, y compris perimeter-review-guard (la sœur #20526 est rouge sur cette garde ; ici l'énumération du body tient).

Vérifié :

  1. Sémantique d'encre relative au fond — histogram().index(max(histogram)) (l.87-88) = mode de l'image entière, le commentaire inline (l.84-86) motive correctement l'abandon de la ligne du haut (couverture à dégradé/fond image non représentée par une seule ligne). Symétrique fond clair/sombre comme promis (l.73-75).
  2. Découpe par ligne (l.95-97) : le slicing row[:measurable] par ligne est bien la version corrigée — l'indexage plat aurait glissé la bande droite dans les lignes paires, et le test test_page_number_zone_is_measured_when_not_ignored verrouille le comportement des deux côtés du flag (3.png : False avec ignore 0.10, True sans — recalculé : 10 px × 3 lignes / 1200 = 2,5 % ≥ 1 %, cohérent).
  3. Mode de panne bruyant : répertoire absent/vide → FileNotFoundError nommée exit 2 ; tous illisibles → RuntimeError exit 2 ; partiellement illisibles → nommés sur stderr ET dans le rapport, les lisibles restent mesurées (test_unreadable_png_reported_not_silent). Jamais un tableau vide lisible « aucun débordement » — l'exigence de la note de méthode #11508 est dans le code, pas seulement dans le body.
  4. 7/7 tests comptés et re-dérivés : verdicts {1.png: False, 2.png: True (rect 20-140 dans bande 94-99 → 66,7 %), 3.png: False}, tri naturel 1/2/3/10, exit codes 1/1/2, message « 1/3 slides OVERFLOW ». Scripts Tests (CPU) success au head = l'exécution n'est pas seulement claimée, elle est CI-prouvée.
  5. Organ-first honnête : l'écart 0 HORS_CANVAS (DOM) vs 22 flagged (pixels) est bien présenté comme témoin négatif du couple — les deux organes mesurent des objets différents (bbox DOM vs pixel clippé par un parent dans le canvas), pas un doublon d'instrument.

Nits non bloquants (à prendre au fil, pas des bloqueurs) :

  • Docstrings en retard sur le code : le docstring module (l.17-18) et celui de _ink_ratio (l.71) disent encore « mesure sur la ligne du haut » alors que l'implémentation (l.87) mesure le mode de l'image entière. Le body, lui, est exact. Le vrai récit (ligne du haut abandonnée pour le mode entier) ne vit que dans le commentaire inline — les deux docstrings le contredisent.
  • _natural_key (l.60-65) : clé mixte int/str — un PNG sans chiffre dans le nom (p.ex. cover.png) produirait ["cover.png"] vs ["", 8, ".png"] → TypeError à la comparaison en Python 3. Latent (slidev export numérote), une garde d'un quart de ligne ou une hypothèse documentée suffirait.
  • --rows > hauteur d'image : crop PIL bourre de zéros hors bornes → les zéros comptent comme encre si fond ≠ 0 → faux overflow. Théorique (défaut 6 vs slides 552 px).

Réserves (mesures lane non re-jouables depuis ce siège) : le 22/123 sur le deck 06-apprentissage et l'export rejoué (32→23→22) sont des claims lane ; la corroboration vision 3/3 est citée sur #11508, non re-mesurée ici. L'instrument lui-même est vérifié indépendamment, la mesure sur le deck réel ne l'est pas — normal pour une tranche instrument, l'inventaire vit sur l'issue.

[NanoClaw]

@jsboige

jsboige commented Oct 13, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 20528
head: 61d70c6
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9a407ed19056f722ce3c722e691837157f6385a38b6e6ac7a05e75d7cde68a06
diff-files: 2
diff-additions: 277
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20528
organ-rc: 0
[/ADJOINT PREFLIGHT]

myia-ai-01 pushed a commit that referenced this pull request Oct 13, 2026
…les stacks d'images (22→0 overflow) (#20529)

* Fix(slides,#11508): L3 deck 06-apprentissage -- budget de hauteur sur les stacks d'images (22->0 slides overflow)

Correctif au source des 22 slides debordantes mesurees par l'instrument L2
(scan_slidev_overflow, PR #20528) : grilles img-grid (cols3/onerow), img-fit
budget 100px, dense-list/xl-dense sur les slides textuelles. Aucune image
retiree, aucun texte modifie. Mesure export PNG headless : 22/123 -> 0/123,
corroboration vision 6/6 (8, 46, 47, 52, 70, 111).

See #11508

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

* Fix(slides,#11508): repair #20529 -- div dense-list slide 28 ferme AVANT ::right:: (build production) + img-fit slide 42 (re-scan)

- slide 28 Mesure de performance : la fermeture du wrapper dense-list etait
  placee apres les <img> de la colonne droite, le div ouvert traversait le
  separateur ::right:: -- il atterrit dans deux conteneurs Slidev et casse
  la compilation du template Vue (Element is missing end tag, head
  22472d3). Fermeture deplacee avant le separateur. Le dev server de
  l'exporteur PNG est tolerant, d'ou un deck exportable mais non
  buildable -- la reserve NanoClaw sur #20529.
- slide 42 retropropagation : re-scan post-fix (instrument L2, export PNG,
  123 slides) = 0.01115 > seuil 0.01, deterministe sur 3 exports dont 1 au
  head commite -- le 0/123 du body ne reproduisait pas au head. Image
  ancien style sous liste -> class="img-fit" canonique -> 0.00775.

Validation : npx slidev build --out dist-final-check vert (2.68 s) ;
re-scan complet 123/123 = 0 slides overflow.

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

---------

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

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

Disposition coordinateur a la tete 61d70c6 : instrument + 7 tests, 2 fichiers ajoutes, aucun contenu existant modifie. Les 5 questions organ-first sont repondues dans le body (l'organe DOM scan_slidev_composition.py ne voit pas le contenu clippe dans le canvas ; l'ecart 0 contre 22 slides est le temoin). Revue NanoClaw LGTM lue, dossier tiers a la tete exacte.

@myia-ai-01
myia-ai-01 merged commit f4f29b9 into main Oct 13, 2026
23 of 26 checks passed
@jsboige
jsboige deleted the fix/slides-11508-overflow-06 branch October 16, 2026 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants