Your agent turns a hit video into a template.
Give it a YouTube link or a video file. It measures the timing, checks every cut, and hands back the section lengths, voice-over pace and opening rules your next video can follow. Every number says whether a script measured it, YouTube supplied it, or your agent judged it from a frame.
For founders and marketers who make video for a business, and who have copied a video's structure by eye and got the pacing wrong.

opvs-skills install @di-atomic/video-analyst --to ./skills-cacheUse --to, not --runtime: the scripts are the skill. Then say: “watch this video and make a template” or “break down how this intro is built”.
Why a summary is not a template
"a fast-paced product intro with a friendly presenter and clear demos" → no section lengths → no voice-over pace → one pace for the whole video → cuts guessed by a scene filter → no idea how many videos back it → nothing the Director can read (nice to read, nothing to follow)
On a promo with 9 known cuts, the scene-filter thresholds that two popular tools document found none of them.
sections hook 1.6s · promise 3.8s
context 33.1s · 4 demo steps
recap 6.2s · cta 5.9s
pace 168.7 wpm, from the captions
opening speech at 0s · face by 3s
rhythm per section, every cut checked
strength single · emerging · established
labels measured · platform · judged
director director_input, ready to fill
Linear's intro as a template. The video-director reads it without anyone editing it by hand.
A summary describes one video. A template shapes the next one.
Five checks, and each one prints a number
verify-observationBlocks a video record with an untraced number, a missing label or a shot rhythm nobody checked. Medians and rates are recomputed, never typed.verify-templateRe-derives every number in a template from its source videos. It shares no code with the builder, so one bug cannot pass both.verify-cutsThe control test. Detected cuts against a video whose cuts are known, at ±2 frames. Recall 1.00 and F1 1.00 on the bundled control.estimate-frame-tokensRecomputes the run's image-token cost from the actual frame sizes. A declared total that is off by more than 1% fails.verify-coordinationConfirms the four OPVS surfaces are wired: the card, the template library, memory and the protocol.What you actually get
Link or file in, template out
Captions come first and cost nothing in image tokens. Frames are pulled only where a judgment needs eyes. Each video becomes one record; videos of one kind become one template your library keeps by name.
Every number labelled
Scripts measure timing, pace and cost. YouTube supplies views and the replay heatmap. Your agent's own model judges sections and hooks, and cites the frame it used. The label travels with the number.
Strength follows sample size
One video is a hint. Six is the first sample where the range from lowest to highest covers the true median 96.9% of the time. Every opening rule says how many videos back it, like 5/6.
A control video, then a real one
> "prove the cut timings are right" (control: 40 s promo, 9 cuts known from its source)
ffmpeg scene filter, documented thresholds
scene > 0.2 ........ 0 cuts
scene > 0.3 ........ 0 cuts
scene > 0.4 ........ 0 cuts
detect-shots.py detect control.mp4
candidates 11 4.0 9.0 13.0 17.0 22.0 27.0 30.0 33.0 36.0 36.767 37.333
truth 9 4 9 13 17 22 27 30 33 36
verify-cuts.mjs (after each candidate is checked from a 4-frame strip)
CANDIDATES TP 9 FP 2 FN 0 recall 1.00 precision 0.82
CONFIRMED TP 9 FP 0 FN 0 F1 1.00 mean |offset| 0 ms
RESULT ............... PASS
> "watch this video and make a template" (Linear, Intro to Linear, 4:01)
verify-observation.mjs
speech 649 words · 168.7 wpm · first word 0s
audit 83/83 candidates classified · precision 0.301
rhythm 25 confirmed shot changes · median shot 3.966s
cost 6897 frames + 21935 sheets = 28832 image tokens
verify-template.mjs
recomputed from 1 observation, every number matches
director_input: 12 section timings, readable by video-director
WARN strength single: a hint from ONE video, not a norm
RESULT ............... PASS
The ffmpeg and detector lines are output I re-ran on the control video that ships in the bundle. The verify-cuts lines come from the build's control test, where the agent doing the checking knew the answer. The Linear block is the scripts' own output on the bundled template, condensed to the lines that matter.
What a template sees that your eye misses


director_input block in the exact shape video-director accepts, so your shot list starts from a proven structure.What it will tell you it cannot do
- It needs the video. A local file, or a download with yt-dlp and a fresh cookie you supply. YouTube's own terms apply, and nothing is kept or listed.
- One worked template ships. Linear's intro, at single strength. Templates for tutorials, screencasts and changelogs need you to run more videos of that kind.
- Frames cost tokens. About 29,000 image tokens for 4 minutes with every cut checked. Run the transcript pass first and pull frames only where you need them.
- English is measured end to end. Caption-language pick passed on 7 languages, but no non-English video has been run through the whole pipeline yet.
- Most replayed is not retention. YouTube's heatmap shows where people rewatch. It is labelled platform data and never read as drop-off.
- The cut check is a judgment. Your agent's model confirms each candidate, and the precision is printed. On Linear's intro, 83 candidates became 25 shot changes.
I wanted every video to start from a structure that already worked.
video-analyst is one skill in the system behind Di-Atomic, the marketing and compliance agency that runs cognitoAI, SpiderIQ and OPVS. If you want a video pipeline that studies what works, scripts it and checks its own output, in any of my team's seven languages, that is the day job.
Book a call with Di-AtomicJust want the skill? Get @di-atomic/video-analyst free.