--- name: resolve-delivery description: 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. --- # 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"`, `__.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.