davinci-resolve-mcp 2.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +85 -0
- package/CHANGELOG.md +802 -0
- package/CLAUDE.md +15 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/SECURITY.md +53 -0
- package/bin/davinci-resolve-mcp.mjs +376 -0
- package/docs/README.md +56 -0
- package/docs/SKILL.md +1145 -0
- package/docs/authoring/fuse-dctl-authoring.md +242 -0
- package/docs/authoring/script-plugin-authoring.md +195 -0
- package/docs/contributing.md +82 -0
- package/docs/guides/color-decision-guide.md +387 -0
- package/docs/guides/editorial-decision-guide.md +136 -0
- package/docs/guides/media-analysis-guide.md +615 -0
- package/docs/guides/multicam-setup-guide.md +138 -0
- package/docs/install.md +198 -0
- package/docs/integrations/workflow-integrations.md +120 -0
- package/docs/kernels/README.md +28 -0
- package/docs/kernels/audio-fairlight-kernel.md +86 -0
- package/docs/kernels/color-grade-kernel.md +103 -0
- package/docs/kernels/extension-authoring-kernel.md +101 -0
- package/docs/kernels/fusion-composition-kernel.md +91 -0
- package/docs/kernels/media-pool-ingest-kernel.md +147 -0
- package/docs/kernels/project-lifecycle-kernel.md +120 -0
- package/docs/kernels/render-deliver-kernel.md +92 -0
- package/docs/kernels/review-annotation-kernel.md +110 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
- package/docs/kernels/timeline-edit-kernel.md +189 -0
- package/docs/notes/codec-plugin-notes.md +136 -0
- package/docs/notes/dctl-notes.md +234 -0
- package/docs/notes/fusion-template-notes.md +136 -0
- package/docs/notes/lut-notes.md +136 -0
- package/docs/notes/openfx-notes.md +120 -0
- package/docs/process/release-process.md +152 -0
- package/docs/reference/api-coverage.md +488 -0
- package/docs/reference/resolve_scripting_api.txt +1012 -0
- package/examples/README.md +53 -0
- package/examples/markers/README.md +81 -0
- package/examples/media/README.md +94 -0
- package/examples/timeline/README.md +98 -0
- package/install.py +1196 -0
- package/package.json +52 -0
- package/scripts/audit_api_parity.py +275 -0
- package/scripts/live_media_analysis_polish_probe.py +65 -0
- package/src/__init__.py +3 -0
- package/src/analysis_dashboard.py +4936 -0
- package/src/control_panel.py +13 -0
- package/src/granular/__init__.py +17 -0
- package/src/granular/common.py +727 -0
- package/src/granular/folder.py +287 -0
- package/src/granular/gallery.py +306 -0
- package/src/granular/graph.py +309 -0
- package/src/granular/media_pool.py +679 -0
- package/src/granular/media_pool_item.py +852 -0
- package/src/granular/media_storage.py +179 -0
- package/src/granular/project.py +1594 -0
- package/src/granular/resolve_control.py +521 -0
- package/src/granular/timeline.py +1074 -0
- package/src/granular/timeline_item.py +2251 -0
- package/src/resolve_mcp_server.py +43 -0
- package/src/server.py +15691 -0
- package/src/utils/__init__.py +3 -0
- package/src/utils/app_control.py +319 -0
- package/src/utils/audio_fairlight_live_probe.py +263 -0
- package/src/utils/cdl.py +20 -0
- package/src/utils/cloud_operations.py +192 -0
- package/src/utils/color_grade_live_probe.py +444 -0
- package/src/utils/dctl_templates.py +368 -0
- package/src/utils/extension_authoring_live_probe.py +292 -0
- package/src/utils/fuse_templates.py +1968 -0
- package/src/utils/fusion_composition_live_probe.py +284 -0
- package/src/utils/layout_presets.py +333 -0
- package/src/utils/mcp_stdio.py +32 -0
- package/src/utils/media_analysis.py +3618 -0
- package/src/utils/media_analysis_jobs.py +796 -0
- package/src/utils/media_pool_ingest_live_probe.py +592 -0
- package/src/utils/multicam.py +393 -0
- package/src/utils/object_inspection.py +287 -0
- package/src/utils/platform.py +157 -0
- package/src/utils/project_lifecycle_live_probe.py +376 -0
- package/src/utils/project_properties.py +601 -0
- package/src/utils/render_deliver_live_probe.py +384 -0
- package/src/utils/resolve_connection.py +77 -0
- package/src/utils/review_annotation_live_probe.py +352 -0
- package/src/utils/script_templates.py +1193 -0
- package/src/utils/sync_detection.py +887 -0
- package/src/utils/timeline_conform_live_probe.py +280 -0
- package/src/utils/timeline_kernel_live_probe.py +1091 -0
- package/src/utils/timeline_kernel_probe.py +185 -0
- package/src/utils/timeline_title_text.py +87 -0
- package/src/utils/update_check.py +610 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Extension Authoring Kernel
|
|
2
|
+
|
|
3
|
+
The Extension Authoring kernel turns the existing `fuse_plugin`, `dctl`, and
|
|
4
|
+
`script_plugin` tools into a lifecycle-aware boundary layer for generated
|
|
5
|
+
Resolve extensions.
|
|
6
|
+
|
|
7
|
+
Kernel actions are exposed through `script_plugin` as the cross-extension
|
|
8
|
+
orchestrator. The raw authoring tools remain available for direct file
|
|
9
|
+
operations.
|
|
10
|
+
|
|
11
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with only
|
|
12
|
+
MCP-marked `_mcp_` Fuse, DCTL, ACES DCTL, and Resolve-page script files. Final
|
|
13
|
+
release probe counts:
|
|
14
|
+
|
|
15
|
+
| Status | Count |
|
|
16
|
+
| --- | ---: |
|
|
17
|
+
| `supported` | 14 |
|
|
18
|
+
| `partially_supported` | 1 |
|
|
19
|
+
| `unsupported` | 1 |
|
|
20
|
+
| `not_applicable` | 0 |
|
|
21
|
+
| `version_or_page_dependent` | 0 |
|
|
22
|
+
| `error` | 0 |
|
|
23
|
+
|
|
24
|
+
The unsupported result is intentional: safe install rejects provided source that
|
|
25
|
+
does not include the expected MCP marker.
|
|
26
|
+
|
|
27
|
+
## Added Actions
|
|
28
|
+
|
|
29
|
+
All kernel actions are exposed through `script_plugin`.
|
|
30
|
+
|
|
31
|
+
| Action | Purpose |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `extension_capabilities` | Report Fuse, DCTL, script paths, template kinds, MCP markers, lifecycle rules, and safety guards. |
|
|
34
|
+
| `probe_fuse_lifecycle` | Generate, validate, optionally install/read/list/remove a Fuse template. |
|
|
35
|
+
| `probe_dctl_lifecycle` | Generate, validate, optionally install/read/list/remove a LUT or ACES DCTL template. |
|
|
36
|
+
| `probe_script_lifecycle` | Generate, validate, optionally install/read/list/execute/remove a Resolve-page script. |
|
|
37
|
+
| `safe_install_extension` | Install Fuse, DCTL, or script source/templates with `_mcp_` name and marker guards. |
|
|
38
|
+
| `safe_remove_extension` | Remove Fuse, DCTL, or script files only when the file is MCP-marked by default. |
|
|
39
|
+
| `refresh_or_restart_required` | Classify whether an extension needs LUT refresh, menu refresh, UI reload, or Resolve restart. |
|
|
40
|
+
| `extension_boundary_report` | Return lifecycle classifications, template validation matrix, and dry-run probes. |
|
|
41
|
+
|
|
42
|
+
## Lifecycle Map
|
|
43
|
+
|
|
44
|
+
| Surface | Install Target | Live Pickup | Restart |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| Fuse | Fusion Fuses directory | Existing Fuses can be UI-reloaded from Inspector; MCP cannot trigger it. | Required for new Fuse registration. |
|
|
47
|
+
| Regular DCTL | LUT directory | `project_settings.refresh_luts` picks it up. | Not required for LUT-category DCTLs. |
|
|
48
|
+
| ACES IDT/ODT DCTL | ACES Transforms IDT/ODT | Not picked up by LUT refresh. | Required. |
|
|
49
|
+
| Resolve-page script | Fusion/Scripts category directory | Workspace Scripts menu refreshes when opened. | Not required. |
|
|
50
|
+
| Inline Python script | Temp file subprocess | Captured synchronously. | Not required. |
|
|
51
|
+
| Inline Lua script | Temp Lua file via `fusion.RunScript` | Captured through Fusion app data bridge. | Not required. |
|
|
52
|
+
|
|
53
|
+
## Supported Findings
|
|
54
|
+
|
|
55
|
+
- Fuse template generation, validation, install, read, MCP-managed list, and
|
|
56
|
+
safe marker-enforced remove worked.
|
|
57
|
+
- Regular LUT DCTL template generation, validation, install into `LUT/MCP`,
|
|
58
|
+
read, list, `project_settings.refresh_luts`, and safe remove worked.
|
|
59
|
+
- ACES IDT DCTL template generation, install into `ACES Transforms/IDT/MCP`,
|
|
60
|
+
read, list, and safe remove worked. It remains restart-required before Resolve
|
|
61
|
+
can use the transform.
|
|
62
|
+
- Python Resolve-page script template generation, install, read, list, execute,
|
|
63
|
+
stdout/stderr capture, and safe remove worked.
|
|
64
|
+
- `script_plugin.run_inline` worked for Python with stdout capture.
|
|
65
|
+
- `script_plugin.run_inline` worked for Lua with stdout and return-value capture.
|
|
66
|
+
- The template matrix generated and validated every Fuse, DCTL, and script
|
|
67
|
+
template kind.
|
|
68
|
+
- Safe install rejected unmarked provided source by default.
|
|
69
|
+
|
|
70
|
+
## Boundaries
|
|
71
|
+
|
|
72
|
+
- Installed Lua script execution through `fusion.RunScript(path)` returned
|
|
73
|
+
`success=False` in the release probe, even though install/read/list/remove
|
|
74
|
+
worked and inline Lua execution worked. Use `run_inline(language="lua")` when
|
|
75
|
+
captured output/return values matter.
|
|
76
|
+
- New Fuses still require a Resolve restart to appear as registered Fusion
|
|
77
|
+
tools. The MCP can install/remove files but cannot force Fusion to register a
|
|
78
|
+
new Fuse in-process.
|
|
79
|
+
- ACES IDT/ODT DCTLs are scanned at Resolve startup. `RefreshLUTList` is only
|
|
80
|
+
appropriate for LUT-category DCTLs.
|
|
81
|
+
- Template validation is structural/parser-level. It does not prove a Fuse
|
|
82
|
+
renders correctly after restart or that every DCTL compiles on every GPU
|
|
83
|
+
backend.
|
|
84
|
+
- Safe remove refuses to delete unmarked extension files unless
|
|
85
|
+
`require_marker=False` is explicitly passed.
|
|
86
|
+
|
|
87
|
+
## Live Probe
|
|
88
|
+
|
|
89
|
+
Run the live boundary probe with:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
python3.11 tests/live_extension_authoring_validation.py --output-dir /tmp/extension-authoring-probe
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The harness creates a disposable `_mcp_` project, installs and removes a
|
|
96
|
+
generated Fuse, regular DCTL, ACES DCTL, Python script, and Lua script, probes
|
|
97
|
+
inline Python/Lua execution, writes JSON and Markdown reports, deletes the
|
|
98
|
+
project, and removes its temp work directory.
|
|
99
|
+
|
|
100
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
101
|
+
project by hand.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Fusion Composition Kernel
|
|
2
|
+
|
|
3
|
+
The Fusion Composition kernel expands `fusion_comp` into a safer graph
|
|
4
|
+
inspection, tool creation, input write, connection, and boundary-report layer
|
|
5
|
+
for timeline item Fusion comps and active Fusion page comps.
|
|
6
|
+
|
|
7
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with a
|
|
8
|
+
disposable `_mcp_fusion_composition_probe_*` project and generated synthetic
|
|
9
|
+
video media. Final release probe counts:
|
|
10
|
+
|
|
11
|
+
| Status | Count |
|
|
12
|
+
| --- | ---: |
|
|
13
|
+
| `supported` | 18 |
|
|
14
|
+
| `partially_supported` | 0 |
|
|
15
|
+
| `unsupported` | 0 |
|
|
16
|
+
| `version_or_page_dependent` | 0 |
|
|
17
|
+
| `not_applicable` | 0 |
|
|
18
|
+
| `error` | 0 |
|
|
19
|
+
|
|
20
|
+
## Added Actions
|
|
21
|
+
|
|
22
|
+
All actions are exposed through `fusion_comp`.
|
|
23
|
+
|
|
24
|
+
| Action | Purpose |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `fusion_graph_capabilities` | Return current comp summary, common tool IDs, supported graph operations, and known boundaries. |
|
|
27
|
+
| `probe_fusion_comp` | Snapshot composition attrs, tool count, and tool summaries, optionally including input/output ports. |
|
|
28
|
+
| `probe_fusion_tool` | Inspect one tool by name, including attrs and optional input/output metadata. |
|
|
29
|
+
| `safe_add_tool` | Validate a tool type, add it with optional naming, and return a normalized tool summary; supports dry run. |
|
|
30
|
+
| `safe_set_inputs` | Batch write inputs on one tool with optional readback classification. |
|
|
31
|
+
| `safe_connect_tools` | Validate source/target tools before connecting a source output to a target input. |
|
|
32
|
+
| `fusion_boundary_report` | Return graph capabilities plus a composition snapshot for the selected comp scope. |
|
|
33
|
+
|
|
34
|
+
The pre-existing `bulk_set_inputs` action remains the batch path for applying
|
|
35
|
+
input writes across multiple explicitly scoped timeline-item Fusion comps.
|
|
36
|
+
|
|
37
|
+
## Scope Matrix
|
|
38
|
+
|
|
39
|
+
| Scope | Probe Support | Mutation Support | Notes |
|
|
40
|
+
| --- | --- | --- | --- |
|
|
41
|
+
| Timeline item Fusion comp | Supported | Tool add, input writes, connections, frame range, comp export | Primary safe automation target. Pass `timeline_item`, `clip_id`, or `timeline_item_id`. |
|
|
42
|
+
| Active Fusion page comp | Supported when a current comp exists | Raw and safe graph helpers work against the active page comp | Page state matters; omit timeline scope only when that is intentional. |
|
|
43
|
+
| Bulk timeline item comps | Supported | `bulk_set_inputs` requires explicit timeline scope per op | Avoids accidentally mutating the active page comp. |
|
|
44
|
+
| Comp import/export | Supported through `timeline_item_fusion` | Export succeeded to a temp `.setting` file in the live probe | Import should use temp or explicitly approved paths. |
|
|
45
|
+
|
|
46
|
+
## Supported Findings
|
|
47
|
+
|
|
48
|
+
- Timeline item Fusion comp creation, count, and name listing worked on the
|
|
49
|
+
generated synthetic clip.
|
|
50
|
+
- `fusion_graph_capabilities` and `fusion_boundary_report` produced stable
|
|
51
|
+
graph summaries without requiring Fusion page focus.
|
|
52
|
+
- `safe_add_tool` successfully added `Background`, `TextPlus`, `Merge`,
|
|
53
|
+
`Transform`, and `Blur` tools to a timeline item comp.
|
|
54
|
+
- `safe_set_inputs` wrote and read back text and background color inputs.
|
|
55
|
+
- `probe_fusion_tool` returned normalized attrs plus input/output metadata for
|
|
56
|
+
the generated `TextPlus` tool.
|
|
57
|
+
- `safe_connect_tools` connected the generated text tool to `MediaOut1`.
|
|
58
|
+
- `bulk_set_inputs` wrote multiple scoped input changes in one request.
|
|
59
|
+
- `set_frame_range` and timeline item comp export succeeded against the
|
|
60
|
+
disposable timeline item comp.
|
|
61
|
+
|
|
62
|
+
## Boundaries
|
|
63
|
+
|
|
64
|
+
- Tool availability varies by Resolve/Fusion build. The kernel reports common
|
|
65
|
+
tool IDs but does not pretend every Fusion tool is installed everywhere.
|
|
66
|
+
- Fusion inputs are heterogeneous. Some are readable after writes, some coerce
|
|
67
|
+
values, and some can be effectively write-only depending on the tool.
|
|
68
|
+
- Active Fusion page comps and timeline item comps are different scopes. The
|
|
69
|
+
safe helpers support both, but bulk mutation requires timeline scope.
|
|
70
|
+
- `fusion_comp.render` is still exposed as the raw API path, but the live kernel
|
|
71
|
+
probe does not force a render because renderability depends on graph shape,
|
|
72
|
+
MediaOut state, and page/build behavior.
|
|
73
|
+
- The public API exposes tool attrs and ports, not a semantic model of every
|
|
74
|
+
effect parameter. Higher-level wrappers should probe before assuming a
|
|
75
|
+
control exists.
|
|
76
|
+
|
|
77
|
+
## Live Probe
|
|
78
|
+
|
|
79
|
+
Run the live boundary probe with:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python3.11 tests/live_fusion_composition_validation.py --output-dir /tmp/fusion-composition-probe
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The harness creates a disposable project, generates synthetic video media,
|
|
86
|
+
builds a timeline item Fusion comp, probes tool creation, input writes, graph
|
|
87
|
+
inspection, connections, bulk writes, frame range, comp export, and boundary
|
|
88
|
+
reporting, then deletes the project and removes generated media.
|
|
89
|
+
|
|
90
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
91
|
+
project by hand.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Media Pool / Ingest Kernel
|
|
2
|
+
|
|
3
|
+
The Media Pool / Ingest kernel expands the raw Resolve Media Storage,
|
|
4
|
+
Media Pool, Folder, MediaPoolItem, and MediaPoolItem marker wrappers into a
|
|
5
|
+
safer agent-facing layer for import, organization, metadata, annotation, and
|
|
6
|
+
link-boundary work.
|
|
7
|
+
|
|
8
|
+
Source media integrity remains the first rule: these helpers do not transcode,
|
|
9
|
+
render, proxy-generate, overwrite, or mutate source files. They validate paths
|
|
10
|
+
before calling Resolve, and the live harness uses generated synthetic media in
|
|
11
|
+
disposable `_mcp_...` projects only.
|
|
12
|
+
|
|
13
|
+
## New Compound Actions
|
|
14
|
+
|
|
15
|
+
All actions are under `media_pool(action=...)`.
|
|
16
|
+
|
|
17
|
+
| Action | Status | Purpose |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `ingest_capabilities` | Supported | Maintained support/partial/unsupported map for ingest workflows. |
|
|
20
|
+
| `probe_media_pool` | Supported | Read-only Media Pool, folder, selected clip, and method availability snapshot. |
|
|
21
|
+
| `probe_ingest_item` | Supported | Read-only metadata/property/annotation/audio snapshot for clip IDs or selected clips. |
|
|
22
|
+
| `safe_import_media` | Supported | Validates existing paths, optionally targets a Media Pool folder, supports dry-run, then calls `ImportMedia(paths)`. |
|
|
23
|
+
| `safe_import_sequence` | Supported | Validates printf-style sequence patterns and frame ranges before calling `ImportMedia([{clipInfo}])`. |
|
|
24
|
+
| `safe_import_folder` | Supported dry-run | Validates folder paths before `ImportFolderFromFile`; dry-run is recommended unless importing Resolve folder exports intentionally. |
|
|
25
|
+
| `setup_multicam_timeline` | Supported setup helper | Creates a stacked multicam prep timeline from Media Pool clips, with one angle per video track and optional matching audio tracks. |
|
|
26
|
+
| `organize_clips` | Supported | Moves clips to an existing or optionally created Media Pool folder. |
|
|
27
|
+
| `copy_metadata` | Supported | Copies Resolve metadata and optional third-party metadata from one clip to target clips. |
|
|
28
|
+
| `normalize_metadata` | Supported | Bulk-writes explicit metadata and third-party metadata to clip IDs or selected clips. |
|
|
29
|
+
| `probe_clip_properties` | Supported | Read-only full and known-key clip property snapshots. |
|
|
30
|
+
| `metadata_field_inventory` | Supported | Read-only metadata, clip-property, and inferred Metadata-panel group inventory for selected or explicit clips. |
|
|
31
|
+
| `safe_relink` | Supported | Validates clip IDs and target directory before `RelinkClips`; supports dry-run. |
|
|
32
|
+
| `safe_unlink` | Supported | Validates clip IDs before `UnlinkClips`; supports dry-run. |
|
|
33
|
+
| `link_proxy_checked` | Supported | Validates clip ID and proxy file path before `LinkProxyMedia`. |
|
|
34
|
+
| `link_full_resolution_checked` | Supported on Resolve 20+ | Version-guards and validates path before `LinkFullResolutionMedia`. |
|
|
35
|
+
| `set_clip_marks` | Supported | Bulk `SetMarkInOut` for clip IDs or selected clips. |
|
|
36
|
+
| `clear_clip_marks` | Supported | Bulk `ClearMarkInOut` for clip IDs or selected clips. |
|
|
37
|
+
| `copy_clip_annotations` | Supported | Copies clip color, flags, and media-pool item markers from one clip to targets. |
|
|
38
|
+
| `media_pool_boundary_report` | Supported | Combines capabilities, Media Pool probe, and optional item probes. |
|
|
39
|
+
|
|
40
|
+
## Multicam Setup Helper
|
|
41
|
+
|
|
42
|
+
`setup_multicam_timeline` is intentionally documented as a helper tool rather
|
|
43
|
+
than API coverage. It prepares the timeline structure Resolve's multicam UI can
|
|
44
|
+
consume, while leaving native conversion to Resolve.
|
|
45
|
+
|
|
46
|
+
Supported planning inputs:
|
|
47
|
+
|
|
48
|
+
- `clip_ids`: simple one-angle-per-clip setup.
|
|
49
|
+
- `angles`: explicit rows with `clip_id`, `angle_name`, source range, track
|
|
50
|
+
index, audio track index, source timecode, record frame, or record offset.
|
|
51
|
+
- `sync_mode`: `stack_start`, `source_timecode`, or `record_frame`.
|
|
52
|
+
- `include_audio`: append audio-only rows for each angle.
|
|
53
|
+
- `dry_run`: return the planned append rows without creating a timeline.
|
|
54
|
+
|
|
55
|
+
After the helper creates the setup timeline, verify sync in Resolve, duplicate
|
|
56
|
+
the timeline if it should remain recoverable, then use the Media Pool context
|
|
57
|
+
menu command "Convert Compound Clips (Timelines) to Multicam Clips." See
|
|
58
|
+
`docs/guides/multicam-setup-guide.md` for examples and the Resolve 20 manual
|
|
59
|
+
reference.
|
|
60
|
+
|
|
61
|
+
For 2-pop or slate-clap assisted sync, run
|
|
62
|
+
`media_analysis(action="detect_sync_events")` first and pass its suggested
|
|
63
|
+
`record_offset` values into `setup_multicam_timeline(sync_mode="record_frame")`.
|
|
64
|
+
If the detected sync points should become Resolve markers, ask the user first;
|
|
65
|
+
the guarded write step is `media_analysis(action="add_sync_event_markers",
|
|
66
|
+
params={"confirm": true, ...})`.
|
|
67
|
+
|
|
68
|
+
## Supported Boundaries
|
|
69
|
+
|
|
70
|
+
- Media Storage browsing: volumes, subfolders, and file listing.
|
|
71
|
+
- Media import through simple paths and image sequence clipInfos.
|
|
72
|
+
- Safe import helpers with path validation and dry-run support.
|
|
73
|
+
- Media Pool organization: folder creation, current folder switching, selected
|
|
74
|
+
clip get/set, and clip moves.
|
|
75
|
+
- Multicam setup timelines: source-safe placement of existing Media Pool clips
|
|
76
|
+
on per-angle tracks via `AppendToTimeline([{clipInfo}])`, with stack-start,
|
|
77
|
+
manual record-frame, or source-timecode planning.
|
|
78
|
+
- Metadata: scalar and dict metadata writes, third-party metadata writes,
|
|
79
|
+
metadata copy, explicit normalization, and field inventory for mapping
|
|
80
|
+
analysis writeback targets to Resolve metadata/clip-property surfaces.
|
|
81
|
+
- Clip property probing: full snapshot plus known keys such as `File Path`,
|
|
82
|
+
`Type`, `FPS`, `Duration`, `Resolution`, `Codec`, and audio fields.
|
|
83
|
+
- Media Pool item annotations: markers, custom marker data, flags, clip color,
|
|
84
|
+
and mark in/out.
|
|
85
|
+
- Link boundaries: relink/unlink dry-runs, proxy linking, and Resolve 20+
|
|
86
|
+
full-resolution media linking, with generated media used for live validation.
|
|
87
|
+
- Export metadata to a caller-provided path.
|
|
88
|
+
|
|
89
|
+
## Partial Or Version-Dependent Areas
|
|
90
|
+
|
|
91
|
+
- Clip property writes are still key/media/build dependent. The kernel probes
|
|
92
|
+
properties read-only; raw `media_pool_item.set_clip_property` remains
|
|
93
|
+
available for explicit writes.
|
|
94
|
+
- Proxy and full-resolution linking may accept paths without deep media
|
|
95
|
+
compatibility validation. Use checked helpers for path validation, and verify
|
|
96
|
+
editorial intent before changing real project links.
|
|
97
|
+
- Audio transcription depends on Studio features, installed language
|
|
98
|
+
components, media type, and Resolve state; it remains exposed on existing
|
|
99
|
+
`folder` and `media_pool_item` actions, not folded into the ingest live pass.
|
|
100
|
+
- Image sequence import depends on a valid printf-style pattern and Resolve's
|
|
101
|
+
still/sequence interpretation.
|
|
102
|
+
- `ImportFolderFromFile` is a Resolve folder/project interchange operation, not
|
|
103
|
+
a general filesystem import. The safe helper validates the folder and supports
|
|
104
|
+
dry-run to prevent accidental misuse.
|
|
105
|
+
|
|
106
|
+
## Unsupported Or Intentionally Guarded
|
|
107
|
+
|
|
108
|
+
- Non-media files are not imported. The final live probe classified a generated
|
|
109
|
+
`.txt` fixture as `unsupported` because Resolve returned zero imported items
|
|
110
|
+
without raising an API error.
|
|
111
|
+
- The kernel does not create proxies, transcodes, renders, or derivatives of
|
|
112
|
+
source media.
|
|
113
|
+
- Destructive replacement APIs (`ReplaceClip`, `ReplaceClipPreserveSubClip`)
|
|
114
|
+
remain raw explicit clip actions and are not used by the kernel probe.
|
|
115
|
+
- Resolve does not guarantee a stable writable metadata schema across versions
|
|
116
|
+
or locales.
|
|
117
|
+
- Native multicam clip creation, angle switching, and multicam flattening are
|
|
118
|
+
not exposed by the public Resolve scripting API. The setup helper prepares a
|
|
119
|
+
timeline that can be converted to a native multicam clip in Resolve's UI. See
|
|
120
|
+
the installed DaVinci Resolve 20 Manual, Edit > Chapter 42, "Multicam
|
|
121
|
+
Editing," for the current UI workflow.
|
|
122
|
+
|
|
123
|
+
## Live Evidence
|
|
124
|
+
|
|
125
|
+
Final validation ran on May 9, 2026 with DaVinci Resolve Studio 20.3.2.9 and
|
|
126
|
+
Python 3.11.14.
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
python3.11 tests/live_media_pool_ingest_validation.py \
|
|
130
|
+
--output-dir /private/tmp/media-pool-ingest-probe-20260509-release
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Result:
|
|
134
|
+
|
|
135
|
+
- `supported`: 56
|
|
136
|
+
- `unsupported`: 1
|
|
137
|
+
- `partially_supported`: 0
|
|
138
|
+
- `version_or_page_dependent`: 0
|
|
139
|
+
- `write_only_unverifiable`: 0
|
|
140
|
+
- `read_only`: 0
|
|
141
|
+
- `not_applicable`: 0
|
|
142
|
+
- `error`: 0
|
|
143
|
+
|
|
144
|
+
The live harness created and deleted a disposable project named
|
|
145
|
+
`_mcp_media_pool_ingest_probe_1778341105`, generated synthetic video/audio/still
|
|
146
|
+
fixtures, wrote JSON and Markdown reports, and removed the generated media
|
|
147
|
+
directory after the report was written.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Project / Database / Archive Kernel
|
|
2
|
+
|
|
3
|
+
The Project / Database / Archive kernel expands `project_manager` into a guarded
|
|
4
|
+
project lifecycle, settings, database, preset, and archive boundary layer.
|
|
5
|
+
|
|
6
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with disposable
|
|
7
|
+
`_mcp_project_lifecycle_*` projects only. The probe created an empty timeline,
|
|
8
|
+
saved the disposable project, exported/imported through a temp DRP, exercised
|
|
9
|
+
project folders, layout presets, page switching, database dry-runs, settings
|
|
10
|
+
snapshot/write/restore, and archive guards. Final release probe counts:
|
|
11
|
+
|
|
12
|
+
| Status | Count |
|
|
13
|
+
| --- | ---: |
|
|
14
|
+
| `supported` | 35 |
|
|
15
|
+
| `partially_supported` | 5 |
|
|
16
|
+
| `unsupported` | 1 |
|
|
17
|
+
| `not_applicable` | 1 |
|
|
18
|
+
| `version_or_page_dependent` | 0 |
|
|
19
|
+
| `error` | 0 |
|
|
20
|
+
|
|
21
|
+
The unsupported result is intentional: archive calls that request source media,
|
|
22
|
+
render cache, or proxy media are rejected by default unless explicitly opted in.
|
|
23
|
+
|
|
24
|
+
## Added Actions
|
|
25
|
+
|
|
26
|
+
All kernel actions are exposed through `project_manager`.
|
|
27
|
+
|
|
28
|
+
| Action | Purpose |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `project_capabilities` | Report ProjectManager, Project, layout preset, render preset, and safety-guard availability. |
|
|
31
|
+
| `probe_project_lifecycle` | Snapshot current project, current folder, project list, folder list, and ProjectManager methods. |
|
|
32
|
+
| `probe_project_settings` | Read candidate project settings and optionally dry-run/write-restore candidates. |
|
|
33
|
+
| `safe_project_create` | Create disposable `_mcp_` projects with optional temp media-location guard. |
|
|
34
|
+
| `safe_project_export` | Export disposable projects to temp DRP paths; stills/LUTs are off by default. |
|
|
35
|
+
| `safe_project_import` | Import temp DRP projects under disposable `_mcp_` names. |
|
|
36
|
+
| `safe_project_archive` | Archive disposable projects with media/cache/proxy flags forced false by default. |
|
|
37
|
+
| `safe_project_restore` | Restore temp project archives or DRPs under disposable `_mcp_` names. |
|
|
38
|
+
| `safe_project_delete` | Delete disposable projects, with explicit `close_current=True` required for the open project. |
|
|
39
|
+
| `safe_set_project_settings` | Validate, write, read back, and restore project settings. |
|
|
40
|
+
| `project_settings_snapshot` | Snapshot project settings, presets, timeline count, current timeline, render presets, and color groups. |
|
|
41
|
+
| `database_capabilities` | Read current database, database list, and switch safety constraints. |
|
|
42
|
+
| `safe_set_current_database` | Dry-run database switches by default because switching closes open projects. |
|
|
43
|
+
| `preset_lifecycle_probe` | Report project, render, quick-export, Fairlight, layout, render-preset, and burn-in preset surfaces. |
|
|
44
|
+
| `project_boundary_report` | Return the full lifecycle, settings, database, preset, and cloud boundary report. |
|
|
45
|
+
|
|
46
|
+
`project_manager_folders` also now normalizes both documented string folder
|
|
47
|
+
returns and newer folder-object returns.
|
|
48
|
+
|
|
49
|
+
## Supported Findings
|
|
50
|
+
|
|
51
|
+
- Disposable project creation, current-project readback, save, and delete worked.
|
|
52
|
+
- Empty timeline creation inside the disposable project worked and gave the
|
|
53
|
+
project enough structure for DRP export.
|
|
54
|
+
- DRP export and `ImportProject` under a new `_mcp_` name worked.
|
|
55
|
+
- Project folder list/create/open/current/goto-parent/delete worked.
|
|
56
|
+
- Full project settings snapshots worked, including project presets, render
|
|
57
|
+
presets, quick-export presets, timeline count, current timeline, and color
|
|
58
|
+
groups.
|
|
59
|
+
- Same-value write/readback/restore worked for `timelineResolutionWidth`.
|
|
60
|
+
- Database current/list probing worked, and guarded database switching correctly
|
|
61
|
+
dry-ran by default.
|
|
62
|
+
- Layout preset save/update/load/export/import/delete worked with `_mcp_`
|
|
63
|
+
temp names.
|
|
64
|
+
- All Resolve pages opened successfully through `resolve_control.open_page`.
|
|
65
|
+
- Keyframe mode readback worked.
|
|
66
|
+
- The combined boundary report worked and includes cloud methods as
|
|
67
|
+
shape-only, infrastructure-dependent capabilities.
|
|
68
|
+
|
|
69
|
+
## Boundaries
|
|
70
|
+
|
|
71
|
+
- `ProjectManager.RestoreProject` returned false when pointed at the exported
|
|
72
|
+
DRP. `ImportProject` is the supported path for temp DRP round-trips in this
|
|
73
|
+
probe.
|
|
74
|
+
- `ProjectManager.ArchiveProject` returned false for both a `.dra` path and a
|
|
75
|
+
folder-style path, even with `src_media=False`, `render_cache=False`, and
|
|
76
|
+
`proxy_media=False`.
|
|
77
|
+
- Archive calls with source media, render cache, or proxy media are blocked by
|
|
78
|
+
default. This protects source media integrity and avoids large cache/proxy
|
|
79
|
+
copies.
|
|
80
|
+
- `Resolve.SetKeyframeMode` returned false when setting the current keyframe
|
|
81
|
+
mode back to itself, though `GetKeyframeMode` worked.
|
|
82
|
+
- `Resolve.ExportRenderPreset` returned false for the first listed render
|
|
83
|
+
preset in the release probe. Render/quick-export preset listing still worked.
|
|
84
|
+
- `Project.GetRenderSettings` was not present on the live Project object, so
|
|
85
|
+
render settings remain covered by the Render / Deliver kernel's existing
|
|
86
|
+
guarded actions.
|
|
87
|
+
- Cloud project create/load/import/restore methods are exposed by the API, but
|
|
88
|
+
default validation treats them as shape-only because they require Resolve
|
|
89
|
+
cloud infrastructure and media-location settings.
|
|
90
|
+
|
|
91
|
+
## Safety Rules
|
|
92
|
+
|
|
93
|
+
- Safe project create/import/restore/delete actions require names beginning with
|
|
94
|
+
`_mcp_` unless `allow_non_mcp_name=True`.
|
|
95
|
+
- Safe export/import/archive/restore paths must be under the system temp
|
|
96
|
+
directory unless `require_temp_path=False`.
|
|
97
|
+
- Safe project delete refuses to delete the currently open project unless
|
|
98
|
+
`close_current=True`.
|
|
99
|
+
- Safe database switching is a dry-run unless both `allow_switch=True` and
|
|
100
|
+
`dry_run=False` are provided.
|
|
101
|
+
- Safe archive defaults all media/cache/proxy flags to false and rejects any
|
|
102
|
+
true flag unless `allow_media_archive=True`.
|
|
103
|
+
|
|
104
|
+
## Live Probe
|
|
105
|
+
|
|
106
|
+
Run the live boundary probe with:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
python3.11 tests/live_project_lifecycle_validation.py --output-dir /tmp/project-lifecycle-probe
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The harness creates disposable `_mcp_` projects, creates an empty timeline,
|
|
113
|
+
saves the project, probes DRP export/import, archive/restore boundaries,
|
|
114
|
+
project folder lifecycle, project settings write/restore, database dry-runs,
|
|
115
|
+
layout preset lifecycle, page switching, keyframe mode, preset listings, writes
|
|
116
|
+
JSON and Markdown reports, deletes disposable projects and layout presets, and
|
|
117
|
+
removes temp work files.
|
|
118
|
+
|
|
119
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
120
|
+
projects by hand.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Render / Deliver Kernel
|
|
2
|
+
|
|
3
|
+
The Render / Deliver kernel adds a safer planning and validation layer over
|
|
4
|
+
Resolve's render queue, render settings, format/codec discovery, presets, and
|
|
5
|
+
Quick Export APIs.
|
|
6
|
+
|
|
7
|
+
Live probes use disposable `_mcp_...` projects, generated synthetic media, and
|
|
8
|
+
temporary output directories only. They may render derivatives of generated
|
|
9
|
+
fixtures, but never render, transcode, proxy, or overwrite user source media.
|
|
10
|
+
|
|
11
|
+
## New Compound Actions
|
|
12
|
+
|
|
13
|
+
All actions are under `render(action=...)`.
|
|
14
|
+
|
|
15
|
+
| Action | Status | Purpose |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `render_capabilities` | Supported | Reports render method availability, formats, presets, quick-export presets, setting keys, and safety guards. |
|
|
18
|
+
| `probe_render_matrix` | Supported | Builds a format/codec/resolution compatibility matrix. |
|
|
19
|
+
| `probe_render_settings` | Supported with readback boundary | Captures current format/codec, mode, jobs, render state, and settings when Resolve exposes settings readback. |
|
|
20
|
+
| `validate_render_settings` | Supported | Validates supported setting keys, value types, frame ranges, and optional temp-target requirements. |
|
|
21
|
+
| `safe_set_render_settings` | Supported | Validates settings before `SetRenderSettings`, reports post-set readback/coercion when available, and supports dry-run. |
|
|
22
|
+
| `prepare_render_job` | Supported | Validates target directory/settings, optionally sets format/codec, applies settings, and adds a render job without starting it. |
|
|
23
|
+
| `render_job_lifecycle_probe` | Supported | Adds a job, reads status, and deletes the job to validate queue lifecycle safely. |
|
|
24
|
+
| `quick_export_capabilities` | Supported | Lists Quick Export presets and enforced safety guards. |
|
|
25
|
+
| `safe_quick_export` | Supported dry-run | Validates temp target, forces `EnableUpload=False`, and requires `allow_render=True` before actual Quick Export execution. |
|
|
26
|
+
| `export_render_boundary_report` | Supported | Combines capabilities, settings snapshot, format matrix, and Quick Export capabilities. |
|
|
27
|
+
|
|
28
|
+
## Supported Boundaries
|
|
29
|
+
|
|
30
|
+
- Format discovery through `GetRenderFormats`.
|
|
31
|
+
- Codec discovery for every returned format through `GetRenderCodecs`.
|
|
32
|
+
- Resolution discovery for every format/codec pair through
|
|
33
|
+
`GetRenderResolutions`.
|
|
34
|
+
- Current format/codec set and readback.
|
|
35
|
+
- Current render mode get/set.
|
|
36
|
+
- Render preset list, save, and delete for temporary MCP-named presets.
|
|
37
|
+
- Render setting validation for documented `SetRenderSettings` keys.
|
|
38
|
+
- Safe render job preparation into a temp target directory.
|
|
39
|
+
- Job queue lifecycle: add, status, delete.
|
|
40
|
+
- Actual synthetic render start/completion for a two-second generated timeline.
|
|
41
|
+
- Quick Export preset discovery and guarded dry-run planning.
|
|
42
|
+
|
|
43
|
+
## Version Or Page Dependent Boundaries
|
|
44
|
+
|
|
45
|
+
- `GetRenderSettings` is documented, but in the final Resolve Studio 20.3.2.9
|
|
46
|
+
live probe the project attribute was not callable. The kernel treats settings
|
|
47
|
+
readback as version/page dependent and still validates and applies settings
|
|
48
|
+
through `SetRenderSettings`.
|
|
49
|
+
- Render format and codec availability is machine, OS, license, and plugin
|
|
50
|
+
dependent. The final live probe found 23 formats and 99 format/codec pairs.
|
|
51
|
+
- Some settings may be accepted but not readable for coercion checks on builds
|
|
52
|
+
where `GetRenderSettings` is unavailable.
|
|
53
|
+
- Quick Export actual execution is intentionally gated behind
|
|
54
|
+
`allow_render=True`, because it starts rendering immediately and can involve
|
|
55
|
+
upload-capable presets. The safe helper always forces `EnableUpload=False`.
|
|
56
|
+
|
|
57
|
+
## Unsupported Or Guarded
|
|
58
|
+
|
|
59
|
+
- Render lifecycle helpers require temp output directories by default. Passing
|
|
60
|
+
real delivery paths requires explicit lower-level actions or disabling the
|
|
61
|
+
temp guard.
|
|
62
|
+
- Upload-enabled Quick Export is not allowed through `safe_quick_export`.
|
|
63
|
+
- Import/export of render and burn-in preset files remains exposed through the
|
|
64
|
+
existing `render_presets` tool, but the live kernel probe does not fabricate
|
|
65
|
+
arbitrary preset files.
|
|
66
|
+
|
|
67
|
+
## Live Evidence
|
|
68
|
+
|
|
69
|
+
Final validation ran on May 9, 2026 with DaVinci Resolve Studio 20.3.2.9 and
|
|
70
|
+
Python 3.11.14.
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
python3.11 tests/live_render_deliver_validation.py \
|
|
74
|
+
--output-dir /private/tmp/render-deliver-probe-20260509-release
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Result:
|
|
78
|
+
|
|
79
|
+
- `supported`: 23
|
|
80
|
+
- `version_or_page_dependent`: 1
|
|
81
|
+
- `unsupported`: 0
|
|
82
|
+
- `partially_supported`: 0
|
|
83
|
+
- `write_only_unverifiable`: 0
|
|
84
|
+
- `read_only`: 0
|
|
85
|
+
- `not_applicable`: 0
|
|
86
|
+
- `error`: 0
|
|
87
|
+
|
|
88
|
+
The live harness created and deleted a disposable project named
|
|
89
|
+
`_mcp_render_deliver_probe_1778342107`, generated synthetic media, probed 23
|
|
90
|
+
formats and 99 format/codec pairs, rendered one tiny synthetic output, wrote
|
|
91
|
+
JSON and Markdown reports, and removed the generated media and render output
|
|
92
|
+
directories after the report was written.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Review Annotation Kernel
|
|
2
|
+
|
|
3
|
+
The Review Annotation kernel expands `timeline_markers` into a scope-aware
|
|
4
|
+
annotation layer for timeline markers, timeline item markers, media pool item
|
|
5
|
+
markers, flags, clip colors, and read-only review reports.
|
|
6
|
+
|
|
7
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with a
|
|
8
|
+
disposable `_mcp_review_annotation_probe_*` project and generated synthetic
|
|
9
|
+
video/audio media. Final release probe counts:
|
|
10
|
+
|
|
11
|
+
| Status | Count |
|
|
12
|
+
| --- | ---: |
|
|
13
|
+
| `supported` | 44 |
|
|
14
|
+
| `unsupported` | 1 |
|
|
15
|
+
| `partially_supported` | 0 |
|
|
16
|
+
| `version_or_page_dependent` | 0 |
|
|
17
|
+
| `error` | 0 |
|
|
18
|
+
|
|
19
|
+
The single `unsupported` result is the expected invalid marker color boundary
|
|
20
|
+
for `color="Invisible"`.
|
|
21
|
+
|
|
22
|
+
## Added Actions
|
|
23
|
+
|
|
24
|
+
All actions are exposed through `timeline_markers`.
|
|
25
|
+
|
|
26
|
+
| Action | Purpose |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `annotation_capabilities` | Return supported scopes, colors, aliases, and known boundaries. |
|
|
29
|
+
| `probe_annotations` | Snapshot markers, flags, clip color, ids, and names for one scope or the current timeline context. |
|
|
30
|
+
| `normalize_marker_payload` | Normalize frame aliases, timecode, color, name/label, note/comment, duration, and custom data aliases. |
|
|
31
|
+
| `copy_annotations` | Copy markers between annotation scopes, optionally carrying flags and clip color. |
|
|
32
|
+
| `move_annotations` | Copy markers, then clear source markers when the source exposes marker deletion. |
|
|
33
|
+
| `sync_marker_custom_data` | Update marker custom data for timeline, timeline item, or media pool item scope. |
|
|
34
|
+
| `clear_annotations_by_scope` | Clear markers by color/custom data and optionally clear flags and clip color. |
|
|
35
|
+
| `export_review_report` | Return a read-only annotation report with optional capability metadata. |
|
|
36
|
+
| `annotation_boundary_report` | Return capabilities plus a live annotation snapshot. |
|
|
37
|
+
|
|
38
|
+
## Scope Matrix
|
|
39
|
+
|
|
40
|
+
| Scope | Markers | Custom Data | Flags | Clip Color | Frame Space |
|
|
41
|
+
| --- | --- | --- | --- | --- | --- |
|
|
42
|
+
| `timeline` | Supported | Supported | Not exposed | Not exposed | Timeline frame id or timeline timecode. |
|
|
43
|
+
| `timeline_item` | Supported | Supported | Supported | Supported | Timeline item marker frames. |
|
|
44
|
+
| `media_pool_item` | Supported | Supported | Supported | Supported | Source/media pool item frames. |
|
|
45
|
+
|
|
46
|
+
## Marker Payloads
|
|
47
|
+
|
|
48
|
+
The kernel accepts these frame inputs:
|
|
49
|
+
|
|
50
|
+
- `frame`
|
|
51
|
+
- `frame_id`
|
|
52
|
+
- `frameId`
|
|
53
|
+
- `frame_num`
|
|
54
|
+
- `frameNum`
|
|
55
|
+
- `timecode`
|
|
56
|
+
- `tc`
|
|
57
|
+
|
|
58
|
+
The kernel accepts `custom_data` and `customData`, plus `label` as an alias for
|
|
59
|
+
`name` and `comment` as an alias for `note`.
|
|
60
|
+
|
|
61
|
+
Validated marker colors:
|
|
62
|
+
|
|
63
|
+
`Blue`, `Cyan`, `Green`, `Yellow`, `Red`, `Pink`, `Purple`, `Fuchsia`, `Rose`,
|
|
64
|
+
`Lavender`, `Sky`, `Mint`, `Lemon`, `Sand`, `Cocoa`, `Cream`.
|
|
65
|
+
|
|
66
|
+
## Supported Findings
|
|
67
|
+
|
|
68
|
+
- Timeline marker add/get/update/custom-data readback works with frame,
|
|
69
|
+
`frame_id`, `frameId`, explicit timecode, and current-playhead insertion.
|
|
70
|
+
- All documented marker colors were accepted in the live Resolve build.
|
|
71
|
+
- Timeline item markers support marker copy and custom data updates.
|
|
72
|
+
- Timeline item flags and clip color support add/read/set/clear.
|
|
73
|
+
- Media pool item markers, flags, and clip color support add/set/read/clear
|
|
74
|
+
through the existing MCP wrappers and the new copy/move kernel helpers.
|
|
75
|
+
- `copy_annotations` successfully copied 21 timeline markers to a timeline
|
|
76
|
+
item in the live probe.
|
|
77
|
+
- `move_annotations` successfully copied a media pool item marker to the
|
|
78
|
+
timeline and cleared the source marker.
|
|
79
|
+
- `clear_annotations_by_scope` supports Resolve's `"All"` color sentinel for
|
|
80
|
+
marker cleanup on timeline and timeline item scopes.
|
|
81
|
+
- `export_review_report` and `annotation_boundary_report` are read-only
|
|
82
|
+
summaries over current annotation state.
|
|
83
|
+
|
|
84
|
+
## Boundaries
|
|
85
|
+
|
|
86
|
+
- Timeline, timeline item, and media pool item frame spaces are not equivalent.
|
|
87
|
+
`copy_annotations` uses direct frame numbers; callers must map frames when
|
|
88
|
+
moving between source, item-local, and timeline coordinate systems.
|
|
89
|
+
- Current-playhead marker insertion depends on a current timeline and readable
|
|
90
|
+
current timecode.
|
|
91
|
+
- `probe_annotations` only includes timeline item and media pool item scopes
|
|
92
|
+
when Resolve can resolve a current video item at the playhead.
|
|
93
|
+
- Flags and clip colors are review metadata, but they are not marker records.
|
|
94
|
+
They are copied only when both source and target expose compatible methods.
|
|
95
|
+
- Invalid marker colors are rejected before calling Resolve.
|
|
96
|
+
|
|
97
|
+
## Live Probe
|
|
98
|
+
|
|
99
|
+
Run the live boundary probe with:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
python3.11 tests/live_review_annotation_validation.py --output-dir /tmp/review-annotation-probe
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The harness creates a disposable project, generates a short synthetic video
|
|
106
|
+
with audio, imports it, creates a timeline, probes annotation operations, writes
|
|
107
|
+
JSON and Markdown reports, deletes the project, and removes generated media.
|
|
108
|
+
|
|
109
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
110
|
+
project by hand.
|