Skip to content

fix(genai,#18574): aligne la consigne du fondu enchaîne sur sa solution (Video/01-1) - #19632

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

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

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

Objet

See #18574 — deuxième des quatre PR issues du verdict de seconde passe, qui a classé À MUSCLER l'exemple guidé 1 de 01-1-Video-Operations-Basics.ipynb (contribution @kaiiine, PR #18484) : la consigne prescrit un autre geste que la solution.

Le défaut, mesuré

Consigne (avant) Solution (cellule 14, inchangée)
Effet de bord clip.fadeout() / clip.fadein() vfx.CrossFadeOut / vfx.CrossFadeIn
Assemblage « concaténer avec une transition de 0,5 s » concatenate_videoclips(..., method="compose", padding=-0.5)
padding jamais nommé c'est tout le geste (le chevauchement)
Indice donné vfx.FadeOut(duration) / vfx.FadeIn(duration) —

Or la lecture du même exemple (cellule 15) écrit noir sur blanc : « Un simple FadeOut/FadeIn aurait au contraire fait passer l'image par le noir. » Un étudiant qui suivait les étapes obtenait donc exactement le résultat que la lecture déclare faux — et sans jamais voir le padding, il ne pouvait pas deviner le chevauchement.

Correction

Étapes et indices réécrits pour prescrire le geste réel : CrossFadeOut sur la fin de chaque segment (sauf le dernier), CrossFadeIn sur le début de chacun (sauf le premier), et l'assemblage par chevauchement avec padding négatif nommé. Un indice explicite écarte la confusion CrossFade* (les deux plans se superposent, ~50 % d'opacité) / Fade* (fondu vers le noir), et donne la durée attendue comme signature du chevauchement : 5 s - 2 × 0,5 s = 4 s.

Second point, fermé sans ajouter de code. La durée comparée était partiellement circulaire : 4.00s « obtenue » venait de result.duration, une propriété de la composition en mémoire, comparée à une formule arithmétique — jamais une re-sonde du fichier écrit. Plutôt que d'ajouter une sonde (ce qui aurait imposé une ré-exécution), la lecture cite la re-sonde indépendante qui existe déjà en Section 3 : ffmpeg.probe sur crossfade.mp4 → 4.0 s. Les deux mesures concordent, et c'est la seconde — extérieure à moviepy — qui ferme la vérification.

Pourquoi markdown-only (et pas de ré-exécution)

Aucune cellule de code n'est touchée. La re-exécution a été mesurée avant d'être écartée : le carnet relancé tel quel donne 14 sorties différentes sur 31 (4 images PNG non déterministes à ~40 octets près, plus des durées et benchmarks), soit ~260 Ko de base64 churnés — un diff de plusieurs centaines de Ko pour une correction d'un paragraphe. Le correctif relève donc de l'exception C.2 (markdown-only) : execution_count et outputs restent ceux de la passe réellement exécutée.

Pour mémoire, la mesure a exigé de réparer l'environnement (règle F) : ffmpeg-python et decord manquaient sur l'interpréteur du kernelspec python3 — les installer était la condition pour distinguer une ré-exécution fidèle d'une dégradation silencieuse.

Validation — organes passés

Organe Verdict
check_null_exec (H.3 pre-commit) OK
check_cell_source_parses 0 finding
check_credited_examples 3 → 3, 0 perdu (crédit @kaiiine intact)
check_interp_positioning 0 finding
check_c2_compliance · check_notebook_outputs_required 1/1 conforme · 0 défectueux
check_prose_quantitative_claims --diff (bloquant) OK — aucun compteur quantitatif en prose
restore_accents_canonical --check 7 à curer — identique à la base (0 introduit)
Pré-commit H.3 · #13326 Passed

Pré-existants, signalés (non touchés)

  • check_split_reading_cells : generic_pair cellules [15, 16] — présent à l'identique sur origin/main, avant toute modification.
  • restore_accents_canonical --check : 7 accent(s) in 5/25 markdown cells — même compte en base et en tête. Curer ces accents est une tranche d'accents au sens du ruling Rollout deaccent repo-wide : piloter les tranches par serie (~946 notebooks candidats) #16638, qui exige que rien d'autre que les accents ne change dans la PR : les mêler ici violerait cet invariant. Hors périmètre, à traiter par sa propre tranche.

Suivi

Restent À MUSCLER : Image/01-1 (exemple 3, comptage de mots du prompt sans rapport avec l'image) et Texte/06 (exemple 1, le PDF jamais exercé).

🤖 Generated with Claude Code

…on (Video/01-1)

La consigne de l'exemple guide 1 prescrivait `clip.fadeout()` / `clip.fadein()` --
un fondu vers le NOIR -- et ne nommait jamais `padding`, alors que la solution fait
un fondu ENCHAINE (`vfx.CrossFadeIn`/`vfx.CrossFadeOut` +
`concatenate_videoclips(method="compose", padding=-0.5)`) et que sa propre lecture
declare qu'« un simple FadeOut/FadeIn aurait au contraire fait passer l'image par le
noir ». Un etudiant qui suivait les etapes obtenait donc exactement le resultat que
la lecture declare faux.

Etapes et indices sont reecrits pour prescrire le geste reel : `padding` negatif
nomme, et la confusion CrossFade* / Fade* explicitee.

La duree comparee etait en outre partiellement circulaire (formule arithmetique
contre propriete de la meme composition, jamais une re-sonde du fichier ecrit).
Elle est fermee en CITANT la re-sonde independante qui existe deja en Section 3
(`ffmpeg.probe` sur `crossfade.mp4` -> `4.0` s), sans ajouter de code.

Correctif markdown-only : aucune cellule de code touchee, exception C.2, pas de
re-execution due. Le diff se limite a 10 insertions / 8 suppressions.

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

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

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 10.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 9.9s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 25.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 13.3s

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

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

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19632
head: 67fe45e
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 51bdb819f92995cca19fbeb2ea1fe4d3f808058162f277df90bd66c2f1985efa
diff-files: 1
diff-additions: 10
diff-deletions: 8
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 19632
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19632
head: 67fe45e
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 30c7fca24ad52b439a6ca09057f76d41c7b1ebc30728de157eaa9ca599dd414b
supersedes: 1
supersedes-why: re-stamp du dossier READY antérieur (cmt 6030466574, c518) — surfaces changées (51bdb819 -> 30c7fca2) par activité de la PR depuis (comments 6 -> 7). Le verdict READY tient à la nouvelle tête exacte.
diff-files: 1
diff-additions: 10
diff-deletions: 8
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 19632
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 3292af9 into main Oct 7, 2026
94 of 97 checks passed
@jsboige
jsboige deleted the fix/18574-muscle-video01 branch October 7, 2026 07:55
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