Skip to main content
Glama

verify

Read-onlyIdempotent

Transcribe a finished render and diff it against the timeline to catch repeated phrases from retakes and dropped words from over-cutting. Also flags loud gaps for review.

Instructions

Transcribe a finished render and diff it against what the timeline says.

Run this after rendering, before calling an edit done. It transcribes the render with whisper and compares that word sequence to the one the timeline should play, which is the only check that catches a retake still in the picture: whisper collapses an immediate repeat into a single utterance, so a doubled phrase can be invisible in the source transcript and still be in the render.

Read repeated first — an entry there is a phrase the render plays more times than the timeline expects, i.e. a surviving retake, with the heard word index to look at. dropped is the opposite: words the timeline expects that the render never says, usually a cut that reached too far.

A clean single-pass result is not proof. This check has a known blind spot: the render's transcript is itself one whisper pass, which collapses a repeat the same way the source transcript did — three retakes survived a correct run of it on a real video. Set windowed=True to transcribe in short overlapping windows instead, which is what found them. It costs one whisper run over 2x the audio and uses a deliberately smaller model, so run the default first and escalate to it before calling an edit finished.

loud_gaps comes back either way and trusts no transcript: it measures the render's own energy and reports holes in the heard word map that hold sound anyway. An entry is a place to listen, not a verdict — a music bed or an attenuated noise can produce one. Read speech_db/threshold_db beside it.

similarity around 0.97 is normal on a clean render — whisper spells its own output differently on a second pass ("whodunit" / "who done it", "4" / "four"). Treat it as triage; diff is the artifact. Transcription takes minutes on a long render, and the result is cached under cache/verify/ and reported as heard_transcript — pass it back as transcript_path to re-diff without re-transcribing.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathNoThe project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing.
modelNoThe whisper model for the single-pass transcription.
renderYesThe finished render to transcribe and diff against the timeline.
windowNoLength of each window in the windowed pass, in seconds.
clip_idNoDiff against one transcript's expected words rather than all of them.
overlapNoHow far each window overlaps the one before, in seconds.
languageNoForce a language code for it.
windowedNoTranscribe in short overlapping windows instead of one pass. **A clean single-pass result is not proof** — one pass collapses an immediate repeat the same way the source transcript did, and three surviving retakes passed a correct single-pass run on a real video. It costs a run over twice the audio and a smaller model.
transcript_pathNoAn existing transcription of `render` — what a previous run cached and reported as `heard_transcript`. Pass it back to re-diff without spending the minutes again.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed29 schema fields changedv0.25.0
    • removedInput schema / properties / clip_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / clip_id / description
      Added value: +"Diff against one transcript's expected words rather than all of them."
    • removedInput schema / properties / clip_id / title
      Removed value: -"Clip Id"
    • addedInput schema / properties / clip_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / language / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / language / description
      Added value: +"Force a language code for it."
    • removedInput schema / properties / language / title
      Removed value: -"Language"
    • addedInput schema / properties / language / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / model / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / model / description
      Added value: +"The whisper model for the single-pass transcription."
    • removedInput schema / properties / model / title
      Removed value: -"Model"
    • addedInput schema / properties / model / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / overlap / description
      Added value: +"How far each window overlaps the one before, in seconds."
    • removedInput schema / properties / overlap / title
      Removed value: -"Overlap"
    • removedInput schema / properties / path / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / path / description
      Added value: +"The project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing."
    • removedInput schema / properties / path / title
      Removed value: -"Path"
    • addedInput schema / properties / path / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / render / description
      Added value: +"The finished render to transcribe and diff against the timeline."
    • removedInput schema / properties / render / title
      Removed value: -"Render"
    • removedInput schema / properties / transcript_path / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / transcript_path / description
      Added value: +"An existing transcription of `render` — what a previous run cached and reported as `heard_transcript`. Pass it back to re-diff without spending the minutes again."
    • removedInput schema / properties / transcript_path / title
      Removed value: -"Transcript Path"
    • addedInput schema / properties / transcript_path / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / window / description
      Added value: +"Length of each window in the windowed pass, in seconds."
    • removedInput schema / properties / window / title
      Removed value: -"Window"
    • addedInput schema / properties / windowed / description
      Added value: +"Transcribe in short overlapping windows instead of one pass. **A clean single-pass result is not proof** — one pass collapses an immediate repeat the same way the source transcript did, and three surviving retakes passed a correct single-pass run on a real video. It costs a run over twice the audio and a smaller model."
    • removedInput schema / properties / windowed / title
      Removed value: -"Windowed"
    • removedInput schema / title
      Removed value: -"verifyArguments"
  2. First observedv0.24.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive, but the description adds crucial behavioral caveats: the single-pass transcript can collapse immediate repeats (a real documented blind spot), windowed mode uses a smaller model over 2x audio, `loud_gaps` entries are places to listen rather than verdicts, and `similarity` is triage not proof. It also discloses caching under cache/verify/.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense; the core action is front-loaded and subsequent paragraphs each address a discrete component (windowed, loud_gaps, similarity, caching). No filler – every sentence adds operational guidance, though the length is ambitious for a casual skim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity – 9 parameters, a real blind spot, output interpretation, and caching – the description covers its operation end-to-end. It explains how to read the results (`repeated`, `dropped`, `loud_gaps`, `similarity`), how to escalate to windowed mode, and how to recycle a cache. The existing output schema covers the return structure, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes further by explaining the behavioral consequences of `windowed=True` (cost, smaller model) and `transcript_path` (re-diff without re-transcribing), and clarifies that `render` is the finished artifact to diff. It does not add original meaning for path/model/window/overlap, but the critical params get useful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete action – 'Transcribe a finished render and diff it against what the timeline says' – and reinforces its unique role as the only check that catches a surviving retake. It also provides invocation context ('after rendering, before calling an edit done'), which distinguishes it from sibling transcript/check tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to run: after rendering, before calling an edit done, and stipulates a two-step escalation – run the default single pass first, then escalate to `windowed=True` if necessary. It also tells the agent when to reuse a cached transcript via `transcript_path`, giving a clear operational flow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.