Resolve Delivery / Deliverable QC
Bridges delivery craft to this repo's tools.
- Craft / specs — the global
deliverables-knowledge, post-supervisor, and
quality-control / qc-domain skills (distributor specs, mastering, QC
discipline). Use for what the spec should be, not tool mechanics.
- Live tool mechanics —
docs/kernels/render-deliver-kernel.md (the render
planning/validation boundary + Quick Export).
- Offline deliverable QC —
resolve-advanced/README.md → deliverable,
media, provenance.
Two servers
| Job |
Server |
Tools |
| Plan / validate / run renders in a running Resolve |
davinci-resolve (Python, live) |
render, render_presets |
| QC a finished render vs spec, verify ingest, build manifests/provenance with no Resolve open |
davinci-resolve-advanced (Node) |
deliverable, media, provenance |
Delivery targets (the short path)
Named render intents. list_delivery_targets → prepare_delivery_job(target, target_dir). Ask for prores422hq_master, dnxhr_hqx_master, h264_1080p_web,
or an alias (youtube, tiktok, avid, stems). One definition emits BOTH the
Resolve render settings and the deliverable_qc spec, so the returned qc_spec
is what you QC the finished file against — do not hand-write a second spec.
Format/codec resolve against the live matrix. A target this machine or
license cannot render fails with the available lists; it never silently
substitutes. Use check_availability: true to see what this install supports.
Image-sequence targets return qc_spec: null — deliverable_qc probes one
file, a sequence is many. That is expected, not a gap.
Bitrate is deliberately unset (Resolve has no bitrate key). Pin quality
yourself via settings if a spec demands it.
Programme loudness is a separate projection. A target names a standard via
overrides: {loudness_standard: "ebu_r128"}; resolve_delivery_target then
returns a loudness_target alongside qc_spec. Hand loudness_target.target
to advanced loudness_qc. render(action='list_loudness_standards') lists the
five named contracts (web, podcast, ebu_r128, atsc_a85,
ott_dialogue_gated) — cite one, never invent the numbers.
No shipped target names a loudness standard by default: a ProRes master has no
inherent programme loudness and a broadcast handoff depends on territory.
A loudness_note tells you when none is pinned.
Dialogue-gated standards emit no gradeable integrated. loudness_qc
measures full-programme; grading a dialogue-gated figure against that means
nothing. The number rides in meta for a properly gated meter and only true
peak is asserted. This is deliberate, not a missing field.
Use the lower-level path below when you need something no target covers.
Live render essentials
- Discover then validate then apply:
probe_render_matrix (formats/codecs/res) →
validate_render_settings → safe_set_render_settings (dry-run capable) →
prepare_render_job (adds a job, does not start it).
- Format AND codec accept display names or ids; both normalize against the live
maps. A rejected pair is a hard error with the available codecs — it never
queues a job in the previously set codec.
- Render lifecycle helpers require temp output dirs by default; real delivery
paths need explicit lower-level actions.
GetRenderSettings readback is version/page dependent — the kernel validates
and applies through SetRenderSettings regardless.
safe_quick_export forces EnableUpload=False and needs allow_render=True
before it actually renders.
- Pin the base render state with
prepare_render_job(from_preset=...).
SetRenderSettings applies your keys on top of whatever the Deliver page is
holding rather than replacing it, and a loaded preset carries more state than
the keys you pass. An Audio Only preset plus an explicit ExportVideo: true
has been measured to queue a job that reads back IsExportVideo: true and
renders an mp4 with no video stream (issue #123). There is no way to detect
this: the API documents neither GetRenderSettings nor
GetCurrentRenderPresetName, so the inherited state cannot be read — only
pinned. Verify the OUTPUT, not the job: ffprobe for a codec_type=video
stream. A long timeline that "renders" in seconds is the tell.
- Three render keys are 21.0.4+:
UseFullExtents, AddFrameHandles,
DataBurnIn (issue #131). SetRenderSettings ignores unknown keys silently,
so on an older build these are dropped with no signal rather than refused —
which is exactly the failure mode that produces a deliverable missing handles
nobody notices until the conform. Check resolve_control check_version_support
before offering them, and note AddFrameHandles is also ignored when full
extents is enabled, so it can do nothing for two different reasons.
Offline deliverable QC (deliverable actions)
Report-only, gate: review — never auto-pass-clear. Run these on the finished
file, not the timeline:
deliverable_qc — ffprobe a render vs its spec → pass/fail per field.
loudness_qc — ebur128 LUFS / true-peak / LRA.
reframe_blanking_check — pillar/letterbox/blanking vs expected framing.
conform_completeness — every intended shot present in the delivered cut.
re_delivery_diff — what changed between two delivery versions.
render_manifest — build / reconcile the manifest of what was delivered.
expand_deliverable — derive texted / textless / stems / slate / leader
entities from a master.
spec_from_authored — turn the authored deliverable vocabulary (codec display
names, "1920x1080", "-16 LUFS", <SHOW>_<EP>_<YYYYMMDD>.mov naming) into a
deliverable_qc spec plus a loudness_qc target. Anything it cannot map is
listed in unmapped[] rather than dropped, so an unrecognized codec surfaces
instead of quietly producing a spec with no codec check in it.
Two things that bite when hand-writing specs, both handled by the projections:
container is "mov" for both .mov and .mp4 — ffprobe reports
format_name=mov,mp4,m4a,... for each and only the first token is kept. Use
video.codec to tell them apart; a spec asserting container: "mp4" always fails.
- Loudness is not a
deliverable_qc field. It comes back as a separate
loudnessTarget for loudness_qc.
Media front-end + provenance
media (front-end / AE): ingest_verify (hash seal / verify / dupes),
media_inventory (fps/codec/colorspace/TC + card gaps), sync (picture↔sound
TC + drift/MOS), relink_manifest, rename_plan (refuses camera
originals) / reel_normalize, turnover_package, project_hygiene.
provenance (audit): grade_provenance ("why is this graded this way"),
gallery_lineage, cdl_export / cdl_diff (round-trip asserted),
revision_tracking, episode_report.
Gotchas
- QC tools refuse rather than fabricate — a "refused" result means missing
file, wrong spec, or a metric it cannot honestly compute; read it, don't retry
blind.
deliverable/media QC needs ffmpeg + ffprobe on PATH (GPL, not
bundled) — call the advanced capabilities tool for live status + install hints.
- Deliverable gates never auto-clear; surface the per-field verdict to a human.
Source-media safety (AGENTS.md)
Render probes may render derivatives of synthetic fixtures, never user source
media. media.rename_plan refuses camera originals by design — do not override
without explicit approval. Preserve the camera-original-to-delivery chain.
1---2name: resolve-delivery-23description: Delivery, rendering, and deliverable QC in the DaVinci Resolve MCP. Apply when preparing render jobs, validating render settings, QCing a finished render against a spec (video/loudness/blanking/completeness), building or reconciling a render manifest, expanding texted/textless/stems/slate deliverables, verifying media ingest, or producing a provenance/episode report — live in a running Resolve OR offline against rendered files and the project DB. Routes to the live render tools, the offline deliverable/media/provenance tools, and the deliverables craft skills.4---56# Resolve Delivery / Deliverable QC7Bridges delivery *craft* to this repo's *tools*.89- **Craft / specs** — the global `deliverables-knowledge`, `post-supervisor`, and10 `quality-control` / `qc-domain` skills (distributor specs, mastering, QC11 discipline). Use for *what the spec should be*, not tool mechanics.12- **Live tool mechanics** — `docs/kernels/render-deliver-kernel.md` (the `render`13 planning/validation boundary + Quick Export).14- **Offline deliverable QC** — `resolve-advanced/README.md` → `deliverable`,15 `media`, `provenance`.1617## Two servers1819| Job | Server | Tools |20|---|---|---|21| Plan / validate / run renders in a **running** Resolve | `davinci-resolve` (Python, live) | `render`, `render_presets` |22| QC a **finished render** vs spec, verify ingest, build manifests/provenance with **no Resolve open** | `davinci-resolve-advanced` (Node) | `deliverable`, `media`, `provenance` |2324## Delivery targets (the short path)2526Named render intents. `list_delivery_targets` → `prepare_delivery_job(target,27target_dir)`. Ask for `prores422hq_master`, `dnxhr_hqx_master`, `h264_1080p_web`,28or an alias (`youtube`, `tiktok`, `avid`, `stems`). One definition emits BOTH the29Resolve render settings and the `deliverable_qc` spec, so the returned `qc_spec`30is what you QC the finished file against — do not hand-write a second spec.3132- Format/codec resolve against the **live** matrix. A target this machine or33 license cannot render fails with the available lists; it never silently34 substitutes. Use `check_availability: true` to see what this install supports.35- Image-sequence targets return `qc_spec: null` — `deliverable_qc` probes one36 file, a sequence is many. That is expected, not a gap.37- Bitrate is deliberately unset (Resolve has no bitrate key). Pin quality38 yourself via `settings` if a spec demands it.3940- **Programme loudness is a separate projection.** A target names a standard via41 `overrides: {loudness_standard: "ebu_r128"}`; `resolve_delivery_target` then42 returns a `loudness_target` alongside `qc_spec`. Hand `loudness_target.target`43 to advanced `loudness_qc`. `render(action='list_loudness_standards')` lists the44 five named contracts (`web`, `podcast`, `ebu_r128`, `atsc_a85`,45 `ott_dialogue_gated`) — cite one, never invent the numbers.46- No shipped target names a loudness standard by default: a ProRes master has no47 inherent programme loudness and a broadcast handoff depends on territory.48 A `loudness_note` tells you when none is pinned.49- **Dialogue-gated standards emit no gradeable `integrated`.** `loudness_qc`50 measures full-programme; grading a dialogue-gated figure against that means51 nothing. The number rides in `meta` for a properly gated meter and only true52 peak is asserted. This is deliberate, not a missing field.5354Use the lower-level path below when you need something no target covers.5556## Live render essentials5758- Discover then validate then apply: `probe_render_matrix` (formats/codecs/res) →59 `validate_render_settings` → `safe_set_render_settings` (dry-run capable) →60 `prepare_render_job` (adds a job, does **not** start it).61- Format AND codec accept display names or ids; both normalize against the live62 maps. A rejected pair is a hard error with the available codecs — it never63 queues a job in the previously set codec.64- Render lifecycle helpers require **temp output dirs by default**; real delivery65 paths need explicit lower-level actions.66- `GetRenderSettings` readback is version/page dependent — the kernel validates67 and applies through `SetRenderSettings` regardless.68- `safe_quick_export` forces `EnableUpload=False` and needs `allow_render=True`69 before it actually renders.70- **Pin the base render state with `prepare_render_job(from_preset=...)`.**71 `SetRenderSettings` applies your keys *on top of* whatever the Deliver page is72 holding rather than replacing it, and a loaded preset carries more state than73 the keys you pass. An Audio Only preset plus an explicit `ExportVideo: true`74 has been measured to queue a job that reads back `IsExportVideo: true` and75 renders an mp4 with **no video stream** (issue #123). There is no way to detect76 this: the API documents neither `GetRenderSettings` nor77 `GetCurrentRenderPresetName`, so the inherited state cannot be read — only78 pinned. Verify the OUTPUT, not the job: ffprobe for a `codec_type=video`79 stream. A long timeline that "renders" in seconds is the tell.80- **Three render keys are 21.0.4+**: `UseFullExtents`, `AddFrameHandles`,81 `DataBurnIn` (issue #131). `SetRenderSettings` ignores unknown keys **silently**,82 so on an older build these are dropped with no signal rather than refused —83 which is exactly the failure mode that produces a deliverable missing handles84 nobody notices until the conform. Check `resolve_control check_version_support`85 before offering them, and note `AddFrameHandles` is also ignored when full86 extents is enabled, so it can do nothing for two different reasons.8788## Offline deliverable QC (`deliverable` actions)8990Report-only, **`gate: review` — never auto-pass-clear.** Run these on the finished91file, not the timeline:9293- `deliverable_qc` — ffprobe a render vs its spec → pass/fail **per field**.94- `loudness_qc` — ebur128 LUFS / true-peak / LRA.95- `reframe_blanking_check` — pillar/letterbox/blanking vs expected framing.96- `conform_completeness` — every intended shot present in the delivered cut.97- `re_delivery_diff` — what changed between two delivery versions.98- `render_manifest` — build / reconcile the manifest of what was delivered.99- `expand_deliverable` — derive texted / textless / stems / slate / leader100 entities from a master.101- `spec_from_authored` — turn the authored deliverable vocabulary (codec display102 names, `"1920x1080"`, `"-16 LUFS"`, `<SHOW>_<EP>_<YYYYMMDD>.mov` naming) into a103 `deliverable_qc` spec plus a `loudness_qc` target. Anything it cannot map is104 listed in `unmapped[]` rather than dropped, so an unrecognized codec surfaces105 instead of quietly producing a spec with no codec check in it.106107Two things that bite when hand-writing specs, both handled by the projections:108109- `container` is `"mov"` for **both** .mov and .mp4 — ffprobe reports110 `format_name=mov,mp4,m4a,...` for each and only the first token is kept. Use111 `video.codec` to tell them apart; a spec asserting `container: "mp4"` always fails.112- Loudness is **not** a `deliverable_qc` field. It comes back as a separate113 `loudnessTarget` for `loudness_qc`.114115## Media front-end + provenance116117- **`media`** (front-end / AE): `ingest_verify` (hash seal / verify / dupes),118 `media_inventory` (fps/codec/colorspace/TC + card gaps), `sync` (picture↔sound119 TC + drift/MOS), `relink_manifest`, `rename_plan` (**refuses camera120 originals**) / `reel_normalize`, `turnover_package`, `project_hygiene`.121- **`provenance`** (audit): `grade_provenance` ("why is this graded this way"),122 `gallery_lineage`, `cdl_export` / `cdl_diff` (round-trip asserted),123 `revision_tracking`, `episode_report`.124125## Gotchas126127- QC tools **refuse rather than fabricate** — a "refused" result means missing128 file, wrong spec, or a metric it cannot honestly compute; read it, don't retry129 blind. `deliverable`/`media` QC needs **ffmpeg + ffprobe on PATH** (GPL, not130 bundled) — call the advanced `capabilities` tool for live status + install hints.131- Deliverable gates never auto-clear; surface the per-field verdict to a human.132133## Source-media safety (AGENTS.md)134135Render probes may render derivatives of *synthetic* fixtures, never user source136media. `media.rename_plan` refuses camera originals by design — do not override137without explicit approval. Preserve the camera-original-to-delivery chain.