一键导入
lesson-verification
Use when checking a completed Remotion education video for lesson accuracy, visual clarity, narration, captions, music, and render readiness.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when checking a completed Remotion education video for lesson accuracy, visual clarity, narration, captions, music, and render readiness.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Viewer-first discipline for early-childhood Remotion lesson scenes. Before any choreography or JSX, the subagent must inhabit the kid's eye — measure how the smallest teaching mark and the smallest label actually render at the composition size, declare disjoint visual zones, refuse decoration. Pairs with visual-discipline (contract mechanics) and early-childhood-visual-taste (color/tone).
Use when writing per-cue teacher narration and captions for a Remotion lesson. The narration is COMMENTARY ON THE VISUAL — Wave 2a's per-cue motion budget is the input, and you write narration to fit each cue's budget. No invented hold timings.
Concrete visual discipline for Remotion lesson scenes — Visual Contract before choreography, one-metaphor rule, container earns existence, occupancy budget, semantic groups dominate visual groups, render-and-self-critique loop, iteration economy. Pairs with kids-eye (viewer-first) and early-childhood-visual-taste (color/tone).
Compose the Remotion lesson scene from approved upstream artifacts (Visual Contract, audio-captions intent, ASR-aligned cue boundaries, sketch-overlay schedule). Wave 4 of the lesson pipeline. NEVER hardcodes frame numbers; every timing derives from cue boundaries.
Visual taste — palette, tone, motion vocabulary — for early-childhood Remotion math lessons. Companion to kids-eye (viewer-first) and visual-discipline (Contract mechanics). Use during Wave 2 visual-design to set the lesson's visual language AFTER the kids-eye measurement block and BEFORE the Visual Contract.
Specify teacher-mark overlays (Excalidraw-style hand-drawn ink) for a Remotion lesson scene. Wave 4 (parallel with composer). Marks are specified in CUE-RELATIVE frames, never master-timeline absolutes. Restraint is the rule.
| name | lesson-verification |
| description | Use when checking a completed Remotion education video for lesson accuracy, visual clarity, narration, captions, music, and render readiness. |
Purpose: Verify the finished lesson before delivery.
Load lesson-data/<id>/<lesson-id>-contact.png first and only. This is one image containing the midpoint frame of every cue in narrative order — built automatically by scripts/make-contact-sheet.mjs at the end of lesson:render. The companion <lesson-id>-contact.json maps each tile (row, col, index) to its cue id and midpoint frame.
Why one image, not per-cue PNGs: an MP4 teaches across cues, not within a single frame. Reviewing per-cue PNGs in isolation lets aesthetic-checked-✓-per-frame results hide an arc that doesn't teach. Look at the whole strip and answer the one question that matters:
Would a child who doesn't already know this lesson learn it from this video?
If the answer is yes, the lesson passes the contact-sheet check. If no, name the cue(s) that break the arc — only then drill into per-cue PNGs or scrub the MP4.
Anti-pattern: opening verification-frames/cue-*.png one at a time and writing a per-frame checklist. That's how the visual-bug class survives — every frame "looks fine in isolation" while the lesson fails to teach. Do not do this.
After the contact-sheet review, cross-check the Wave 4 composer outputs:
lesson-data/<id>/bbox-manifest.json. The fast linear summary.collisionCount should be 0. Then read the measured block (written by npm run lesson:check -- --config <cfg> --measured): summary.measuredCollisionCount and summary.gatesFailed. The measured pass renders motion-peak frames and reads each element's TRUE getBBox(), so it catches easing-overshoot and between-keyframe overlaps the linear path is blind to — treat a measured-only collision as a real candidate, open the matching out/<id>/measured-frames/f<frame>.png, and rule it a true overlap or a by-design adjacency (a whole-card stacked on its diagram, etc.) IN WRITING. Also read the gate verdicts in measured.gates: lufs (voice integrated loudness vs −16 LUFS / true peak ≤ −1 dBFS), captionRedundancy (caption ≈ narration per cue — flags clutter; literacy/pinyin exempt), contrast (WCAG ≥ 4.5:1), legibility (glyph ≥ 24px), motionFast (WARN-only). Any non-zero collision (linear OR measured) or failed gate must either be fixed (kick back to composer) or carry an explicit written justification in this report — silent acceptance is forbidden; a SKIP: <reason> is acceptable but must be acknowledged.lesson-data/<id>/primitive-checks/*.png exist, inspect each. Does the primitive read as the visual-design §5 acceptance criteria specify (e.g. "kid reads 'sticks tied with a bow'")?SceneElement entry in src/lessons/<camelLessonId>/manifest.ts.A frame can look correct yet show a word the audio never speaks, or hold a learner-response beat as silent dead air. The contact sheet alone won't catch these — walk every cue against lesson-data/<id>/script-cues.json:
src/lessons/<camelLessonId>LessonScene.tsx (DialogueExchange lines, ReadAlongHighlight word glyphs, name tags) against that cue's spoken phrase in lesson-data/<id>/script-cues.json. The on-screen target strings must be a SUBSET of the cue's spoken phrase, in spoken order. FLAG any on-screen word the cue's audio does not speak — e.g. a bubble that shows a word carried over from an earlier cue, or lifted from the brief, that this cue's audio never speaks. This is a HARD finding mapped to W4a composer.gap.reason === "learner-response", confirm the scene holds a READABLE "your turn" affordance during the gap window — a localized label ("你来说" / "Your turn") + a pulse/ring on the read-along row + a speech/mic glyph. A bare low-opacity glow with no label/icon FAILS (it reads as awkward silence, not an invitation to speak). HARD finding mapped to W4a composer.audio-cues.json)The master loudness target (≈ −16 LUFS / TP ≤ −1 dBFS) is the lufs gate above — do not re-measure it by hand. These are the QUALITATIVE checks that gate can't make; scrub the MP4 with sound on:
ta-da fires once. SFX sit below the voice.toneSafe): the spoken tone is unmistakable over the bed — no melodic motif competes with the lexical pitch.The final verdict (GREEN / YELLOW / RED) cites:
audio-cues.json present): melody-under-narration, 3-point duck, SFX discipline, lufs gate verdictaudio-captions.md and visual-design.mdThe contact sheet is the canonical review surface. The bbox/primitive artifacts complement it.