Skip to content
Back to skills

Verify Video

ASecurity

Checks every cut in a finished video with Yap Studio (clicks, sync, frames, loudness, platform rules). Use after rendering or editing a video, before calling it done.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 24, 2026
ai-agentsgo

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned October 24, 2026

npx -y skills add cathrynlavery/yap-studio --skill verify-video --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Verify Video?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Verify Video
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/cathrynlavery-verify-video/badge)](https://www.skillsdirectory.com/skills/cathrynlavery-verify-video)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: verify-video
description: Checks every cut in a finished video with Yap Studio (clicks, sync, frames, loudness, platform rules). Use after rendering or editing a video, before calling it done.
---

# Verify a finished video

## When to run

Run verification after every render and before calling a video done. Use the edit list when
one exists so Yap Studio can compare the finished video with the intended edit.

## How to run

Call the MCP tool `verify` with `media` set to the finished video. Set `edl` to the edit list
when there is one. Leave `asr` at its default unless the user asks for a specific speech
engine or asks to skip speech checks. Set `platform` when the video will be published to a
specific platform.

## Reading the result

Read `status` first:

* `pass` means no checks produced a warning or failure.
* `warn` means at least one finding needs review.
* `fail` means at least one check failed.

Report each actionable item in `findings` with its output time, message, and fix. Read
`checks` for each check's result and for the reason any check was skipped.

The JSON report always lists every finding and every check. Add `--detail full` to include the per-cut and per-segment measurements.

## Fixes by check id

| Check id | What it means | Usual fix |
| --- | --- | --- |
| `join.click` | A sharp sound change is present at a cut. | Add a short audio fade (5 to 30 ms) and render again. |
| `join.gap` | Audio was inserted or lost at a cut. | Inserted: encode the audio once for the whole video. Lost: re-render so each clip keeps its full audio. |
| `join.words` | At a cut, the render's audio differs from the edit list, so speech may be clipped, repeated or missing. | Render the cut again so its audio matches the edit list. |
| `join.frames` | The frames around a cut do not match the edit. Without an edit list, a frame at a found cut counts as repeated only when it changes almost nothing from its neighbour, or less than a quarter of the usual frame-to-frame change on that side of the cut. | Check the source range and render the cut again. |
| `join.listen` | A join needs a listening review, for example where the edit itself cuts through a word. | Listen around the named cut and repair any audible change. |
| `join.relisten` | The render's words at a cut differ from the edit's own audio, or a word is doubled across the cut that the source does not repeat there. | Listen to the join, move the cut if needed, and render again. |
| `join.second_model` | A second speech engine from another model family, for example faster-whisper next to Parakeet, hears different words at a cut. It runs in its own process. Unmeasured when no engine from another family is installed or the second engine stops before writing its result. | Listen to the join and decide which reading is right. |
| `sync.av_offset` | Picture and sound do not land together. | Correct the sound offset and render again. |
| `sync.drift` | The sound offset grows across the edit. | Encode the audio once for the whole video instead of per clip. |
| `sync.unmeasured` | Sync could not be measured for a part. | Supply the right source or use clearer source sound and picture. |
| `plan.picture` | Rendered picture does not match the source range. | Check the edit list and source mapping. |
| `plan.frames` | The render has the wrong frame count. | Check range ends, frame rate, and export bounds. |
| `plan.samples` | The render has the wrong audio sample count. | Check audio range ends and sample rate. |
| `plan.holds` | A hold declared in the edit list is not a still picture, or has sound where the edit list declares silence. | Render the hold as declared, or correct the edit list. |
| `edit_list.evidence` | An evidence file listed in the edit list is missing, or no longer matches the sha256 recorded for it, so the cuts it attests are unconfirmed. A matching file is reported as checked outside Yap Studio, never as a pass. | Point the edit list at the file that was checked, or review it again and record its current sha256. |
| `structure.av_length` | Picture and sound end at different times. | Render both streams to the same endpoint. |
| `structure.audio_timestamps` | The audio timestamps jump ahead or step back somewhere in the file. A player that follows them inserts silence or overlaps sound there. The finding lists each break with its time and size. | Encode the audio once for the whole video and mux it again. |
| `loudness.integrated` | Overall loudness misses the target. | Adjust the final mix toward the stated target. |
| `loudness.true_peak` | The true peak is above -1 dBTP. | Lower the limiter ceiling. |
| `loudness.parts` | Two neighbouring parts from different sources differ by more than 3 LU. Without an edit list, only parts at least 3 s long are compared. | Normalize the loudness of that part to match the rest. |
| `picture.black` | A black interval was found. | Replace unintended black frames. |
| `picture.freeze` | A long frozen interval was found. | Replace the held frames if they are not intentional. |
| `picture.flash` | One or two stray frames flash at a cut: the picture changes into them and out again within two frames of the join. With an edit list, frames that are in the source at that point are not counted. | Render the cut again so the outgoing segment's last frame meets the incoming segment's first frame. |
| `detect.cuts` | Lists the clear cuts found without an edit list. Jump cuts inside one take may be missed. | Nothing to fix. Add `--edl` for a full check, including sync and words. |
| `platform.shape` | The video shape does not fit the platform. | Render the required horizontal or vertical version. |
| `platform.duration` | The video is too long for the selected format. | Shorten it or choose another format. |
| `platform.resolution` | The frame size misses a platform rule. | Render at a supported size. |
| `platform.fps` | The frame rate misses a platform rule. | Render at a supported frame rate. |
| `taste.rules` | The finished picture breaks an approved taste rule applied to this render, or its receipt names a different style. Rules that could not be measured have a reason. | Render again with the approved style, or revoke the rule if it no longer holds. |

## Skipped checks

Never report a skipped check as passed. List every skipped check and its reason. If an
important check was skipped, explain what input or dependency is needed to run it.

## If the tool is missing

From a checkout, install the CLI with `uv tool install '.[asr,mcp]'`. Configure the MCP
server to run `yap-studio mcp`, then call `verify` again.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.