Skip to main content
Glama

finish_check

Read-onlyIdempotent

Verify a delivered file against project timeline specs—duration, chapters, loudness, black, holds, and transcription—to surface faults before sign-off.

Instructions

Check a delivered file against this project's timeline — verify/check_frames/check_black/film_check for a file an external mix pass produced, not one of proofcut's own renders.

final carries a cold open and/or holds concatenated on outside proofcut, so every position this reports is in final's own absolute seconds. prepend_seconds defaults to this project's stored head length; holds defaults to its stored holds, resolved live and offset the same way — pass either explicitly (an empty holds list included) to check a file against a different set than what is currently stored.

Eight checks, none individually fatal to the others: stream/chapter/ duration agreement against the timeline's own arithmetic; loudness (report only); blackdetect, with a run explained only when it falls inside the prepend or a hold's own span; each hold's own span transcribed and its seam levels measured; a windowed transcription of final diffed against the timeline's expected words, with every heard word inside the prepend or a hold filtered out first; every dropped run re-cut and re-transcribed on its own to catch a windowed-pass false miss at a window stitch (boundary_misses, recovered — a run that still cannot be found stays in missing, a real fault); and a self-repeat scan over the same filtered transcript. faults/ok aggregate all of it, and every run is logged (finishlog) so proofcut review serve can show a WARN badge keyed to the file's own sha256.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fpsNoThe frame grid the timeline's arithmetic is counted on. Defaults to the rate `export` would have picked.
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.
finalYesThe delivered file to check — one an external mix pass produced, not a proofcut render. Every position reported is in this file's own absolute seconds.
holdsNoThe holds to expect in `final`, resolved and offset the same way the stored ones are. Defaults to the project's own; pass a list (an empty one included) to check against a different set.
pix_thNoblackdetect's pixel threshold: how dark a pixel counts as black.
windowNoLength of each transcription window, 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 the transcription.
recheck_padNoHow much to pad a dropped run when re-cutting it for its own transcription — the pass that separates a real miss from a false one at a window stitch.
windowed_modelNoThe whisper model for the windowed transcription of `final`. A deliberately small one is the default, since the windowed pass runs over twice the audio.
prepend_secondsNoHow much runs before the timeline's first frame in `final` — a cold open concatenated on outside proofcut. Defaults to the project's stored head length.
transcript_pathNoAn existing transcription of `final`, to diff again without re-transcribing.
black_min_durationNoShortest black run to report, in seconds.
duration_toleranceNoHow far `final`'s duration may sit from the timeline's own arithmetic before it is a fault, in seconds.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed48 schema fields changedv0.25.0
    • addedInput schema / properties / black_min_duration / description
      Added value: +"Shortest black run to report, in seconds."
    • removedInput schema / properties / black_min_duration / title
      Removed value: -"Black Min Duration"
    • 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"
      +]
    • addedInput schema / properties / duration_tolerance / description
      Added value: +"How far `final`'s duration may sit from the timeline's own arithmetic before it is a fault, in seconds."
    • removedInput schema / properties / duration_tolerance / title
      Removed value: -"Duration Tolerance"
    • addedInput schema / properties / final / description
      Added value: +"The delivered file to check — one an external mix pass produced, not a proofcut render. Every position reported is in this file's own absolute seconds."
    • removedInput schema / properties / final / title
      Removed value: -"Final"
    • removedInput schema / properties / fps / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / fps / description
      Added value: +"The frame grid the timeline's arithmetic is counted on. Defaults to the rate `export` would have picked."
    • removedInput schema / properties / fps / title
      Removed value: -"Fps"
    • addedInput schema / properties / fps / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / properties / holds / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "additionalProperties": true,
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / holds / description
      Added value: +"The holds to expect in `final`, resolved and offset the same way the stored ones are. Defaults to the project's own; pass a list (an empty one included) to check against a different set."
    • addedInput schema / properties / holds / items
      Added value: +{
      +  "additionalProperties": true,
      +  "type": "object"
      +}
    • removedInput schema / properties / holds / title
      Removed value: -"Holds"
    • addedInput schema / properties / holds / type
      Added value: +[
      +  "array",
      +  "null"
      +]
    • removedInput schema / properties / language / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / language / description
      Added value: +"Force a language code for the transcription."
    • removedInput schema / properties / language / title
      Removed value: -"Language"
    • addedInput schema / properties / language / 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 / pix_th / description
      Added value: +"blackdetect's pixel threshold: how dark a pixel counts as black."
    • removedInput schema / properties / pix_th / title
      Removed value: -"Pix Th"
    • removedInput schema / properties / prepend_seconds / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / prepend_seconds / description
      Added value: +"How much runs before the timeline's first frame in `final` — a cold open concatenated on outside proofcut. Defaults to the project's stored head length."
    • removedInput schema / properties / prepend_seconds / title
      Removed value: -"Prepend Seconds"
    • addedInput schema / properties / prepend_seconds / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • addedInput schema / properties / recheck_pad / description
      Added value: +"How much to pad a dropped run when re-cutting it for its own transcription — the pass that separates a real miss from a false one at a window stitch."
    • removedInput schema / properties / recheck_pad / title
      Removed value: -"Recheck Pad"
    • removedInput schema / properties / transcript_path / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / transcript_path / description
      Added value: +"An existing transcription of `final`, to diff again without re-transcribing."
    • 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 transcription window, in seconds."
    • removedInput schema / properties / window / title
      Removed value: -"Window"
    • removedInput schema / properties / windowed_model / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / windowed_model / description
      Added value: +"The whisper model for the windowed transcription of `final`. A deliberately small one is the default, since the windowed pass runs over twice the audio."
    • removedInput schema / properties / windowed_model / title
      Removed value: -"Windowed Model"
    • addedInput schema / properties / windowed_model / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / title
      Removed value: -"finish_checkArguments"
  2. First observedv0.24.0

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description adds substantial non-redundant behavioral context: the full inventory of eight checks with their semantics (loudness is 'report only', blackdetect runs are 'explained only when it falls inside the prepend or a hold's own span'), the window-stitch false-miss recovery behavior (`boundary_misses`, recovered), the aggregation into `faults`/`ok`, and the `finishlog` side effect enabling `proofcut review serve` WARN badges keyed to sha256. No contradiction with annotations.

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

Conciseness3/5

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

The core purpose is front-loaded in the opening sentence and nearly every sentence earns its place given the tool's eight-check complexity. However, the body is one dense ~170-word paragraph built from slash-chains and semicolons that is genuinely hard to scan; the eight checks could be enumerated or broken into digestible chunks. The information is justified, but the structure is not.

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

Completeness4/5

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

For a 15-parameter tool with an output schema, the description is unusually complete: it covers the coordinate/time-base semantics, the default resolution of `prepend_seconds` and `holds`, the per-check behavior including what is report-only versus fatal-adjacent, recovery mechanics, and the logging/observability contract. The output schema covers return values and the 100%-coverage schema covers parameter mechanics; the only residual gap is that the density of the checks paragraph still demands careful reading, but nothing operationally necessary 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 coverage is 100%, so the baseline is 3, but the description clearly exceeds it: it explains the coordinate system binding `final`, `prepend_seconds`, and `holds` together ('every position this reports is in `final`'s own absolute seconds'), clarifies that `prepend_seconds`/`holds` default to stored project values with live offset resolution, and gives purpose to `recheck_pad` ('the pass that separates a real miss from a false one at a window stitch') and `windowed_model` ('runs over twice the audio'). This is genuine semantic value beyond the schema's field-level descriptions.

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 specific verb+resource pair ('Check a delivered file against this project's timeline') and immediately differentiates from siblings: it is the `verify`/`check_frames`/`check_black`/`film_check` equivalent 'for a file an external mix pass produced, not one of proofcut's own renders.' An agent can unambiguously distinguish this from its four named sibling tools without opening schemas.

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

Usage Guidelines4/5

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

The first sentence establishes the selecting condition — external mix pass deliverables versus proofcut's own renders — which implicitly routes proofcut renders to verify/check_frames/film_check. It also gives explicit guidance on when to override defaults: 'pass either explicitly (an empty `holds` list included) to check a file against a different set than what is currently stored.' It stops short of an explicit when-not statement naming the alternative for proofcut renders, so it is clear but not fully explicit.

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