Skip to content

feat(genai,#18574): volet PDF sur l'exemple guide 1 de Texte/06 -- reportlab enfin servi - #19642

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/18574-muscle-texte06
Oct 7, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/18574-muscle-texte06

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2024:CoursIA — prev: MED/notebook-python #19639

Objet

Seconde passe #18574 (item 6) sur GenAI/Texte/06_PDF_Web_Search.ipynb, exemple guidé 1 (contribution étudiante de Clarisse DEL CASTILLO, PR #18567).

Verdict : À MUSCLER. L'exemple est sain en lui-même — mais le carnet s'intitule « PDF et Web Search », et le PDF n'y est jamais exercé : reportlab est installé dès la cellule 2 et n'est jamais importé. La cellule 6 va jusqu'à annoncer « Conversion PDF → Image : … (méthode utilisée ici) », ce qui est faux — aucune conversion n'a lieu, une image est dessinée directement avec Pillow.

Ce que l'exemple faisait, et l'organe manquant

La résolution de l'étudiante crée une image PIL avec un tableau de ventes (Janvier 120k → Avril 180k EUR), l'envoie à l'API Vision, affiche le résultat. La Lecture était déjà honnête sur la limite (« les valeurs sont écrites dans l'image : lecture de texte, pas de graphique »).

Ce qui manque est l'organe que le titre du carnet promet : un document PDF, source documentaire réelle. La cellule 6 classait le support natif des PDF comme option « plus complexe » et ne l'exerçait jamais.

Le geste : purement additif

  • Nouvelle cellule (pdfws-eg1-pdf-volet, insérée après la cellule d'affichage de l'étudiante) : le même tableau — on réutilise sa variable ventes — composé en vrai PDF d'une page A4 avec reportlab (première utilisation de la dépendance installée), envoyé nativement à l'API comme partie de contenu type: "file". Même question que l'image : la lecture est-elle aussi fiable sur un PDF ?
  • Cellule 6 corrigée (markdown only) : le faux « (méthode utilisée ici) » devient la description de ce qui est réellement exercé — la voie native, que la section 1 présentait comme inaccessible.
  • Cellule 9 : un paragraphe signale la seconde passe ; les cellules de l'étudiante (10, 11) sont conservées byte-identiques, vérifié par assertion dans le script d'édition.
  • Lecture réécrite sur les sorties réellement commises (voir ci-dessous).

Ce que l'exécution établit

Les deux lectures sont identiques sur les faits — quatre valeurs exactes des deux côtés, mêmes variations (+25/+15/+20 kEUR), même +50 % total, même CAGR ≈ 14,5 %/mois. Deux différences mesurées :

  • Coût : l'appel image consomme 971 tokens, l'appel PDF 1 157 (+19 % pour le même contenu — le PDF transporte sa structure en plus de son texte).
  • Portée : la lecture PDF produit en plus une projection pour mai (≈ 200 à 206 kEUR selon la méthode) que l'appel image n'avait pas donnée.

La prétention de la section 1 (« l'API n'accepte pas les PDF directement ») est réfutée par l'exécution.

Témoins hors ligne (avant tout appel payant)

  • Le PDF généré a été validé avant le run : 1 page A4 valide (%PDF-1.3, %%EOF), et pypdf en extrait le texte exact — la vérité terrain de la lecture du modèle ne dépend pas de lui.
  • Une sonde minimale (16 tokens) a confirmé que l'API accepte la partie type: "file" avant de lancer le run complet — éviter de brûler 18 cellules sur un 400 prévisible.

Gates locales

Garde Résultat
check_output_failure_text.py origin/main 1 changed notebooks | 0 regressed, RC=0
check_c2_compliance.py --path <carnet> 1/1 notebooks compliant — All clear!
Exécution canonique (notebook_tools.py execute --batch-mode) SUCCESS, 18/18 cellules, 0 erreur (241,5 s), sorties committées
Dérive kernel 3.10.11 → 3.13.7 — transition pré-acceptée (CANONICAL_LANGUAGE_TRANSITIONS, #19181, cas fondateur cité mot pour mot)
Le ratchet output-failure sur ce carnet stable à la re-exécution (scan sans et avec base : 0/0/0) — le piège #19638 ne s'y applique pas

See #18574 — l'item 6 couvre dix carnets ; celui-ci est le deuxième livré par cette lane (après #19639). Résiduel noté : la section 3 (« Combiner PDF et Web Search ») promet des « rapports PDF » et travaille sur l'image — tranche séparée si le coordinateur la veut.

🤖 Generated with Claude Code

…portlab enfin servi

Seconde passe item 6 : le carnet s'intitule "PDF et Web Search" mais le PDF
n'y etait jamais exerce -- reportlab installe en cellule 2, jamais importe.
Volet purement additif apres la resolution de l'etudiante : meme tableau de
ventes (sa variable `ventes`), compose en vrai PDF d'une page A4, envoye
nativement a l'API en piece jointe (type: file). Cellule 6 : le faux
"(methode utilisee ici)" decrit desormais la voie reellement exercee.
Lecture re-alignee sur le run commite : lectures identiques sur les faits,
971 tokens (image) vs 1157 (PDF, +19 %), projection mai en plus.

Run canonique notebook_tools execute --batch-mode : SUCCESS, 18/18 cellules,
0 erreur, sorties commitees. Temoin hors ligne : pypdf extrait du PDF le
texte exact qui y a ete compose. Kernel 3.10.11 -> 3.13.7 : transition
pre-acceptee (CANONICAL_LANGUAGE_TRANSITIONS, #19181).

Cellules de l'etudiante (10, 11) byte-identiques, verifiees par assertion.

See #18574

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

github-actions Bot commented Oct 7, 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 7, 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 8.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 23.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 12.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 11.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 8.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 8.8s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 50.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 26.7s

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

@github-actions

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19642
head: f462520
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 138caf77247c0259f59988b53cbac8c7db6a85c08730481bfac009abe1208e6b
diff-files: 1
diff-additions: 641
diff-deletions: 173
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 19642
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit be23814 into main Oct 7, 2026
94 of 96 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.

2 participants