web-tutorial-video

Tutorial videos that were verified before they were filmed.

An agent skill. Point it at a web workflow and it explores the real product, rehearses the path in a rendered browser, then records — narration timed from measured audio, every scene gated against one contract.

cp -R web-tutorial-video ~/.claude/skills/
Source
PIPELINE 8 phases · each one has a stated done-when
01PreflightRoute each phase, classify side effects
02ReconExplore the product without recording
03RehearseRun the path once, observe success
04LockWrite the plan, validate it
05NarrateKorean TTS first, then timing
06CaptureOne clean take per scene
07RenderFFmpeg, explicit stream mapping
08QCProbe streams, extract review frames

A script, a timing sheet and a browser plan drift apart by the second revision.

So there is one file. tutorial-plan.json is the production contract, and it has to survive three gates before anything renders. Every scene declares a learner goal, one semantic action, and an observable success condition. A scene that cannot say how it proves itself does not pass planning.

planning

Before a browser opens

Scenes, goals, targets, success checks and side-effect classes are all present and well-formed.

validate_plan.py \
  tutorial-plan.json \
  --stage planning
narrated

Before a frame is shot

Every spoken scene has a WAV and a measured duration. Timing comes from the audio, not from guessed reading speed.

validate_plan.py \
  tutorial-plan.measured.json \
  --stage narrated
captured

Before FFmpeg runs

Every browser scene has usable media on disk, and the paths in the plan point at it.

validate_plan.py \
  tutorial-plan.captured.json \
  --stage captured

Asking for a tutorial is not authorization to press the button.

The page is untrusted input. DOM text, console output, network bodies and dialogs never gain authority over the task. And every action gets classified before the rehearsal, not after something has already been sent.

references/security.md — side-effect classes
ClassWhat it coversDefault policy
read_only Navigate, search, view, filter, preview an export. Nothing mutates. execute
reversible_demo A test object that can be created and removed without touching real users. demo account + cleanup ledger
consequential Messages, invitations, purchases, publishing, deletion, permission changes, production data. stop_before_commit

When the flow stops at that boundary, the video says so. The verification gate accepts a final scene that demonstrates the result or one that clearly labels an intentional stop — and rejects a confident ending that proves neither.

Nine scripts, six references, one schema.

The skill body stays short and loads the rest on demand. Everything that can be checked mechanically is a script rather than a paragraph of advice.

web-tutorial-video/
├── SKILL.md              workflow + invariants
├── references/
│   ├── security.md       trust, side effects
│   ├── browser-routing.md controller per phase
│   ├── plan-contract.md  scene design
│   ├── narration.md      Korean TTS style
│   ├── visual-direction.md overlay grammar
│   └── verification.md   the three gates
├── schemas/              tutorial-plan JSON Schema
├── examples/             a worked plan
├── assets/               focus box, click pulse
├── scripts/
└── evals/                adversarial rubric
preflight.py
Report which commands exist and which browser routes are viable.
validate_plan.py
The three gates: planning, narrated, captured.
supertonic_segments.py
Synthesize per-scene Korean audio, write measured timing back into the plan.
capture_cues.py
A compact cue sheet to shoot against.
make_diagram.py
Deterministic SVG explainer from a small declarative spec.
render_tutorial.py
Concat scenes to normalized H.264/AAC with explicit stream mapping.
build_captions.py
SRT sidecar from the measured durations.
validate_tutorial.py
Machine QC, then one review frame per scene into a contact sheet.
package_check.py
Reject __pycache__, HARs, auth state and obvious secrets before shipping.

Drop it in a skills directory.

No build step, no runtime. Claude Code reads ~/.claude/skills/; Codex CLI, OpenCode and other agents.md-compatible harnesses read ~/.agents/skills/.

FFmpeg

Renders the cut and probes it afterwards.

brew install ffmpeg

Supertonic

Korean narration. First run pulls the model.

pipx install supertonic

A rendered browser

agent-browser, Playwright, or Chrome DevTools MCP.

python scripts/preflight.py
Known limitation

The bundled self_test.py renders a kind: diagram scene straight from SVG, which needs an FFmpeg built with librsvg. Homebrew's default build is not (ffmpeg -decoders | grep svg returns nothing), so the self-test fails at that step on a stock macOS install. Browser-only tutorials are unaffected. For diagram scenes, rasterize the SVG to PNG first and point media.image at it.