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.
Files changed (92) hide show
  1. package/AGENTS.md +85 -0
  2. package/CHANGELOG.md +802 -0
  3. package/CLAUDE.md +15 -0
  4. package/LICENSE +21 -0
  5. package/README.md +159 -0
  6. package/SECURITY.md +53 -0
  7. package/bin/davinci-resolve-mcp.mjs +376 -0
  8. package/docs/README.md +56 -0
  9. package/docs/SKILL.md +1145 -0
  10. package/docs/authoring/fuse-dctl-authoring.md +242 -0
  11. package/docs/authoring/script-plugin-authoring.md +195 -0
  12. package/docs/contributing.md +82 -0
  13. package/docs/guides/color-decision-guide.md +387 -0
  14. package/docs/guides/editorial-decision-guide.md +136 -0
  15. package/docs/guides/media-analysis-guide.md +615 -0
  16. package/docs/guides/multicam-setup-guide.md +138 -0
  17. package/docs/install.md +198 -0
  18. package/docs/integrations/workflow-integrations.md +120 -0
  19. package/docs/kernels/README.md +28 -0
  20. package/docs/kernels/audio-fairlight-kernel.md +86 -0
  21. package/docs/kernels/color-grade-kernel.md +103 -0
  22. package/docs/kernels/extension-authoring-kernel.md +101 -0
  23. package/docs/kernels/fusion-composition-kernel.md +91 -0
  24. package/docs/kernels/media-pool-ingest-kernel.md +147 -0
  25. package/docs/kernels/project-lifecycle-kernel.md +120 -0
  26. package/docs/kernels/render-deliver-kernel.md +92 -0
  27. package/docs/kernels/review-annotation-kernel.md +110 -0
  28. package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
  29. package/docs/kernels/timeline-edit-kernel.md +189 -0
  30. package/docs/notes/codec-plugin-notes.md +136 -0
  31. package/docs/notes/dctl-notes.md +234 -0
  32. package/docs/notes/fusion-template-notes.md +136 -0
  33. package/docs/notes/lut-notes.md +136 -0
  34. package/docs/notes/openfx-notes.md +120 -0
  35. package/docs/process/release-process.md +152 -0
  36. package/docs/reference/api-coverage.md +488 -0
  37. package/docs/reference/resolve_scripting_api.txt +1012 -0
  38. package/examples/README.md +53 -0
  39. package/examples/markers/README.md +81 -0
  40. package/examples/media/README.md +94 -0
  41. package/examples/timeline/README.md +98 -0
  42. package/install.py +1196 -0
  43. package/package.json +52 -0
  44. package/scripts/audit_api_parity.py +275 -0
  45. package/scripts/live_media_analysis_polish_probe.py +65 -0
  46. package/src/__init__.py +3 -0
  47. package/src/analysis_dashboard.py +4936 -0
  48. package/src/control_panel.py +13 -0
  49. package/src/granular/__init__.py +17 -0
  50. package/src/granular/common.py +727 -0
  51. package/src/granular/folder.py +287 -0
  52. package/src/granular/gallery.py +306 -0
  53. package/src/granular/graph.py +309 -0
  54. package/src/granular/media_pool.py +679 -0
  55. package/src/granular/media_pool_item.py +852 -0
  56. package/src/granular/media_storage.py +179 -0
  57. package/src/granular/project.py +1594 -0
  58. package/src/granular/resolve_control.py +521 -0
  59. package/src/granular/timeline.py +1074 -0
  60. package/src/granular/timeline_item.py +2251 -0
  61. package/src/resolve_mcp_server.py +43 -0
  62. package/src/server.py +15691 -0
  63. package/src/utils/__init__.py +3 -0
  64. package/src/utils/app_control.py +319 -0
  65. package/src/utils/audio_fairlight_live_probe.py +263 -0
  66. package/src/utils/cdl.py +20 -0
  67. package/src/utils/cloud_operations.py +192 -0
  68. package/src/utils/color_grade_live_probe.py +444 -0
  69. package/src/utils/dctl_templates.py +368 -0
  70. package/src/utils/extension_authoring_live_probe.py +292 -0
  71. package/src/utils/fuse_templates.py +1968 -0
  72. package/src/utils/fusion_composition_live_probe.py +284 -0
  73. package/src/utils/layout_presets.py +333 -0
  74. package/src/utils/mcp_stdio.py +32 -0
  75. package/src/utils/media_analysis.py +3618 -0
  76. package/src/utils/media_analysis_jobs.py +796 -0
  77. package/src/utils/media_pool_ingest_live_probe.py +592 -0
  78. package/src/utils/multicam.py +393 -0
  79. package/src/utils/object_inspection.py +287 -0
  80. package/src/utils/platform.py +157 -0
  81. package/src/utils/project_lifecycle_live_probe.py +376 -0
  82. package/src/utils/project_properties.py +601 -0
  83. package/src/utils/render_deliver_live_probe.py +384 -0
  84. package/src/utils/resolve_connection.py +77 -0
  85. package/src/utils/review_annotation_live_probe.py +352 -0
  86. package/src/utils/script_templates.py +1193 -0
  87. package/src/utils/sync_detection.py +887 -0
  88. package/src/utils/timeline_conform_live_probe.py +280 -0
  89. package/src/utils/timeline_kernel_live_probe.py +1091 -0
  90. package/src/utils/timeline_kernel_probe.py +185 -0
  91. package/src/utils/timeline_title_text.py +87 -0
  92. 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.