@hybridlabor-api/aos 4.4.1 → 4.4.2-beta.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 (305) hide show
  1. package/.agents/skills/firecrawl/SKILL.md +149 -0
  2. package/.agents/skills/firecrawl/rules/install.md +82 -0
  3. package/.agents/skills/firecrawl/rules/security.md +26 -0
  4. package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
  5. package/.agents/skills/firecrawl-build/SKILL.md +39 -0
  6. package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
  7. package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
  8. package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
  9. package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
  10. package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
  11. package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
  12. package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
  13. package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
  14. package/.agents/skills/firecrawl-download/SKILL.md +70 -0
  15. package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
  16. package/.agents/skills/firecrawl-map/SKILL.md +51 -0
  17. package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
  18. package/.agents/skills/firecrawl-search/SKILL.md +60 -0
  19. package/CLAUDE.md +573 -0
  20. package/README.de.md +0 -8
  21. package/README.md +0 -8
  22. package/README.pt.md +0 -8
  23. package/assets/brand/ao-ant-mark.svg +91 -0
  24. package/assets/brand/bdb-core-mark.svg +34 -0
  25. package/assets/brand/heimdall-guardian-mark.svg +16 -0
  26. package/assets/brand/memb-crystal-mark.svg +18 -0
  27. package/bin/aos-config.mjs +89 -0
  28. package/bin/aos-dashboard.mjs +608 -0
  29. package/bin/aos-uninstall.mjs +227 -0
  30. package/docs/sessions/audit-2026-09-14-silent-failures.md +114 -0
  31. package/docs/skills_table.md +0 -3
  32. package/installer.js +387 -237
  33. package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
  34. package/mcps/after-effects-mcp/build/index.js +840 -0
  35. package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
  36. package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
  37. package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
  38. package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
  39. package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
  40. package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
  41. package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
  42. package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
  43. package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
  44. package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
  45. package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
  46. package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
  47. package/mcps/computer-use-mcp/dist/client.js +136 -0
  48. package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
  49. package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
  50. package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
  51. package/mcps/computer-use-mcp/dist/native.js +50 -0
  52. package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
  53. package/mcps/computer-use-mcp/dist/server.js +342 -0
  54. package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
  55. package/mcps/computer-use-mcp/dist/session.js +2372 -0
  56. package/package.json +13 -4
  57. package/skills/global_config/aos-project-init/SKILL.md +97 -130
  58. package/skills/global_config/aos-project-init/assets/openwikiignore.template +62 -0
  59. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +38 -1
  60. package/skills/global_config/aos-setup/SKILL.md +98 -8
  61. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +21 -2
  62. package/skills/global_config/ask-tim/SKILL.md +2 -7
  63. package/skills/global_config/openwiki-skill/scripts/openwiki_daemon.py +65 -12
  64. package/bin/setup-saas.mjs +0 -792
  65. package/mcps/blender-mcp-server/.dockerignore +0 -19
  66. package/mcps/blender-mcp-server/.github/workflows/ci.yml +0 -67
  67. package/mcps/blender-mcp-server/.github/workflows/publish-pypi.yml +0 -54
  68. package/mcps/blender-mcp-server/CHANGELOG.md +0 -64
  69. package/mcps/blender-mcp-server/CONTRIBUTING.md +0 -107
  70. package/mcps/blender-mcp-server/Dockerfile +0 -19
  71. package/mcps/blender-mcp-server/LICENSE +0 -21
  72. package/mcps/blender-mcp-server/README.md +0 -409
  73. package/mcps/blender-mcp-server/addon/__init__.py +0 -1440
  74. package/mcps/blender-mcp-server/addon/models.py +0 -223
  75. package/mcps/blender-mcp-server/pyproject.toml +0 -120
  76. package/mcps/blender-mcp-server/scripts/blender_bridge_request.py +0 -71
  77. package/mcps/blender-mcp-server/scripts/blender_create_test_cube.py +0 -49
  78. package/mcps/blender-mcp-server/scripts/blender_scene_info.py +0 -38
  79. package/mcps/blender-mcp-server/scripts/build_addon_zip.sh +0 -29
  80. package/mcps/blender-mcp-server/scripts/demos/README.md +0 -186
  81. package/mcps/blender-mcp-server/scripts/demos/dam_break_scene.py +0 -276
  82. package/mcps/blender-mcp-server/scripts/demos/open_dam_break_gui.py +0 -33
  83. package/mcps/blender-mcp-server/scripts/demos/pipe_movement_study.py +0 -518
  84. package/mcps/blender-mcp-server/scripts/demos/pipe_pressure_failure_scene.py +0 -806
  85. package/mcps/blender-mcp-server/scripts/demos/procedural_dam_break_scene.py +0 -600
  86. package/mcps/blender-mcp-server/scripts/demos/run_dam_break.py +0 -510
  87. package/mcps/blender-mcp-server/scripts/launch_blender_gui.py +0 -41
  88. package/mcps/blender-mcp-server/scripts/library/README.md +0 -64
  89. package/mcps/blender-mcp-server/scripts/library/apply_transforms.py +0 -46
  90. package/mcps/blender-mcp-server/scripts/library/camera.py +0 -51
  91. package/mcps/blender-mcp-server/scripts/library/collections.py +0 -65
  92. package/mcps/blender-mcp-server/scripts/library/create_mesh.py +0 -41
  93. package/mcps/blender-mcp-server/scripts/library/effector.py +0 -48
  94. package/mcps/blender-mcp-server/scripts/library/fluid_domain.py +0 -80
  95. package/mcps/blender-mcp-server/scripts/library/fluid_inflow.py +0 -98
  96. package/mcps/blender-mcp-server/scripts/library/frame_range.py +0 -35
  97. package/mcps/blender-mcp-server/scripts/library/keyframes.py +0 -59
  98. package/mcps/blender-mcp-server/scripts/library/rigid_body.py +0 -52
  99. package/mcps/blender-mcp-server/scripts/library/save_blend.py +0 -40
  100. package/mcps/blender-mcp-server/scripts/server_start.sh +0 -26
  101. package/mcps/blender-mcp-server/src/blender_mcp_server/__init__.py +0 -3
  102. package/mcps/blender-mcp-server/src/blender_mcp_server/headless.py +0 -330
  103. package/mcps/blender-mcp-server/src/blender_mcp_server/server.py +0 -606
  104. package/mcps/davinci-mcp-professional/.bandit +0 -35
  105. package/mcps/davinci-mcp-professional/.claude/commands/security-review.md +0 -191
  106. package/mcps/davinci-mcp-professional/.claude/settings.json +0 -1
  107. package/mcps/davinci-mcp-professional/.editorconfig +0 -27
  108. package/mcps/davinci-mcp-professional/.gitattributes +0 -207
  109. package/mcps/davinci-mcp-professional/.github/CODEOWNERS +0 -2
  110. package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/bug_report.md +0 -33
  111. package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
  112. package/mcps/davinci-mcp-professional/.github/PULL_REQUEST_TEMPLATE.md +0 -20
  113. package/mcps/davinci-mcp-professional/.github/SECURITY.md +0 -97
  114. package/mcps/davinci-mcp-professional/.github/dependabot.yml +0 -27
  115. package/mcps/davinci-mcp-professional/.github/workflows/ci.yml +0 -39
  116. package/mcps/davinci-mcp-professional/ATTRIBUTION.md +0 -4
  117. package/mcps/davinci-mcp-professional/AUTHORS.md +0 -9
  118. package/mcps/davinci-mcp-professional/BUGS.md +0 -55
  119. package/mcps/davinci-mcp-professional/CLAUDE.md +0 -229
  120. package/mcps/davinci-mcp-professional/CONTRIBUTING.md +0 -51
  121. package/mcps/davinci-mcp-professional/COPYING.md +0 -228
  122. package/mcps/davinci-mcp-professional/Doxyfile +0 -379
  123. package/mcps/davinci-mcp-professional/README.md +0 -143
  124. package/mcps/davinci-mcp-professional/SECURITY.md +0 -40
  125. package/mcps/davinci-mcp-professional/USING.md +0 -301
  126. package/mcps/davinci-mcp-professional/VERSION.md +0 -13
  127. package/mcps/davinci-mcp-professional/build.py +0 -169
  128. package/mcps/davinci-mcp-professional/claude_desktop_config_template.json +0 -11
  129. package/mcps/davinci-mcp-professional/hooks/ci-check.sh +0 -29
  130. package/mcps/davinci-mcp-professional/hooks/pre-push +0 -46
  131. package/mcps/davinci-mcp-professional/main.py +0 -40
  132. package/mcps/davinci-mcp-professional/mcp_server.py +0 -30
  133. package/mcps/davinci-mcp-professional/pyproject.toml +0 -115
  134. package/mcps/davinci-mcp-professional/security_audit.py +0 -379
  135. package/mcps/davinci-mcp-professional/src/davinci_mcp/__init__.py +0 -19
  136. package/mcps/davinci-mcp-professional/src/davinci_mcp/cli.py +0 -138
  137. package/mcps/davinci-mcp-professional/src/davinci_mcp/resolve_client.py +0 -342
  138. package/mcps/davinci-mcp-professional/src/davinci_mcp/resources/__init__.py +0 -60
  139. package/mcps/davinci-mcp-professional/src/davinci_mcp/server.py +0 -185
  140. package/mcps/davinci-mcp-professional/src/davinci_mcp/tools/__init__.py +0 -146
  141. package/mcps/davinci-mcp-professional/src/davinci_mcp/types.py +0 -125
  142. package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/__init__.py +0 -19
  143. package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/platform.py +0 -239
  144. package/mcps/davinci-mcp-professional/test.py +0 -186
  145. package/mcps/davinci-mcp-professional/uv.lock +0 -2073
  146. package/mcps/davinci-resolve-mcp/.claude/skills/media-analysis.md +0 -44
  147. package/mcps/davinci-resolve-mcp/.clinerules +0 -17
  148. package/mcps/davinci-resolve-mcp/.cursorrules +0 -17
  149. package/mcps/davinci-resolve-mcp/.github/copilot-instructions.md +0 -17
  150. package/mcps/davinci-resolve-mcp/.github/workflows/npm-publish.yml +0 -109
  151. package/mcps/davinci-resolve-mcp/.windsurfrules +0 -17
  152. package/mcps/davinci-resolve-mcp/AGENTS.md +0 -114
  153. package/mcps/davinci-resolve-mcp/CHANGELOG.md +0 -2648
  154. package/mcps/davinci-resolve-mcp/CLAUDE.md +0 -15
  155. package/mcps/davinci-resolve-mcp/LICENSE +0 -21
  156. package/mcps/davinci-resolve-mcp/README.md +0 -173
  157. package/mcps/davinci-resolve-mcp/SECURITY.md +0 -53
  158. package/mcps/davinci-resolve-mcp/bin/davinci-resolve-mcp.mjs +0 -450
  159. package/mcps/davinci-resolve-mcp/examples/README.md +0 -53
  160. package/mcps/davinci-resolve-mcp/examples/markers/README.md +0 -81
  161. package/mcps/davinci-resolve-mcp/examples/media/README.md +0 -94
  162. package/mcps/davinci-resolve-mcp/examples/timeline/README.md +0 -98
  163. package/mcps/davinci-resolve-mcp/install.py +0 -1687
  164. package/mcps/davinci-resolve-mcp/package.json +0 -52
  165. package/mcps/davinci-resolve-mcp/release-notes/v2.22.0.md +0 -51
  166. package/mcps/davinci-resolve-mcp/release-notes/v2.23.0.md +0 -51
  167. package/mcps/davinci-resolve-mcp/release-notes/v2.23.1.md +0 -35
  168. package/mcps/davinci-resolve-mcp/release-notes/v2.24.1.md +0 -32
  169. package/mcps/davinci-resolve-mcp/scripts/audit_api_parity.py +0 -275
  170. package/mcps/davinci-resolve-mcp/scripts/audit_readwrite_symmetry.py +0 -80
  171. package/mcps/davinci-resolve-mcp/scripts/doctor.py +0 -227
  172. package/mcps/davinci-resolve-mcp/scripts/gen_api_limitations.py +0 -144
  173. package/mcps/davinci-resolve-mcp/scripts/live_media_analysis_polish_probe.py +0 -65
  174. package/mcps/davinci-resolve-mcp/scripts/measure_bridge_cost.py +0 -65
  175. package/mcps/davinci-resolve-mcp/scripts/regen_panel_screenshots.py +0 -76
  176. package/mcps/davinci-resolve-mcp/src/__init__.py +0 -3
  177. package/mcps/davinci-resolve-mcp/src/analysis_dashboard.py +0 -15505
  178. package/mcps/davinci-resolve-mcp/src/batch_cli.py +0 -540
  179. package/mcps/davinci-resolve-mcp/src/control_panel.py +0 -13
  180. package/mcps/davinci-resolve-mcp/src/granular/__init__.py +0 -17
  181. package/mcps/davinci-resolve-mcp/src/granular/common.py +0 -741
  182. package/mcps/davinci-resolve-mcp/src/granular/folder.py +0 -420
  183. package/mcps/davinci-resolve-mcp/src/granular/gallery.py +0 -306
  184. package/mcps/davinci-resolve-mcp/src/granular/graph.py +0 -309
  185. package/mcps/davinci-resolve-mcp/src/granular/media_pool.py +0 -679
  186. package/mcps/davinci-resolve-mcp/src/granular/media_pool_item.py +0 -1020
  187. package/mcps/davinci-resolve-mcp/src/granular/media_storage.py +0 -179
  188. package/mcps/davinci-resolve-mcp/src/granular/project.py +0 -1654
  189. package/mcps/davinci-resolve-mcp/src/granular/resolve_control.py +0 -538
  190. package/mcps/davinci-resolve-mcp/src/granular/timeline.py +0 -1075
  191. package/mcps/davinci-resolve-mcp/src/granular/timeline_item.py +0 -2251
  192. package/mcps/davinci-resolve-mcp/src/resolve_mcp_server.py +0 -43
  193. package/mcps/davinci-resolve-mcp/src/server.py +0 -24116
  194. package/mcps/davinci-resolve-mcp/src/utils/__init__.py +0 -3
  195. package/mcps/davinci-resolve-mcp/src/utils/actor_identity.py +0 -46
  196. package/mcps/davinci-resolve-mcp/src/utils/analysis_caps.py +0 -678
  197. package/mcps/davinci-resolve-mcp/src/utils/analysis_memory.py +0 -755
  198. package/mcps/davinci-resolve-mcp/src/utils/analysis_runs.py +0 -307
  199. package/mcps/davinci-resolve-mcp/src/utils/analysis_store.py +0 -945
  200. package/mcps/davinci-resolve-mcp/src/utils/api_truth.py +0 -525
  201. package/mcps/davinci-resolve-mcp/src/utils/app_control.py +0 -319
  202. package/mcps/davinci-resolve-mcp/src/utils/audio_fairlight_live_probe.py +0 -263
  203. package/mcps/davinci-resolve-mcp/src/utils/brain_edits.py +0 -387
  204. package/mcps/davinci-resolve-mcp/src/utils/bridge_metrics.py +0 -76
  205. package/mcps/davinci-resolve-mcp/src/utils/cdl.py +0 -20
  206. package/mcps/davinci-resolve-mcp/src/utils/clip_query.py +0 -85
  207. package/mcps/davinci-resolve-mcp/src/utils/cloud_operations.py +0 -192
  208. package/mcps/davinci-resolve-mcp/src/utils/color_grade_live_probe.py +0 -444
  209. package/mcps/davinci-resolve-mcp/src/utils/contracts.py +0 -102
  210. package/mcps/davinci-resolve-mcp/src/utils/cut_ir.py +0 -115
  211. package/mcps/davinci-resolve-mcp/src/utils/dctl_templates.py +0 -368
  212. package/mcps/davinci-resolve-mcp/src/utils/deep_vision.py +0 -643
  213. package/mcps/davinci-resolve-mcp/src/utils/destructive_hook.py +0 -606
  214. package/mcps/davinci-resolve-mcp/src/utils/edit_engine.py +0 -737
  215. package/mcps/davinci-resolve-mcp/src/utils/embeddings.py +0 -922
  216. package/mcps/davinci-resolve-mcp/src/utils/entities.py +0 -579
  217. package/mcps/davinci-resolve-mcp/src/utils/extension_authoring_live_probe.py +0 -292
  218. package/mcps/davinci-resolve-mcp/src/utils/failure_tracker.py +0 -119
  219. package/mcps/davinci-resolve-mcp/src/utils/fuse_templates.py +0 -1968
  220. package/mcps/davinci-resolve-mcp/src/utils/fusion_composition_live_probe.py +0 -284
  221. package/mcps/davinci-resolve-mcp/src/utils/fusion_group_settings.py +0 -334
  222. package/mcps/davinci-resolve-mcp/src/utils/layout_presets.py +0 -333
  223. package/mcps/davinci-resolve-mcp/src/utils/mcp_stdio.py +0 -32
  224. package/mcps/davinci-resolve-mcp/src/utils/mcp_transport.py +0 -128
  225. package/mcps/davinci-resolve-mcp/src/utils/media_analysis.py +0 -7690
  226. package/mcps/davinci-resolve-mcp/src/utils/media_analysis_jobs.py +0 -805
  227. package/mcps/davinci-resolve-mcp/src/utils/media_pool_changes.py +0 -121
  228. package/mcps/davinci-resolve-mcp/src/utils/media_pool_ingest_live_probe.py +0 -592
  229. package/mcps/davinci-resolve-mcp/src/utils/multicam.py +0 -393
  230. package/mcps/davinci-resolve-mcp/src/utils/object_inspection.py +0 -301
  231. package/mcps/davinci-resolve-mcp/src/utils/page_lock.py +0 -75
  232. package/mcps/davinci-resolve-mcp/src/utils/platform.py +0 -157
  233. package/mcps/davinci-resolve-mcp/src/utils/proc.py +0 -26
  234. package/mcps/davinci-resolve-mcp/src/utils/project_cleanup.py +0 -73
  235. package/mcps/davinci-resolve-mcp/src/utils/project_lifecycle_live_probe.py +0 -376
  236. package/mcps/davinci-resolve-mcp/src/utils/project_lint.py +0 -131
  237. package/mcps/davinci-resolve-mcp/src/utils/project_properties.py +0 -601
  238. package/mcps/davinci-resolve-mcp/src/utils/project_spec.py +0 -459
  239. package/mcps/davinci-resolve-mcp/src/utils/readback.py +0 -91
  240. package/mcps/davinci-resolve-mcp/src/utils/render_deliver_live_probe.py +0 -384
  241. package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_governance.py +0 -214
  242. package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_ledger.py +0 -244
  243. package/mcps/davinci-resolve-mcp/src/utils/resolve_busy.py +0 -171
  244. package/mcps/davinci-resolve-mcp/src/utils/resolve_connection.py +0 -77
  245. package/mcps/davinci-resolve-mcp/src/utils/review_annotation_live_probe.py +0 -352
  246. package/mcps/davinci-resolve-mcp/src/utils/script_templates.py +0 -1193
  247. package/mcps/davinci-resolve-mcp/src/utils/shot_relationships.py +0 -544
  248. package/mcps/davinci-resolve-mcp/src/utils/structural_diff.py +0 -175
  249. package/mcps/davinci-resolve-mcp/src/utils/sync_detection.py +0 -889
  250. package/mcps/davinci-resolve-mcp/src/utils/timeline_brain_db.py +0 -826
  251. package/mcps/davinci-resolve-mcp/src/utils/timeline_conform_live_probe.py +0 -280
  252. package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_live_probe.py +0 -1092
  253. package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_probe.py +0 -185
  254. package/mcps/davinci-resolve-mcp/src/utils/timeline_title_text.py +0 -87
  255. package/mcps/davinci-resolve-mcp/src/utils/timeline_versioning.py +0 -730
  256. package/mcps/davinci-resolve-mcp/src/utils/update_check.py +0 -685
  257. package/mcps/vectorworks-mcp/.dockerignore +0 -8
  258. package/mcps/vectorworks-mcp/Dockerfile +0 -28
  259. package/mcps/vectorworks-mcp/README.md +0 -156
  260. package/mcps/vectorworks-mcp/app/__init__.py +0 -2
  261. package/mcps/vectorworks-mcp/app/api.py +0 -52
  262. package/mcps/vectorworks-mcp/app/chunking.py +0 -56
  263. package/mcps/vectorworks-mcp/app/config.py +0 -29
  264. package/mcps/vectorworks-mcp/app/embeddings.py +0 -28
  265. package/mcps/vectorworks-mcp/app/indexer.py +0 -106
  266. package/mcps/vectorworks-mcp/app/main.py +0 -33
  267. package/mcps/vectorworks-mcp/app/mcp_server.py +0 -71
  268. package/mcps/vectorworks-mcp/app/search.py +0 -54
  269. package/mcps/vectorworks-mcp/app/utils.py +0 -14
  270. package/mcps/vectorworks-mcp/data/.gitkeep +0 -1
  271. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_PluginScript.htm +0 -95
  272. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_ScriptEditor.htm +0 -266
  273. package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_Scripting.htm +0 -106
  274. package/mcps/vectorworks-mcp/data/vw-app-help/VW2023_CreatingScriptedPlugins.htm +0 -327
  275. package/mcps/vectorworks-mcp/data/vw-app-help/VW2024_RunningScripts.htm +0 -116
  276. package/mcps/vectorworks-mcp/data/vw-devwiki/VS_Function_Reference_category.html +0 -2129
  277. package/mcps/vectorworks-mcp/data/vw-jp-ref/ObjectsSymbols.html +0 -2035
  278. package/mcps/vectorworks-mcp/data/vw-jp-ref/ScriptFunctionReference.html +0 -29
  279. package/mcps/vectorworks-mcp/design.md +0 -57
  280. package/mcps/vectorworks-mcp/docker-compose.yml +0 -18
  281. package/mcps/vectorworks-mcp/index/.gitkeep +0 -1
  282. package/mcps/vectorworks-mcp/index/meta.jsonl +0 -3956
  283. package/mcps/vectorworks-mcp/index/vw.faiss +0 -0
  284. package/mcps/vectorworks-mcp/requirements.txt +0 -10
  285. package/mcps/vectorworks-mcp/scripts/fetch_docs_minimal.sh +0 -84
  286. package/mcps/vectorworks-mcp/scripts/fetch_github_vectorworks.sh +0 -85
  287. package/mcps/vectorworks-mcp/templates/index.html +0 -40
  288. package/scripts/ecosystem-health-audit.js +0 -257
  289. package/skills/bdb-dev-os-skill/SKILL.md +0 -49
  290. package/skills/bdb-dev-os-skill/package.json +0 -11
  291. package/skills/bdbsaastraining/SKILL.md +0 -316
  292. package/skills/bdbsaastraining/references/exam-pool.md +0 -313
  293. package/skills/bdbsaastraining/references/interaction-modes.md +0 -94
  294. package/skills/bdbsaastraining/references/track-a-ai-agent.md +0 -111
  295. package/skills/bdbsaastraining/references/track-b-wordpress.md +0 -111
  296. package/skills/bdbsaastraining/references/track-c-mailserver.md +0 -107
  297. package/skills/bdbsaastraining/references/track-d-debian.md +0 -109
  298. package/skills/bdbsaastraining/references/track-e-custom.md +0 -83
  299. package/skills/bdbsaastraining/scripts/build_profile.py +0 -529
  300. package/skills/bdbsaastraining/scripts/generate_certificate.py +0 -161
  301. package/skills/bdbsaastraining/scripts/preflight_check.sh +0 -150
  302. package/skills/bdbsaastraining/templates/certificate_template.html +0 -508
  303. package/skills/global_config/bdb-ecosystem-health/SKILL.md +0 -68
  304. package/skills/global_config/bdbsaas-ops/SKILL.md +0 -16
  305. package/skills/global_config/bdbsaashost/SKILL.md +0 -125
@@ -1,2648 +0,0 @@
1
- # Changelog
2
-
3
- Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
4
-
5
- ## What's New in v2.57.5
6
-
7
- Fixes a silent data-loss bug on Reel Name writes (issue #77) and bundles the
8
- community-contributed API-limitation entries from PR #76 (issue #75).
9
-
10
- - **Fixed** (#77) `set_clip_property` / `set_metadata` reporting `success: true`
11
- when writing the `Reel Name` clip property even though Resolve silently
12
- dropped the value. Resolve gates `Reel Name` behind the project setting
13
- *General Options > Assist using reel names from the:* — when that derives reel
14
- names automatically, scripted writes are ignored but still return `True`. On a
15
- batch ingest this meant hundreds of clips believed to have reel names assigned
16
- when none actually stuck. The server now reads the value back after writing
17
- known-unreliable keys and refuses to report success on mismatch, surfacing the
18
- project-setting gate as a `hint`. Wired into `set_clip_property`,
19
- `set_metadata` (both forms), and the bulk `normalize_metadata` path. Adds an
20
- `api_truth` bug entry (report now lists 18 missing + 11 bugs) and 10 unit
21
- tests.
22
- - **Added** (PR #76, thanks @swayll) four `submit: missing` API-limitation
23
- entries verified on Resolve 21.0.0: per-subtitle text/timing editing, subtitle
24
- track styling/presets, speech-recognition engine selection + SRT import, and
25
- Media Pool folder rename. These document the API ceiling behind the subtitle
26
- feature request in #75 — direct subtitle text editing and SRT round-trip are
27
- not exposed by the Blackmagic scripting API.
28
-
29
- ### Validation
30
-
31
- - Offline: full unit suite green; new `tests/test_reel_name_writeback.py` (10
32
- tests) plus the api_truth/limitations drift guards. Live Resolve validation of
33
- the Reel Name read-back is recommended but not performed here — forcing the
34
- gate would require writing reel names into a live project's media metadata.
35
-
36
- ## What's New in v2.57.4
37
-
38
- Live mutating verification of the catalogued API gaps.
39
-
40
- - **Added** `tests/live_api_gap_verification.py` — attempts each catalogued
41
- "missing capability" against a disposable project built from synthetic ffmpeg
42
- media, recording the failing call alongside a positive control that succeeds.
43
- All 8 surface-audited gaps confirmed missing on Resolve Studio 21.0.0:
44
- `SetProperty('Speed', …)` / audio-level keys return False while
45
- `RetimeProcess` / video-transform keys succeed; trim/move/split/proxy/node-
46
- graph/Smart-Bin methods are absent (by `dir()`), while append/CDL/AddSubFolder
47
- controls work.
48
- - **Added** a new bug entry: `hasattr()`/`getattr()` are unusable on Resolve
49
- objects — the Python bridge fabricates a callable for ANY attribute name, so
50
- capability detection must use `dir()`. (Discovered when the first harness pass
51
- reported nonexistent methods as present.) Report now lists 14 missing + 10 bugs.
52
- - **Changed** the report's Scope note to record the live mutating-harness
53
- methodology and the `hasattr` caveat. Strengthened the clip-speed and
54
- Fairlight-audio entries with the live `SetProperty` rejection evidence (and
55
- noted that `'Pan'` is the video-transform key, not audio pan).
56
-
57
- ## What's New in v2.57.3
58
-
59
- Expanded the API-limitations catalogue with a live surface audit.
60
-
61
- - **Added** 8 newly-catalogued **missing capabilities** to
62
- `docs/reference/api-limitations.md`, found by a `dir()` audit of the live
63
- Resolve 21.0.0 API objects diffed against the UI feature set: timeline-item
64
- trim/move/re-time (getters only, no setters), razor/blade/split, clip
65
- speed/retime ratio & ramps, color node-graph editing + primary grade values,
66
- Fairlight audio levels/pan/EQ/automation/FairlightFX, proxy/optimized-media
67
- generation, insert/overwrite/replace/fit-to-fill edit modes, and Smart/Power
68
- Bin creation. The report now lists 14 missing capabilities + 9 bugs.
69
- - **Verified** the four previously-doc-derived entries (per-clip audio
70
- stereo↔mono, native multicam creation, transitions, cloud list/export/user)
71
- against the live API surface; all confirmed absent.
72
- - **Changed** the generated report to carry an explicit **Scope & completeness**
73
- note — it is not guaranteed exhaustive (surface audit + incident log; misses
74
- parameters that exist-but-misbehave and untested capabilities).
75
-
76
- ## What's New in v2.57.2
77
-
78
- Consolidated, submittable list of Resolve scripting-API limitations.
79
-
80
- - **Added** `docs/reference/api-limitations.md` — a curated, behaviorally-verified
81
- catalogue of Resolve scripting-API gaps and bugs, split into **Missing
82
- Capabilities** (please add) and **Bugs / Unreliable Behavior** (please fix),
83
- formatted for submission to Blackmagic Design's developer feedback. First cut:
84
- 6 missing capabilities (Source Track Selector / insert `trackIndex`, per-clip
85
- audio stereo↔mono, native multicam-clip creation, transition create/copy,
86
- `GetTimelineByName`, cloud project list/export/user management) and 9
87
- bugs/unreliable behaviors (enum-key silent failures in `AutoSyncAudio`,
88
- `CreateSubtitlesFromAudio`, CloudProject family, and `Timeline.Export`; flaky
89
- `DeleteProject`; `Composition.Paste` bridge failure; `FlowView` unreliable
90
- returns; truncated `Transcription` property; automation-blocking `CreateProject`
91
- modal).
92
- - **Added** `scripts/gen_api_limitations.py` — the report is generated from the
93
- `submit`-tagged entries in the `api_truth` ledger (single source of truth, also
94
- queryable at runtime via `resolve_control api_truth`), so it never drifts.
95
- - **Changed** the release process and CI to keep it current: a new
96
- `tests.test_api_limitations_doc` drift guard (added to the publish workflow)
97
- fails if the doc is stale, and `docs/process/release-process.md` now requires
98
- regenerating it whenever a `submit`-tagged entry changes.
99
-
100
- ## What's New in v2.57.1
101
-
102
- Investigation outcome for community feature request #74 — no behavior change.
103
-
104
- - **Note** (issue #74) the DaVinci Resolve scripting API does not expose the
105
- Source/Auto Track Selector, so there is no way to choose the destination track
106
- when inserting Text+/titles/generators. Verified live on Resolve Studio 21.0.0:
107
- no get/set for the selector exists; the `Insert*IntoTimeline` family takes no
108
- `trackIndex` and always lands on V1; locking lower tracks makes the insert fail
109
- rather than redirect; and titles/generators can't be relocated afterward (no
110
- `MediaPoolItem`). Closed as won't-fix (API limitation).
111
- - **Documentation** recorded the limitation in the verified `api_truth` ledger
112
- (query at runtime with `resolve_control api_truth "track"`) and in
113
- `docs/reference/api-coverage.md`, with the supported alternative for
114
- media-backed clips (`MediaPool.AppendToTimeline` clipInfo `trackIndex`, exposed
115
- as `media_pool.append_to_timeline` `clip_infos`). Added a regression test.
116
-
117
- ## What's New in v2.57.0
118
-
119
- Community feature requests #72 and #73.
120
-
121
- - **Added** OpenCode to the installer's supported MCP clients (issue #72). The
122
- installer now writes/merges `~/.config/opencode/opencode.json` using OpenCode's
123
- own schema (`type`/`enabled`, a combined `command` array, and an `environment`
124
- block), and `--manual` prints a ready-to-paste OpenCode snippet.
125
- - **Added** `fusion_comp(action="add_fusion_mask", ...)` (issue #73): a one-call
126
- Rectangle/Ellipse mask — adds the mask tool, sets its params (`corner_radius`,
127
- `width`, `height`, `center`/`center_x`/`center_y`, etc., all 0..1), and
128
- optionally wires it into a tool's mask input (`EffectMask` by default). Each
129
- input is applied independently so one unsupported parameter never aborts the rest.
130
- - **Added** `fusion_comp(action="set_text_plus" / "get_text_plus", ...)` (issue
131
- #73): read/write the text of a Fusion `Text+` tool or Fusion title template
132
- (e.g. a "Deep" title), auto-finding the `Text+` tool when `tool_name` is
133
- omitted. Complements `timeline(action="set_title_text")` for generator titles.
134
- - **Note** (issue #73) per-clip audio Stereo↔Mono conversion is not in
135
- Blackmagic's scripting API and was not added. The supported surface is already
136
- exposed: `timeline get_track_sub_type` (query channel format), `add_track` with
137
- `audioType` (create mono/stereo tracks), `convert_to_stereo` (timeline-wide),
138
- and `timeline_item get_source_audio_channel_mapping`.
139
-
140
- ## What's New in v2.56.1
141
-
142
- Final reliability batch from the exhaustive audit (Wave B + P2/P3 selections).
143
-
144
- - **Fixed** (EX11) `audio_track_probe` reported `available: true` for track index 0
145
- (and negatives); audio tracks are 1-indexed, so it now requires
146
- `1 <= index <= track_count`.
147
- - **Fixed** (EX10) `_find_timeline_item_by_id` no longer silently skips a whole
148
- track type when `GetTrackCount` errors — it logs the failure so a real API error
149
- isn't mistaken for "item not found".
150
- - **Fixed** (P3) the raw `timeline_item_color.set_cdl` now validates the ASC-CDL
151
- payload (shape/ranges) before `SetCDL`, matching its safe twin — malformed CDL
152
- returns a structured error instead of being silently rejected by Resolve.
153
- - **Fixed** (P2) `media_pool.delete_timelines` is read-back verified: it reports
154
- `verified` from the project's timeline count dropping, not the unreliable boolean.
155
- `import_folder` now validates its required `path`.
156
-
157
- ## What's New in v2.56.0
158
-
159
- Destructive-action registry audit (EX-REG) — a systemic version of the EX2 bug.
160
-
161
- Many destructive actions were registered under the **wrong tool key**, so
162
- `is_destructive()` returned False and **version-on-mutate archiving / change
163
- logging silently never fired** for them. Examples: `create_timeline`,
164
- `auto_sync_audio`, `create_stereo_clip`, `append_to_timeline` were filed under
165
- `timeline` though `media_pool` dispatches them; `set_cdl`, `copy_grades`,
166
- `export_lut`, the version ops were under `timeline_item` though
167
- `timeline_item_color` dispatches them; the Fusion-comp and take actions used stale
168
- names (`add_fusion_comp`, `delete_take`) that matched no real handler.
169
-
170
- - **Fixed** rebuilt `DESTRUCTIVE_ACTIONS_BY_TOOL` so every action is keyed under
171
- the tool that actually dispatches it (stale names mapped to real ones:
172
- `*_fusion_comp` → `*_comp`, `*_take` → `add`/`delete`/`select`/`finalize`,
173
- `import_into` → `import_into_timeline`, `create_subtitles_from_audio` →
174
- `create_subtitles`). Inert entries whose tool isn't governed (media_pool_item
175
- `replace_clip`/`link_*`) were dropped. Catastrophic take/Fusion-comp deletes and
176
- the media-pool create/sync ops are now archived as intended.
177
- - **Added** the registry-drift guard now asserts *every* registry action is a real
178
- handler of its tool (broad check enabled), so this class can't regress.
179
-
180
- ## What's New in v2.55.2
181
-
182
- Deep-QC P1 1b — required-param validation. Mutating/destructive actions that
183
- hard-indexed required params (`p["name"]`, `p["index"]`, `p["color"]`, …) now
184
- return a structured error instead of crashing with an unhandled `KeyError` (or,
185
- for `set_clip_enabled`/`set_current`, coercing the value). Guarded actions:
186
-
187
- - `timeline`: `set_current`, `set_name`, `set_start_timecode`, `add_track`
188
- - `timeline_item`: `set_property`, `set_clip_enabled`
189
- - `project_manager`: `create`, `load`, `import_project`, `export_project`,
190
- `archive`, `restore`
191
- - marker `delete_by_color` (clip / timeline / item — destructive)
192
- - `layout_presets`: `save`, `export`; `project_settings`: `set_name`, `set_setting`
193
-
194
- ## What's New in v2.55.1
195
-
196
- Deep-QC P1 — settings/options whitelisting + DeleteProject reliability.
197
-
198
- - **Fixed** options/settings dicts passed to several Resolve APIs are now
199
- whitelisted to their documented keys, so a typo'd key is reported instead of
200
- silently dropped (`_filter_to_keys` → `ignored_options`/`ignored_settings`):
201
- `media_pool.import_timeline` (ImportTimelineFromFile), `timeline.import_into_timeline`
202
- (ImportIntoTimeline), raw `render.set_settings` (SetRenderSettings) and
203
- `render.quick_export`, and `set_voice_isolation_state` (track + item).
204
- - **Fixed** `ProjectManager.DeleteProject` is flaky — it silently returns False
205
- when the target is/was the current project. All callers (the safe and raw
206
- `project_manager.delete` actions and the granular `delete_project`) now route
207
- through `delete_project_safely` (switch-away + retry) and report `delete_detail`.
208
- Added an `api_truth` entry.
209
- - **Added** a destructive-registry drift guard (`tests/test_destructive_registry_drift.py`)
210
- that asserts token-gated actions map to real handlers and locks in the media-pool
211
- delete governance from v2.55.0. (It also surfaced a pre-existing registry
212
- mis-keying issue now tracked for a dedicated audit.)
213
-
214
- ## What's New in v2.55.0
215
-
216
- Governance for catastrophic Media Pool deletes (exhaustive audit EX2/EX3).
217
-
218
- **Behavior change:** `media_pool` `delete_clips`, `delete_folders`, and
219
- `delete_timelines` now require a confirm token, the same two-step handshake
220
- `timeline.delete_track` already uses — the first call returns
221
- `status: "confirmation_required"` with a `confirm_token` and a preview (count +
222
- names); re-call with `params.confirm_token` to execute. Callers that disable
223
- gating via the `destructive.require_confirm_token=false` preference are
224
- unaffected.
225
-
226
- - **Fixed** the destructive-action registry listed granular function names
227
- (`delete_media_pool_clips`, `move_media_pool_folders`, …) that the compound
228
- `media_pool` tool never dispatches, so `is_destructive()` returned False and
229
- these catastrophic deletes silently skipped version-on-mutate archiving and
230
- change logging. The registry now uses the real compound action strings, so the
231
- deletes are archived/logged as intended.
232
- - **Added** confirm-token gating + previews to the three deletes (EX3). The
233
- registry fix also re-enables the existing media-pool change log for them.
234
- - Live-validated against DaVinci Resolve Studio 21.0.0 (non-destructively): the
235
- no-token call returns `confirmation_required` and deletes nothing.
236
-
237
- ## What's New in v2.54.5
238
-
239
- Reliability + security hardening from the exhaustive reliability audit (Wave A).
240
-
241
- - **Security** `apply_spec` hooks no longer run with `shell=True`. A spec's hook
242
- command is now `shlex`-split and executed without a shell, so a hook string
243
- can't inject arbitrary shell (`; rm -rf …`, pipes, expansion). Hooks needing
244
- shell features must invoke an interpreter explicitly (e.g. `bash -c "…"`).
245
- - **Fixed** the confirm-token table (`_CONFIRM_TOKENS`) is now guarded by a lock.
246
- The control panel is threaded, so issue/consume/GC ran concurrently; validate-
247
- then-pop is now atomic and GC can't race a write.
248
- - **Fixed** negative item indices are rejected instead of silently returning the
249
- wrong item (Python reverse-indexing): `_get_item`, the audio item resolver, and
250
- the two timeline-matte helpers now require `0 <= index < len`.
251
- - **Fixed** history queries clamp `limit` to `[1, 1000]`. SQLite treats a negative
252
- `LIMIT` as "no limit", so a negative value could silently fetch the entire table
253
- (`get_brain_edit_history`, `list_runs`, `get_media_pool_change_history`).
254
- `timeline_versioning` version/limit/keep_n params are now validated (no unhandled
255
- `ValueError`; `rollback` rejects negative versions before archiving). `max_files`
256
- /`max_seconds` in the relink file search are clamped positive.
257
- - **Fixed** the server-reachable ffmpeg probes (render, audio, review) now pass
258
- `timeout=120` so a hung ffmpeg can't block the server indefinitely.
259
-
260
- (Deferred to a live-validated follow-up: confirm-token gating + archiving for
261
- catastrophic media-pool/take/fusion deletes, and temp-directory lifecycle cleanup.)
262
-
263
- ## What's New in v2.54.4
264
-
265
- Persistence-safety hardening (generalizes issue #71 to the analysis state
266
- stores). A multi-agent audit found several state files whose **readers** swallow a
267
- `JSONDecodeError` and reset to an empty default — so a later read-modify-write
268
- writes back only the new field, silently wiping prior data. Atomic writes don't
269
- help, because the loss happens at *read* time.
270
-
271
- - **Fixed** read-modify-write paths now read strictly and **refuse to overwrite**
272
- a corrupt existing file (via a shared `ConfigParseError` + `_read_json_strict`),
273
- rather than clobbering it:
274
- - media-analysis **preferences** — 5 write paths (set-defaults, timed-marker
275
- default, sampling-mode default, AI governance, caps preset)
276
- - **update-state** — configure/clear update settings (3 paths), now also written
277
- atomically (temp + `os.replace`)
278
- - per-clip **corrections** (human edit history — the highest-value store) —
279
- update and revert paths
280
- - **Fixed** non-atomic writes that a crash mid-write could truncate: the bin
281
- summary markdown and Fusion `.setting` files now write to a temp file and
282
- `os.replace`.
283
- - **Fixed** a read-modify-write race on `analysis.json` under the threaded control
284
- panel: transcript regeneration is now serialized under the existing state lock,
285
- so a concurrent regen/batch write can't drop the other's updates.
286
- - Read-only callers keep their forgiving behavior (they fall back to defaults and
287
- never write). New tests in `tests/test_persistence_safety.py`.
288
-
289
- ## What's New in v2.54.3
290
-
291
- Follow-up to the v2.54.2 config-merge fix (#71): the JSONC sanitizer's
292
- trailing-comma step was not string-aware.
293
-
294
- - **Fixed** `_strip_jsonc` removed trailing commas with a regex applied to the
295
- whole document, so a comma inside a string value followed by whitespace and a
296
- closing brace/bracket — e.g. `"greeting": "hello, } world"` — had the comma
297
- silently stripped *from inside the string* when merging a commented (JSONC)
298
- client config. The trailing-comma pass is now string-aware (mirroring the
299
- comment stripper), so string contents are never altered while real trailing
300
- commas are still removed. Added regression tests covering string values that
301
- contain `, }` / `, ]`. (Dropped the now-unused `re` import.)
302
-
303
- ## What's New in v2.54.2
304
-
305
- A destructive-overwrite bug in the installer (issue #71): the MCP client setup
306
- step could wipe a user's entire editor settings file instead of merging into it.
307
-
308
- - **Fixed** `install.py` silently destroyed existing client config files whose
309
- contents weren't strict JSON. `read_json` swallowed `JSONDecodeError` and
310
- returned `{}`, so the subsequent "merge" wrote a file containing *only* the
311
- `davinci-resolve` server entry — wiping themes, terminal env vars, LSP
312
- settings, keybindings, everything else. Zed was the reported victim because
313
- its `settings.json` ships with `//` comments (JSONC), but the same latent
314
- risk existed for **every** supported client — VS Code and Continue also accept
315
- JSONC. The fix is centralized in the single read/merge path so all clients are
316
- covered:
317
- - `read_json` now best-effort strips JSONC `//` and `/* */` comments and
318
- trailing commas (string-aware, so comment markers inside string values are
319
- preserved), letting commented configs merge cleanly instead of being lost.
320
- - When a config file exists but still can't be parsed after that, the
321
- installer **refuses to overwrite it** and tells the user to add the entry
322
- manually — rather than silently replacing their settings.
323
- - **Added** regression tests covering JSONC merge, plain-JSON merge,
324
- refuse-to-overwrite on unparseable files, fresh-file creation, and
325
- string-aware comment stripping.
326
-
327
- ## What's New in v2.54.1
328
-
329
- One more instance of the enum-keyed silent-failure class (issue #70), plus a
330
- guard so the next one can't ship unnoticed.
331
-
332
- - **Fixed** the raw `timeline.export` action passed `type`/`subtype` straight to
333
- `Timeline.Export`, which needs resolved `resolve.EXPORT_*` enum *values* — a
334
- JSON/MCP caller can't pass a live enum, so the action silently wrote nothing
335
- for every caller. It now resolves friendly format names (and `EXPORT_*`
336
- constant names) via the same `_timeline_export_spec` resolver that
337
- `export_timeline_checked` uses, and reports the resolved `export_type`/
338
- `export_subtype`.
339
- - **Fixed** `export_timeline_checked` resolved enum constants against the module
340
- global `resolve` (which can be `None` and silently degrade the `EXPORT_*` args
341
- to strings); it now uses `get_resolve()`, matching the issue-#70 lesson.
342
- - **Added** an `api_truth` ↔ mitigation guard test: every `enum`-tagged catalog
343
- entry must declare a `mitigation` (the resolver/wrapper functions), each of
344
- which must exist in `src.server`. The next raw enum passthrough — a documented
345
- symbol with no real resolver, or a renamed/removed resolver — now fails CI.
346
- Added a `Timeline.Export` catalog entry and wired `mitigation` onto the
347
- `AutoSyncAudio`, `CreateSubtitlesFromAudio`, and CloudProject entries.
348
-
349
- ## What's New in v2.54.0
350
-
351
- Hardens the rest of the enum-keyed settings APIs against the same silent-failure
352
- class fixed for `AutoSyncAudio` in v2.53.0 (issue #70). Several Resolve methods
353
- key their settings dict by `resolve.<CONST>` enum attributes and silently reject
354
- the whole call when handed plain string keys — returning `False`/`None` with
355
- nothing applied and no error.
356
-
357
- - **Fixed** `CreateSubtitlesFromAudio` (both `timeline_ai.create_subtitles` and
358
- `timeline.subtitle_generation_probe`) now resolves human-readable
359
- `autoCaptionSettings` — `language`, `preset`, `line_break`, `chars_per_line`,
360
- `gap` — into live `SUBTITLE_*`/`AUTO_CAPTION_*` enum keys/values. Unknown keys
361
- and unresolvable values are dropped and reported in `ignored_settings` instead
362
- of poisoning the call, and generation is read-back verified against the
363
- timeline's subtitle track count (the boolean return is unreliable).
364
- - **Fixed** the `ProjectManager` CloudProject family (`create`/`load`/
365
- `import_project`/`restore`) resolves `{cloudSettings}` into live
366
- `CLOUD_SETTING_*`/`CLOUD_SYNC_*` enums (`project_name`, `media_path`,
367
- `is_collab`, `sync_mode`, `is_camera_access`), dropping unknown keys into
368
- `ignored_settings`.
369
- - **Changed** the string→enum resolution is now a shared `_resolve_enum_settings`
370
- primitive driven by per-field specs, so the next enum-keyed API gets the same
371
- treatment without re-implementing it.
372
- - **Added** `api_truth` entries for `Timeline.CreateSubtitlesFromAudio` and the
373
- CloudProject family, documenting the silent-rejection + unreliable-return
374
- behavior alongside the existing `AutoSyncAudio` entry.
375
-
376
- ## What's New in v2.53.0
377
-
378
- Two improvements to audio sync reliability and inventory control.
379
-
380
- `safe_auto_sync_audio` / `media_pool.auto_sync_audio` no longer fail silently on
381
- human-readable settings (issue #70). The previous normalizer recognized
382
- `syncBy`/`mode` but not `method`, and it forwarded *every* unrecognized key
383
- (`group_id`, `primary_clip_id`, …) straight into `MediaPool.AutoSyncAudio` —
384
- which silently rejects the whole call when it sees a key it doesn't understand,
385
- returning `False` with nothing linked and no error.
386
-
387
- - **Fixed** `method` (matching the tool's own parameter naming) is now accepted
388
- as an alias for the sync mode alongside `syncBy`/`sync_by`/`mode`/`syncMode`.
389
- - **Fixed** unrecognized settings keys are dropped instead of forwarded, so a
390
- stray `group_id`/`primary_clip_id` no longer poisons the call. Dropped keys
391
- are reported back in a new `ignored_settings` field on the response, so a
392
- rejection is no longer invisible.
393
- - **Fixed** the raw `media_pool.auto_sync_audio` action now routes settings
394
- through the same live `AUDIO_SYNC_*` enum resolution as the safe wrapper
395
- (previously it passed strings straight through).
396
-
397
- The Media Pool inventory walk is now configurable:
398
-
399
- - **Added** `media_analysis.inventory_exclude_bins` — a comma-separated list of
400
- folder names to skip entirely during the inventory walk (recursively). Empty
401
- by default, so every folder is indexed unless you opt out.
402
- - **Added** `media_analysis.inventory_limit` — the maximum clips to index per
403
- walk, configurable from the control panel and `setup`. The hard ceiling is
404
- raised from 2000 to 10000.
405
- - Adapted from PR #69 by @rgxdev; the default was changed to exclude nothing
406
- (the PR defaulted to excluding an `assets` bin, which would have silently
407
- stopped indexing existing `assets` folders on upgrade).
408
-
409
- ## What's New in v2.52.1
410
-
411
- Analysis reuse no longer blocks on missing capabilities when every clip is
412
- satisfied by an existing report (issue #68). `build_plan` records
413
- `capability_gaps` from the *requested* options before the per-clip reuse
414
- decision runs; when a fully-reused plan only re-keys and imports existing
415
- reports into the current root, no fresh transcription/vision/ffprobe happens,
416
- so the missing-capability gate must not fire.
417
-
418
- - **Fixed** the missing-capability gate is now evaluated against the clips that
419
- still need fresh analysis, not the requested-options gaps. A clip is exempt
420
- only when it both skips execution and has an existing report path; any clip
421
- needing fresh work still enforces the gate.
422
- - **Fixed** extended the exemption to the entry points that short-circuit
423
- before `execute_plan_async` and were still blocking fully-reused runs: the
424
- `media_analysis` analyze action, metadata-publish analysis, and batch-job
425
- creation. The batch CLI `plan` preview no longer prints "Missing tools" for a
426
- fully-reusable plan.
427
- - **Changed** the reuse/capability logic is now a shared
428
- `plan_requires_capabilities()` / `executing_clips()` helper, replacing the
429
- duplicated inline comprehensions so every gate stays consistent.
430
- - Includes PR #68 by @diesdaas, which fixed the inner `execute_plan_async` gate
431
- and isolated the marker-param and host-vision tests from unrelated
432
- capability/destructive-hook coupling.
433
-
434
- ## What's New in v2.52.0
435
-
436
- `edit_engine` tighten now carries audio. Previously `execute_tighten`
437
- assembled a video-only variant — a speech-driven dead-air cut came out
438
- silent, with nothing in the preview or readback to warn you (issue #67).
439
-
440
- - **Fixed** `plan_tighten` mirrors every kept video range onto its linked
441
- audio track(s) with identical source frames, so the assembled variant
442
- stays frame-locked and audible. Audio targets the item's detected linked
443
- audio tracks (same `GetLinkedItems` matching `execute_swap` uses), falling
444
- back to audio track 1 where a single linked A/V clip's audio lives.
445
- - **Added** `include_audio` parameter to `plan_tighten` (default `true`).
446
- Pass `include_audio=false` for the prior video-only assembly.
447
- - **Added** an `audio_accounting` block to the `execute_tighten` confirm
448
- preview and readback (planned vs. actual audio/video item counts), so a
449
- silent variant can no longer ship unnoticed. Old video-only plans
450
- re-executed against this build still work and are now loudly flagged as
451
- silent.
452
-
453
- ## What's New in v2.51.0
454
-
455
- CLAP audio embeddings — the final phase of the post-program improvements.
456
- Detection-based like every other backend (never auto-installed); local
457
- compute, so nothing touches the caps ledger.
458
-
459
- - **Added** audio embedding backend detection: CLAP via `transformers`
460
- (laion/clap-htsat-unfused, preferred) or the `laion_clap` package, plus
461
- torch + ffmpeg. `capabilities` gains an `audio` block with install
462
- guidance and a `clap_audio` Tools-page entry.
463
- - **Added** `build_embeddings(kinds=["audio"])`: one CLAP window per shot
464
- (center-cropped to ~10 s, piped from the source media as raw PCM —
465
- read-only on source media, no temp files) plus a clip-level mean vector,
466
- stored as `embedding_kind="audio"` rows. Idempotent via content hashes;
467
- offline media is reported in `skipped_missing_media`; a missing backend
468
- is a graceful skip with install guidance.
469
- - **Added** `find_similar(kind="audio")`: shot/clip queries over the audio
470
- vectors, and free-text queries ("engine revving") via the CLAP text
471
- encoder.
472
-
473
- ## What's New in v2.50.0
474
-
475
- The last JSON-fed readers now source from the DB-canonical analysis store
476
- (consistency/perf hygiene — the JSON export is lockstep with the DB, so this
477
- is shape-preserving by construction).
478
-
479
- - **Changed** `summarize_reports` aggregates from the DB (blob + human
480
- overlay) when every report dir on disk is covered by an ingested clip row;
481
- pre-v9 roots and MIXED roots (some clips not ingested) fall back WHOLESALE
482
- to the JSON walk — a partial DB view would silently under-report. The
483
- summary gains a `"source": "db"|"json"` key for observability; the F1
484
- provenance map (source_reports / missing_reports) is unchanged.
485
- - **Changed** `build_analysis_index` sources local reports from the DB
486
- instead of re-parsing every `analysis.json`; job-linked EXTERNAL report
487
- paths (their rows live under another project's DB) and pre-v9 dirs keep
488
- the JSON read. The FTS schema and the query surface are identical; the
489
- result gains `report_sources` counts.
490
- - **Added** DB-vs-JSON parity tests (semantic equality with normalized
491
- ordering) plus wholesale-fallback regressions for mixed and pre-v9 roots;
492
- live-validated on the sample analysis root (summary, index counts, and
493
- FTS query results identical on both paths).
494
-
495
- ## What's New in v2.49.0
496
-
497
- Cross-shot relationships (spec §4 — pattern recognition only): the shot
498
- page's Relationships group finally fills, and the edit engine can prefer
499
- vision-confirmed alternates.
500
-
501
- - **Added** schema v12 `shot_relationships` (same_setup_as / alt_take_of
502
- symmetric, continues_from directional — the source shot continues from
503
- the target) with supersede semantics (current rows have
504
- `superseded_at IS NULL`).
505
- - **Added** `media_analysis` actions `detect_shot_relationships` /
506
- `commit_shot_relationships` / `list_shot_relationships`: pairwise cosine
507
- over the per-shot visual vectors (transcript continuity as a second
508
- signal for continues_from) → a deferred confirmation payload with a
509
- representative frame PAIR per candidate (caps pre-checked; candidates
510
- live only in the detection-state stash until committed, so re-detect
511
- never leaves ghosts) → vision-confirmed rows. Representative frames use
512
- the shot's middle sample (first/last frames often catch fades).
513
- - **Added** the shot page's Relationships group now renders from the DB
514
- (`continues_from` shows on the continuing shot; cross-clip targets are
515
- clip-qualified).
516
- - **Changed** `plan_swap` prefers confirmed `alt_take_of` alternates over
517
- raw cosine similarity — confirmed takes sort first (and are unioned in
518
- even when the cosine search missed them); each alternate's rationale
519
- states which basis ranked it.
520
-
521
- ## What's New in v2.48.1
522
-
523
- Bug fix surfaced by the first real-cut tighten pilot.
524
-
525
- - **Fixed** cross-root analysis reuse never landed in the current project's
526
- DB: when the registry matched a reusable report from another project's
527
- analysis root, `execute_plan_async` reported success but wrote no DB rows
528
- and no local export — so `media_ref` lookups against the current media
529
- pool (edit-engine planners, panel readers) found nothing. The reuse path
530
- now re-keys the report to the current project's clip identity, ingests it
531
- into the current root's DB, and writes a lockstep `analysis.json` export
532
- (provenance kept in `reused_from`).
533
-
534
- ## What's New in v2.48.0
535
-
536
- Edit-engine hardening: trustworthy execute readback ahead of the first
537
- real-cut pilot. Live-validated end-to-end on a disposable synthetic-media
538
- project (24/24 checks).
539
-
540
- - **Added** `timeline_versioning(action="diff_timelines", params={from_timeline,
541
- to_timeline})`: structural diff (added/removed/moved/trimmed + summary)
542
- between two LIVE timelines by name — read-only, no archived snapshots
543
- needed. Built for edit-engine variants, which are new-name timelines with
544
- no shared version chain. The item walk and the snapshot comparison were
545
- factored out of the version-snapshot path
546
- (`capture_timeline_clip_usage` / `compare_usage_snapshots`) and reused.
547
- - **Fixed** `execute_swap` audio accounting: the lift was video-only while
548
- the replacement appended linked video+audio, so item counts drifted on
549
- every swap. The lift is now scoped to the target's video track plus its
550
- linked audio tracks (`GetLinkedItems`, with a media-id track-scan fallback;
551
- items with no linked audio and audio-only timelines are handled
552
- gracefully), and readback reports per-track-type `track_counts`
553
- before/after plus an `audio_accounting` block.
554
- - **Added** `execute_tighten` readback now includes `structural_diff`
555
- (source vs variant); `execute_selects` readback includes a
556
- `usage_summary` (per-track-type item counts — a diff against a source
557
- timeline is meaningless for a fresh assembly).
558
- - **Changed** the live edit-engine validation harness asserts the tighten
559
- structural diff, `diff_timelines` agreement, and swap track-count
560
- symmetry (24 checks, up from 20).
561
-
562
- ## What's New in v2.47.0
563
-
564
- Edit-engine plan browser in the control panel (Media → Edit Plans) — the
565
- panel UX pass for the v2.45.0 edit engine. Chat-first: the panel surfaces
566
- plans and evidence; execution stays in chat behind the confirm-token gate.
567
-
568
- - **Added** a plan browser at `#analysis/review/plans`: every saved
569
- `edit_engine` plan with kind, summary, save time, and an `executed` chip;
570
- fingerprint-corrupt plans surface as warning rows instead of being hidden.
571
- - **Added** plan detail views per kind: selects decisions render with shot
572
- thumbnails, rank, duration, rationale, and a deep link to the shot page;
573
- tighten plans list each dead-air lift with its transcript-gap evidence and
574
- skipped items; swap plans show the current item plus numbered alternates
575
- with similarity scores. Executed plans show their execution readback.
576
- - **Added** a copyable per-kind execute chat prompt on each plan (the panel
577
- never executes; swaps include an `alternate_index` placeholder).
578
- - **Added** `/api/edit_plans` + `/api/edit_plans/<plan_id>` panel endpoints
579
- (DB/file only — no Resolve round-trips; decisions are enriched server-side
580
- with `resolve_clip_id` and a `thumb_frame_index` for the existing frames
581
- route).
582
- - **Changed** `edit_engine.list_plans` gained `include_corrupt` (default off;
583
- the MCP action shape is unchanged).
584
-
585
- ## What's New in v2.46.1
586
-
587
- Test and hygiene hardening; no public tool surface changes.
588
-
589
- - **Fixed** the three `InventoryCacheReuseTests` failures that appeared
590
- whenever a live Resolve instance was running: the reuse/build-path tests
591
- now stub the read-only Resolve probe, so the suite is green with Resolve
592
- open or closed.
593
- - **Added** `src/utils/project_cleanup.delete_project_safely`: a retrying
594
- delete helper for disposable Resolve projects (switch away from the target,
595
- retry `DeleteProject` once after a pause, report the leftover by name on
596
- persistent failure). The live edit-engine validation harness now uses it
597
- during cleanup, so disposable pilot projects stop lingering in the library.
598
-
599
- ## What's New in v2.46.0
600
-
601
- Community PR bundle: five contributed fixes and features (#62–#66), live-validated
602
- on Resolve Studio 21.
603
-
604
- - **Fixed** timeline marker frames are now correctly relative to the timeline
605
- start (#66): timecode params and the playhead default rebase by
606
- `GetStartFrame()`, so markers on hour-start timelines land where the UI
607
- shows them instead of an hour past the end. Raw `frame` params pass through
608
- unchanged (documented as relative). Contact sheets and marker thumbnail
609
- review rebase the other way with a legacy-absolute guard.
610
- - **Fixed** project lint no longer flags audio-only timelines as empty (#62);
611
- live lint state now reports per-type `video/audio/subtitle_item_count`.
612
- - **Added** `media_pool.check_proxy_media_compatibility` (#63): ffprobe-vs-source
613
- signature diagnostics (resolution/fps/frames/sample rate, expected
614
- codec/profile). Same-aspect downscales count as compatible — half-res
615
- proxies are the normal workflow.
616
- - **Added** readback verification envelopes (`verified_operation`) around
617
- `media_pool.link_proxy_checked` (#63) and `media_pool.append_to_timeline`
618
- (#64): preflight, execution, post-state readback, verification status, and a
619
- journal event. `link_proxy_checked` gains `check_compatibility` /
620
- `require_compatible` guards that refuse incompatible proxies before linking.
621
- - **Added** `bins` to declarative project specs (#65): missing media-pool bin
622
- paths plan as `ensure` actions and are created idempotently; existing bins
623
- are noops. Bin paths normalize to the `Master/` prefix so unprefixed spec
624
- bins converge instead of reporting perpetual drift.
625
-
626
- ## What's New in v2.45.0
627
-
628
- The edit engine — Phase E, the final phase of the analysis + edit-engine
629
- program. Three evidence-driven loops on one shared skeleton: evidence query
630
- → dry-run plan with per-decision rationale → confirm token → versioned
631
- timeline ops → metric readback → brain_edits rows.
632
-
633
- - **Added** a new `edit_engine` MCP tool (compound tool count: 34):
634
- - `plan_selects` / `execute_selects` — ranks shots by deep-tier
635
- `editorial.select_potential` and best moments (clip-level fallback for
636
- standard-analyzed clips), story-spine order, duration budget; execution
637
- builds a NEW selects timeline from per-shot source ranges. Additive.
638
- - `plan_tighten` / `execute_tighten` — dead-air lifts from transcript-gap
639
- evidence per timeline item (no transcript → reported in `skipped`,
640
- never silently trimmed); execution assembles a tightened VARIANT
641
- timeline from keep ranges (true partial trims via the range-copy
642
- kernel) — the original timeline is never mutated.
643
- - `plan_swap` / `execute_swap` — alternates for a timeline item via the
644
- visual-similarity index, filtered to shots that can fill the slot
645
- exactly; execution replaces the item in place (lift + positioned
646
- append) on the version-archived timeline.
647
- - `list_plans` / `get_plan` — plans persist under `memory/edit_plans/`
648
- with content fingerprints; a stale or tampered plan refuses to execute.
649
- - **Added** `src/utils/edit_engine.py` (DB-only planning/evidence layer) and
650
- `tests/live_edit_engine_validation.py` (disposable-project live harness).
651
- execute_* actions are confirm-token gated and registered with the
652
- version-on-mutate hook (archive + brain_edits come from the same
653
- machinery as every other destructive op).
654
- - **Fixed** frame→shot mapping in the analysis store: frames now fall back
655
- to time-containment when a report's shots don't record
656
- `frame_indices_used` (commit paths that omit it previously produced no
657
- shot-level visual vectors).
658
- - **Validation**: full offline suite (1118 tests; 13 new). Live pilot on a
659
- disposable synthetic-media Resolve project (ffmpeg + spoken audio):
660
- 20/20 checks — selects timeline assembled (2 decisions), tighten variant
661
- removed exactly the 15.2s of transcript dead air while keeping the
662
- spoken 4.8s (original untouched), swap replaced the item with a 0.92
663
- cosine alternate, brain_edits rationale rows present for all three
664
- loops, timeline versions archived.
665
-
666
- ## What's New in v2.44.0
667
-
668
- Cross-clip entities + bin briefing v2 — Phase D of the analysis +
669
- edit-engine program. Recurring people/places/props found by clustering the
670
- visual embeddings, confirmed with one vision call per cluster.
671
-
672
- - **Added** schema v11 (`entities` + `entity_appearances`) and
673
- `src/utils/entities.py`: union-find clustering over the v10 CLIP frame
674
- vectors (cosine threshold, no new deps), representative-frame selection,
675
- ghost pruning across re-runs (labeled entities persist), and a
676
- detection-state stash so `entity_index` always resolves against the exact
677
- ordering the payload was issued with.
678
- - **Added** `media_analysis` actions: `detect_entities` (clusters + deferred
679
- one-frame-per-cluster confirmation payload, caps pre-checked),
680
- `commit_entities` (kind/label/description with conservative-label rules;
681
- `merge_with` collapses duplicate clusters), `list_entities`,
682
- `prepare_bin_briefing` (entities + per-clip summaries, text-only), and
683
- `commit_bin_summary` (host-synthesized briefing written above the v2.0
684
- aggregate in `memory/bin_summary.md`).
685
- - **Added** a "Recurring across this bin" card on the panel's Review page
686
- (`/api/entities`), shown once labeled entities exist.
687
- - **Validation**: full offline suite (1105 tests; 10 new). Live on the real
688
- sample root: 3 clusters detected from 16 CLIP vectors; host-chat
689
- confirmation labeled the shattered-windshield POV and the white rental
690
- sedan and merged the sedan's two clusters; bin briefing synthesized and
691
- committed; panel card verified and screenshots regenerated.
692
-
693
- ## What's New in v2.43.0
694
-
695
- Embeddings + similarity search — Phase C of the analysis + edit-engine
696
- program. "Find clips/shots like this," locally, with no vendor token cost.
697
-
698
- - **Added** `src/utils/embeddings.py` and schema v10 (`embeddings` table:
699
- one float32 vector per entity/kind/model, with content hashes so re-runs
700
- only re-embed what changed). Brute-force cosine — numpy when present.
701
- - **Added** `media_analysis` actions `build_embeddings` (idempotent; clip
702
- summaries, shot descriptions + deep field groups, transcript segments,
703
- sampled frames with per-shot mean vectors) and `find_similar` (query by
704
- free text, clip, or shot; `kind="text"|"visual"`; free-text visual queries
705
- go through the CLIP text encoder).
706
- - **Added** backend detection, never installation (the whisper pattern):
707
- text = ollama `nomic-embed-text` (serving probe) or sentence-transformers;
708
- visual = open_clip ViT-B-32. Capabilities and the Diagnostics → Tools page
709
- list availability with install guidance.
710
- - **Added** a `Semantic` toggle on the panel's Review search (shown only
711
- when a text backend is detected) backed by `/api/search/semantic`, which
712
- returns rows in the existing search-card shape.
713
- - **Validation**: full offline suite (1095 tests; 14 new, backends mocked).
714
- Live on the 2026-05-17 sample root: 54 text vectors in 1.2s via ollama
715
- with correct top hits for three editorial queries; 27 CLIP vectors with
716
- "cracked broken windshield glass" ranking the shattered-windshield frame
717
- first; panel endpoint verified and screenshots regenerated.
718
-
719
- ## What's New in v2.42.0
720
-
721
- Deep shot-level vision tier — Phase B of the analysis + edit-engine program.
722
- Opt-in, estimate-first per-shot field filling for the Visual / Content /
723
- Production / Editorial / Cuttability groups the shot pages already render.
724
-
725
- - **Added** `src/utils/deep_vision.py` and three `media_analysis` actions:
726
- `deepen` (estimate → confirm_token → deferred host-vision payload per
727
- clip/shot), `commit_shot_vision` (writes `vision_deep_v1` provenance rows,
728
- updates the canonical blob, re-exports analysis.json in lockstep), and
729
- `vision_pending_sweep` (lists clips stuck in `pending_host_analysis`;
730
- `reoffer=true` returns the stored payload, `expire=true` stamps them).
731
- - **Added** deep depth to the analyze flow: `depth="deep"` extends the
732
- deferred payload with the per-shot schema and requires `confirm_deep=true`
733
- after a token-cost estimate. Caps pre-call refusal applies on both paths.
734
- - **Added** panel affordances: `Deepen analysis` (clip view) and `Deepen this
735
- shot` (shot view) copy ready-made chat prompts, per the chat-first UX.
736
- Shots with no sampled frames on disk get 1–2 frames re-extracted via
737
- ffmpeg, downscaled per caps (source media stays read-only).
738
- - **Fixed** a provenance bug in the analysis store: a source re-deriving an
739
- unchanged value no longer re-attributes the row (a deep pass would
740
- otherwise claim every untouched field as `vision_deep_v1`).
741
- - **Validation**: full offline suite (1081 tests; 15 new), and a real
742
- end-to-end deep pass on the 2026-05-17 sample clip — estimate → confirm →
743
- frames read by the host chat → commit → rows/blob/export parity → fields
744
- visible in the panel shot view. Control-panel guide screenshots
745
- regenerated from the live panel.
746
-
747
- ## What's New in v2.41.0
748
-
749
- DB-canonical clip analysis (C1) — Phase A of the analysis + edit-engine
750
- program. The per-project SQLite DB is now the source of truth for clip
751
- analysis; `analysis.json` becomes a derived export written in lockstep.
752
-
753
- - **Added** schema v9 to the per-project timeline-brain DB: `clips`,
754
- `clip_aliases`, `analysis_reports` (canonical full payload), `shots`,
755
- `subjective_fields` + `field_changelog` (per-field provenance),
756
- `transcript_segments`, `frames`, and `qc_observations`.
757
- - **Added** `src/utils/analysis_store.py`: transactional ingest, export with
758
- human-correction overlay (human rows always win and survive re-analysis),
759
- alias-based clip lookup, shot ids stable under one-second boundary jitter,
760
- and a round-trip guard verified against a real sample analysis root.
761
- - **Added** `media_analysis` actions `db_status` (schema version + row
762
- counts) and `db_ingest` (one-shot migration of existing JSON reports and
763
- `corrections.json` sidecars into the DB).
764
- - **Changed** the analysis write path: `execute_plan` and `commit_vision`
765
- write DB rows first, then export the JSON. Panel clip/shot endpoints read
766
- DB-first with JSON fallback for pre-v9 reports and job-linked report dirs.
767
- - **Changed** `update_clip_field` / `update_shot_field` / `revert_field` to
768
- mirror corrections into the DB as row-level provenance (the
769
- `corrections.json` sidecar remains for compatibility).
770
- - **Fixed** eight V2 actions that were unreachable from MCP dispatch since
771
- v2.24.0 (`get_panel_state`, `set_panel_state`, `session_start_context`,
772
- `update_shot_field`, `update_clip_field`, `get_field_history`,
773
- `revert_field`, `list_corrections`): they were checked inside the
774
- project-root dispatch block but missing from its membership set. The
775
- control panel proxied to the helpers directly, which masked it.
776
- - **Fixed** the action-list drift guard to inspect async tool functions
777
- (media_analysis had drifted unchecked) and to fail on actions that are
778
- unreachable inside membership blocks — the exact class above. Four
779
- reachable-but-unadvertised actions (`coverage_report`,
780
- `get_resolve_ai_usage`, `get_ai_governance`, `set_ai_governance`) are now
781
- listed in the unknown-action error.
782
- - **Validation**: full offline suite (1066 tests; 12 new), round-trip guard
783
- on the real 2026-05-17 sample root, and a live headless pipeline run on
784
- synthetic media verifying rows-then-export parity, row-level corrections,
785
- and DB-first panel reads.
786
-
787
- ## What's New in v2.40.0
788
-
789
- Control panel UX overhaul + docs refresh, from a full live audit of every
790
- panel view, with drift guards so neither can silently go stale again.
791
-
792
- - **Added** a governance mode toggle (Advisory / Enforce) to the AI Console,
793
- with corrected copy (the old text predated v2.39.0 enforce mode), and a
794
- Recent-runs list on the AI-ops ledger showing each run's actor.
795
- - **Added** chat-first onboarding: empty Overview, Review, and Inventory
796
- states show plain-language guidance with a copyable suggested prompt
797
- instead of zero-walls and MCP action names.
798
- - **Added** History as a first-class Media menu item, deep-linkable at
799
- `#analysis/review/history`; documented the full hash deep-link scheme.
800
- - **Changed** the top-level "Analysis" menu to "Media" (it collided with the
801
- Preferences page of the same name); "Analyze" is now "Inventory". Full
802
- vocabulary pass: humanized readiness chips and frame-sampling labels, no
803
- internal codenames, file names, or absolute paths in UI copy.
804
- - **Fixed** the README's linked screenshot rendering broken in the Docs
805
- reader: badge parsing no longer claims local linked images, and a new
806
- `/api/doc_asset/` route serves repo doc images (path-constrained).
807
- - **Fixed** poll hygiene: timers pause while the tab is hidden, panel-state
808
- polling backs off when unfocused, and unchanged inventory polls return a
809
- tiny 200 instead of a 304 that Chrome logged as an aborted request.
810
- - **Docs**: `docs/guides/control-panel.md` fully rewritten for the current
811
- IA with all screenshots regenerated from the live panel
812
- (`scripts/regen_panel_screenshots.py`). A new drift-guard test fails the
813
- suite — and the publish workflow, which now runs all three static guards
814
- on every tag — when the guide drifts from the panel's navigation or
815
- screenshots.
816
-
817
- ## What's New in v2.39.0
818
-
819
- Governance enforce mode and actor identity — the staged Phase 3 of the
820
- Resolve 21 AI-ops work.
821
-
822
- - **Added** governance `mode` for the media-creating AI ops (motion deblur,
823
- speech generation): `advisory` (default, unchanged — confirm-preview
824
- warnings only) or `enforce`, where an over-tier run is blocked with
825
- `GOVERNANCE_BLOCKED` before token issuance, naming the exceeded dimensions.
826
- Escape hatches: raise the tier, relax the mode, or pass
827
- `override_governance=true` to consciously exceed the tier once.
828
- `set_ai_governance` accepts `mode` (preset now optional);
829
- `get_ai_governance` reports it.
830
- - **Added** instance-level actor identity (per the recorded concurrency
831
- design): each entry point declares itself — `stdio`, `network-sse`,
832
- `network-http`, `control-panel`, `batch-cli` — and AI-ops ledger rows,
833
- brain edits, and timeline versions now carry `actor` (`<instance>:<pid>`)
834
- alongside `initiator`. Schema v8 (additive columns); migration verified
835
- against a copy of a real project DB with all rows preserved.
836
-
837
- ## What's New in v2.38.0
838
-
839
- Busy gate for long DaVinci Resolve operations — the first piece of the
840
- concurrency design for the stdio + networked two-instance setup.
841
-
842
- - **Added** cross-process registration for long synchronous Resolve calls
843
- (timeline export/import, scene-cut detection, subtitle generation,
844
- Dolby Vision analysis, folder/clip audio transcription). A tool call that
845
- arrives while one is running now waits up to 5 seconds and then returns a
846
- structured `RESOLVE_BUSY` error (new `busy` category, retryable, with
847
- `state.busy_with` and `state.age_seconds`) instead of hanging silently
848
- inside the scripting bridge. Stale registrations from crashed operations
849
- are ignored automatically; an operation never gates its own thread.
850
- - Design decisions recorded: single-editor/multi-client is the supported
851
- concurrency target; confirm tokens stay per-instance; actor identity is
852
- deferred to the governance phase.
853
-
854
- ## What's New in v2.37.3
855
-
856
- Deep-audit fixes, rounds two and three: agent-facing action discovery,
857
- crash-safe user-state persistence, and resource hygiene.
858
-
859
- - **Fixed** three tools' unknown-action error lists drifting from their real
860
- dispatch: `timeline` omitted `clip_where` and `action_help`;
861
- `timeline_item_color` and `graph` omitted `action_help`. Agents recovering
862
- from a typo now see the full action set. A static AST test keeps every
863
- tool's advertised list in both-way sync with its dispatch (and verifies
864
- docstring-advertised actions are real).
865
- - **Fixed** user-state files being vulnerable to truncation by a crash
866
- mid-write. Affected files all reset to `{}` on corruption, so the next
867
- save would silently wipe remaining user data. Writers now use atomic
868
- temp-file + `os.replace`: `media-analysis-preferences.json` (all
869
- analysis/caps/governance/update defaults — including the
870
- `set_resolution_tier` and `set_caps_preset` paths, now routed through the
871
- shared writer), `update-check.json`, the dashboard's `analysis.json`
872
- transcription patch, and `transcript-corrections.json`.
873
- - **Fixed** `_safe_project_delete` discarding `SaveProject()`'s result when
874
- closing the current project before deletion; a failed save now surfaces
875
- as a warning in the response.
876
- - **Fixed** a file-descriptor leak: the parent kept its copy of the control
877
- panel's log handle open after spawning the detached child.
878
- - Audit classes verified clean: bare excepts, mutable default arguments,
879
- `asyncio.run` inside running loops, subprocess timeouts, docstring phantom
880
- actions, silent-success swallows in metadata/marker/archive write paths.
881
-
882
- ## What's New in v2.37.2
883
-
884
- Static-audit fixes — four undefined-name references that silently fell back
885
- to defaults instead of erroring (the same bug class as the v2.37.0
886
- confirm-token fix), plus a regression guard.
887
-
888
- - **Fixed** the `status://mcp_version` resource reporting update channel
889
- `"stable"` unconditionally; it now calls the real `get_update_channel()`,
890
- so beta/dev channel installs report correctly.
891
- - **Fixed** the `versioning_auto_run_idle_timeout_seconds` preference being
892
- silently ignored (auto-run idle timeout was always 90s) due to a
893
- misspelled preference-reader name in the destructive hook.
894
- - **Fixed** resolve-state snapshot tokens always falling back to a timestamp
895
- because `short_hash` was never imported; tokens are now content-stable.
896
- - **Fixed** the timeline-kernel live probe's MCP-stub fallback crashing with
897
- a `NameError` (missing `types` import) exactly when the mcp library is
898
- absent — the only case the fallback exists for.
899
- - **Added** a static test that runs pyflakes over `src/` and fails on any
900
- undefined name, so this bug class cannot reappear unnoticed.
901
-
902
- ## What's New in v2.37.1
903
-
904
- Test-suite hygiene — no server behavior changed.
905
-
906
- - **Fixed** the legacy live-harness scripts (`test_all_tools`, `test_phase2`–`5`)
907
- exiting at import when Resolve is unavailable, which crashed pytest
908
- collection and surfaced as five loader errors under unittest discovery.
909
- They now skip cleanly under both runners and keep the hard-exit behavior
910
- when run as standalone scripts. (Adapted from a contribution by @diesdaas.)
911
- - **Fixed** pytest mis-collecting `test_resolve20_api.py`'s internal `test()`
912
- helper (renamed to `run_live_check()`), and made the batch-CLI synthetic-job
913
- test independent of which transcription backends the host has installed.
914
- - **CI**: the npm publish workflow no longer reports failure when the registry
915
- accepted the publish but npm's retried request hit a consumed OIDC token;
916
- it now verifies the published tarball shasum before failing. Runner actions
917
- bumped to their Node 24 majors.
918
-
919
- ## What's New in v2.37.0
920
-
921
- Render format-id fix, offline-media diagnosis, and a setup doctor.
922
-
923
- - **Fixed** render helpers passing the display name from `GetRenderFormats()`
924
- (e.g. `QuickTime`) into `GetRenderCodecs`, `GetRenderResolutions`, and
925
- `SetCurrentRenderFormatAndCodec`, which expect the format id (e.g. `mov`).
926
- `GetRenderCodecs("QuickTime")` returned empty, so `probe_render_matrix`
927
- reported no QuickTime codecs and `prepare_render_job` could not target
928
- ProRes (e.g. `ProRes422LT` proxy renders). Display names and format ids are
929
- now both accepted as input and normalized to the id for Resolve API calls;
930
- `probe_render_matrix` rows include `format_id`. Closes #59.
931
- - **Fixed** the destructive confirm-token gate referencing a stale function
932
- name, which made it silently ignore the `destructive.require_confirm_token`
933
- preference and always fall back to the default.
934
- - **Added** a `diagnosis` block to `timeline.detect_missing_media`:
935
- deduplicated missing Media Pool items, volume/folder mounted checks, a
936
- primary cause (`volume_not_mounted` / `folder_not_found` /
937
- `files_missing_or_renamed`), and a recommended next step. Optional
938
- `sanitized`/`sanitize_paths` redacts raw media paths.
939
- - **Added** bounds to `timeline.build_relink_plan`: skips the broad scan by
940
- default when a source volume (e.g. a camera card) is not mounted, dedupes
941
- missing basenames, and caps the search with `max_depth`, `max_seconds`
942
- (default 20s), and `max_files_scanned` (default 50k), reporting per-candidate
943
- scan stats.
944
- - **Fixed** `media_analysis` accepting `vision: true/false` boolean shorthand
945
- (now normalized to the full options dict) and `timeline_markers.get_thumbnail`
946
- returning a structured error instead of raw `None` when no thumbnail is
947
- available.
948
- - **Added** `scripts/doctor.py`, a read-only setup diagnostic that checks the
949
- checkout, Python, Resolve app/scripting paths, and MCP client configs, and
950
- probes the scripting bridge end to end with OK/WARN/FAIL output (`--json`
951
- supported).
952
-
953
- ## What's New in v2.36.1
954
-
955
- Bug fix — restore the `fusion_comp` MCP tool.
956
-
957
- - **Fixed** a regression from `32be0ec` (v2.33.0) that left `fusion_comp`
958
- unregistered: a new `_parse_pos` helper was inserted between the `@mcp.tool()`
959
- decorator and `def fusion_comp`, so the decorator landed on the private helper
960
- instead. As a result `_parse_pos` was exposed as a tool while **all**
961
- `fusion_comp` node-graph operations (`add_tool`, `connect`, `add_keyframe`,
962
- `get_keyframes`, `copy_tool`, `set_position`, …) were missing from the tool
963
- list. The decorator is restored to `fusion_comp` and `_parse_pos` is once
964
- again a plain internal helper. Live-validated on DaVinci Resolve Studio 21.
965
-
966
- ## What's New in v2.36.0
967
-
968
- Optional networked transport — run the MCP server over the network, safely, with
969
- control-panel management. Local stdio remains the default and is unchanged.
970
-
971
- - **Added** `--transport stdio|sse|streamable-http` (default `stdio`). The networked
972
- modes bind to **loopback (127.0.0.1) by default** and **require a bearer token** on
973
- every request (from `$DAVINCI_MCP_TOKEN`, or generated + logged at startup). A
974
- non-loopback bind logs a loud security warning. stdio is untouched; you can run a
975
- local stdio instance and a networked instance against the same Resolve at once.
976
- - **Added** control-panel management (Setup → MCP): a Transport card showing the live
977
- mode / URL / token / loopback status, with Start/Stop buttons (loopback-only). Backed
978
- by `/api/mcp/transport/{start,stop}` and a transport field on `/api/mcp/status`.
979
- - The page-switch lock (v2.34.1) already serializes concurrent page switches across the
980
- local and networked instances.
981
-
982
- ## What's New in v2.35.2
983
-
984
- Verification observability and a validator consolidation.
985
-
986
- - **Added** `resolve_control(action="verification_stats")` returns a
987
- process-level tally of readback-verification outcomes
988
- (verified / contradicted / unverified) since server start. A rising
989
- `contradicted` count means the Resolve API reported success but a readback
990
- disagreed. No connection required.
991
- - **Changed** `open_page` now validates its `page` argument through the declarative
992
- contract layer (`contracts.validate`) instead of a hand-written enum check —
993
- behavior unchanged; part of folding scattered validation into one place.
994
-
995
- ## What's New in v2.35.1
996
-
997
- - **Added** `media_pool_item(action="extract_frames", clip_id, timestamps, output_dir?)`
998
- extracts still JPEGs from a clip's source media at the given timestamps (seconds)
999
- via ffmpeg. Source-safe: it reads the source and writes only to a scratch output
1000
- directory — it never modifies, transcodes, or proxies the source. (Closes a
1001
- read/write-symmetry gap: the analysis sampler existed internally but had no
1002
- standalone frame-extraction tool.)
1003
-
1004
- ## What's New in v2.35.0
1005
-
1006
- The Cut-IR executor — transcript-driven editing now closes the loop onto the
1007
- timeline.
1008
-
1009
- - **Added** `timeline(action="apply_cuts", cuts, dry_run?, confirm_token?)` applies
1010
- a CutList (from `propose_cuts`) to the timeline as lift / ripple deletes. It is
1011
- **DRY-RUN by default**; applying is destructive and fully governed: confirm-token
1012
- gated, and a timeline version is archived first (so it is reversible), through
1013
- the existing destructive hook. Cuts apply latest-first so ripple deletes do not
1014
- invalidate earlier spans. Live-validated end-to-end (propose -> token -> apply ->
1015
- version archived).
1016
-
1017
- ## What's New in v2.34.1
1018
-
1019
- Page-switch serialization — the concurrency primitive for safe multi-agent use.
1020
-
1021
- - **Added** `src/utils/page_lock.py` — Resolve has a single globally-active page,
1022
- so two agents that flip pages concurrently corrupt each other. `page_lock()`
1023
- serializes page switches: a reentrant intra-process lock plus a best-effort
1024
- inter-process advisory file lock around the outermost section. The `open_page`
1025
- action now routes through it. This must be in place before any concurrent-agent
1026
- feature ships.
1027
- - Networked transport, sandboxed scripting, and capability/role scoping (the rest
1028
- of the safe remote/multi-user design) are security-critical and remain a
1029
- separate, sign-off-gated phase — they are intentionally not shipped here.
1030
-
1031
- ## What's New in v2.34.0
1032
-
1033
- First phase of transcript-driven editing: a Cut intermediate representation and a
1034
- mechanical cut proposer.
1035
-
1036
- - **Added** `src/utils/cut_ir.py` — the Cut-IR: a typed representation of an
1037
- editorial cut ({kind, span, action, confidence, rationale, evidence}) plus a
1038
- deterministic Pass-1 detector that flags filler words, long pauses, and
1039
- repeated lines from a timestamped transcript. No LLM.
1040
- - **Added** `timeline(action="propose_cuts", cues?, long_pause_frames?)` — a
1041
- DRY-RUN that runs Pass-1 over the timeline's subtitle transcript (or provided
1042
- cues) and returns a CutList. It proposes only; it applies nothing. The semantic
1043
- Pass-2 and the governed timeline executor are subsequent phases.
1044
-
1045
- ## What's New in v2.33.8
1046
-
1047
- Bridge-call performance instrumentation.
1048
-
1049
- - **Added** `src/utils/bridge_metrics.py` — a counting proxy that wraps a Resolve
1050
- handle and tallies attribute accesses and method calls (each a COM/socket
1051
- round-trip), so the real bridge cost of an operation is measured rather than
1052
- guessed.
1053
- - **Added** `scripts/measure_bridge_cost.py` — runs a representative media-pool
1054
- traversal through the proxy and reports round-trips per clip. A minimal
1055
- name+type walk measured ~6.7 round-trips per clip, confirming round-trips scale
1056
- linearly with traversal size. A property cache remains gated on profiling
1057
- *repeated*-read patterns in real workflows (don't cache blind).
1058
-
1059
- ## What's New in v2.33.7
1060
-
1061
- Read/write symmetry audit and a gap it surfaced.
1062
-
1063
- - **Added** `scripts/audit_readwrite_symmetry.py` + generated
1064
- `docs/reference/readwrite-symmetry.md` — scans every tool's action surface and
1065
- reports `set_`/`add_`/`create_` writes that lack a read counterpart, so
1066
- write-without-read gaps surface before users hit them. A repeatable
1067
- feature-discovery method.
1068
- - **Added** `fusion_comp(action="get_frame_range")` — reads the comp's render
1069
- frame range, the read counterpart to `set_frame_range` (a gap the audit found).
1070
-
1071
- ## What's New in v2.33.6
1072
-
1073
- Internal consolidation: a declarative parameter-contract validator and centralized
1074
- subprocess hygiene.
1075
-
1076
- - **Added** `src/utils/contracts.py` `validate(params, rules, invariants)` — one
1077
- validator for required/type/enum/min/max/non-empty/parent-dir-exists plus custom
1078
- invariants, returning consistent agent-friendly errors with coercion + defaults
1079
- applied. Replaces scattered, hand-written validation.
1080
- - **Changed** `export_frame_as_still` and `set_mark_in_out` (clip + timeline) now
1081
- validate through contracts. Behavior is preserved (same rejections); `mark_in`/
1082
- `mark_out` are now coerced to int.
1083
- - **Added** `src/utils/proc.py` `safe_run`/`safe_popen` — subprocess wrappers that
1084
- default `stdin` to DEVNULL so a child can't consume the MCP stdio protocol
1085
- stream. Inline Python execution now routes through `safe_run`.
1086
-
1087
- ## What's New in v2.33.5
1088
-
1089
- A queryable ledger of verified Resolve API behavior.
1090
-
1091
- - **Added** `resolve_control(action="api_truth", query?)` returns
1092
- behaviorally-verified facts about quirky or unreliable Resolve scripting-API
1093
- behavior — methods that live on unexpected objects, return values that lie,
1094
- silently-rejected string keys, and calls that don't exist. Each fact records
1095
- the reality, a recommended approach, and the Resolve build it was verified on.
1096
- No connection required. Backed by `src/utils/api_truth.py`, seeded from
1097
- hard-won findings (AutoSyncAudio, Fusion Paste, FlowView positions,
1098
- GetTimelineByName, project render methods, transcription truncation, the
1099
- CreateProject modal, stdio subprocess hygiene) and meant to grow over time.
1100
-
1101
- ## What's New in v2.33.4
1102
-
1103
- Internal reliability framework.
1104
-
1105
- - **Added** `verify_by_readback` (`src/utils/readback.py`) — a primitive for
1106
- mutating Resolve ops that verifies an action by reading the real post-state
1107
- back instead of trusting the API's frequently-unreliable return value. A
1108
- contradiction (reported success but a failing readback) is logged as a
1109
- reliability signal.
1110
- - **Changed** Auto-sync audio now runs through `verify_by_readback` as its first
1111
- user and reports a `verified` field alongside `linked`/`newly_linked`. Behavior
1112
- is unchanged; the bespoke readback loop is replaced by the shared primitive.
1113
-
1114
- ## What's New in v2.33.3
1115
-
1116
- Two read tools that surface existing project state.
1117
-
1118
- - **Added** `project_settings(action="project_summary")` returns a live
1119
- structural readout — current page, timeline count and current timeline, and a
1120
- media-pool inventory (folder/clip counts, clips by type, optional clip
1121
- sample). A cheap "what's in this project right now" snapshot that needs no
1122
- prior analysis.
1123
- - **Added** `timeline(action="get_transcript")` reads the current timeline's
1124
- subtitle track(s) as transcript text `{text, cue_count, has_subtitles, cues}`,
1125
- with optional per-cue timecodes. Complements the clip-level
1126
- `get_transcription`.
1127
-
1128
- ## What's New in v2.33.2
1129
-
1130
- Documentation: a guide for hand-authoring DaVinci Resolve `.setting` template
1131
- files.
1132
-
1133
- - **Added** `docs/authoring/setting-files/` — how to author Edit effects,
1134
- transitions, titles, generators, and Fusion macros as `.setting` files: the
1135
- Lua-table format, the `InstanceInput`/`UserControls` control catalog, thumbnail
1136
- conventions, Templates install paths, and a set of hard-won gotchas (ordered
1137
- vs unordered `Inputs`, `ControlGroup` anchoring, transition easing via
1138
- `LUTLookup`, `KeyStretcher` on titles, the category-subfolder rule, OFX
1139
- boilerplate, and more). Includes 13 copyable starter templates and is linked
1140
- from `docs/SKILL.md`.
1141
-
1142
- ## What's New in v2.33.1
1143
-
1144
- Clip transcription read-back and more trustworthy auto-sync reporting.
1145
-
1146
- - **Added** `media_pool_item(action="get_transcription")` returns
1147
- `{text, truncated, status, has_transcription}`. Transcription could previously
1148
- be triggered but never read back. Resolve's `Transcription` clip property is a
1149
- preview that ends in an ellipsis when the full transcript is longer, so
1150
- `truncated` tells callers the returned text is partial.
1151
- - **Changed** Auto-sync audio now verifies linkage by reading each clip's
1152
- `Synced Audio` property before and after the call and reporting
1153
- `linked` / `newly_linked` / `already_linked`, instead of trusting
1154
- `AutoSyncAudio`'s unreliable boolean. The boolean is still returned as
1155
- `success`, but callers should trust `linked`.
1156
-
1157
- ## What's New in v2.33.0
1158
-
1159
- Fusion node-graph layout and duplication, plus performance and robustness
1160
- improvements across the compound server. Live-validated on DaVinci Resolve
1161
- Studio 21.0.0.
1162
-
1163
- ### Fusion node layout & duplication
1164
-
1165
- - **Added** `fusion_comp(action="get_position")` and `set_position` — read and
1166
- write a node's position on the FlowView canvas. `set_position` confirms the
1167
- move by reading the position back.
1168
- - **Added** `fusion_comp(action="copy_tool")` — duplicate a node, optionally
1169
- renaming and repositioning it. Settings are carried through a temporary
1170
- `.setting` file, which round-trips reliably across the Python bridge where the
1171
- in-memory `SaveSettings()`/`Paste()` table form fails.
1172
- - **Added** `fusion_comp(action="auto_arrange")` — lay tools out in a row
1173
- (`direction="horizontal"`) or column (`"vertical"`) at a given spacing.
1174
-
1175
- ### Performance
1176
-
1177
- - **Changed** Resolve object inspection walks `dir(obj)` once instead of once for
1178
- methods and again for properties, skips `inspect.signature()` for C-extension
1179
- methods (slow and almost always raising there), and reads `__doc__` directly.
1180
- Each attribute access on a Resolve object is a bridge round-trip, so this
1181
- roughly halves inspection cost on the `resolve_control` path.
1182
- - **Changed** Media-pool find-by-name lookups walk the folder tree lazily and
1183
- stop at the first match instead of materializing the entire project tree.
1184
-
1185
- ### Robustness & fixes
1186
-
1187
- - **Fixed** `export_frame_as_still` rejects an empty path or a nonexistent target
1188
- directory instead of silently returning failure.
1189
- - **Fixed** `set_mark_in_out` (clip and timeline) rejects `mark_in > mark_out`.
1190
- - **Fixed** Auto-sync audio resolves `AUDIO_SYNC_*` enum constants via the live
1191
- Resolve handle, closing a path where a stale module handle silently degraded
1192
- `AutoSyncAudio` to rejected string keys.
1193
- - **Changed** Every `subprocess` call that can run while the MCP stdio server is
1194
- active now sets `stdin=subprocess.DEVNULL`, so a child process cannot consume
1195
- bytes from the JSON-RPC protocol stream; the spec-hook runner also captures its
1196
- child's output. Applies to both the compound and granular launchers.
1197
-
1198
- ## What's New in v2.32.2
1199
-
1200
- Fixes `fusion_comp(action="get_keyframes")` serialization.
1201
-
1202
- The handler iterated `Input.GetKeyFrames()` as if it returned `{time: value}`,
1203
- but Fusion returns `{1-based index: frame_position}`. The result put the
1204
- keyframe **index** in `time` and the **frame position** in `value` — the actual
1205
- keyframed values were never reported.
1206
-
1207
- The handler now treats the dict values as frame positions and reads each
1208
- keyframed value back via `GetInput(input_name, frame)`.
1209
-
1210
- - **Fixed** `get_keyframes` now returns `[{"time": <frame>, "value": <value>}, ...]`
1211
- in frame order (live-validated on DaVinci Resolve Studio 21.0.0:
1212
- `Size` keyed `1.0@f0` / `1.4@f75` → `[{0.0: 1.0}, {75.0: 1.4}]`).
1213
- - Follow-up to the `add_keyframe` fix in v2.32.1; flagged by @sandypoli-boop in #56.
1214
-
1215
- ## What's New in v2.32.1
1216
-
1217
- Fixes `fusion_comp(action="add_keyframe")` so it actually **animates** the input.
1218
-
1219
- Previously the handler did `inp[time] = value` on the input directly. On an input
1220
- with no animation spline, that only assigns a **static** value (last write wins) —
1221
- no keyframe is created. Symptoms: `get_keyframes` returned `[]`, `get_input` at
1222
- different times returned the same value, and the clip never animated.
1223
-
1224
- The handler now attaches a `BezierSpline` modifier the first time an input is
1225
- animated, then sets the keyframe. A new optional `modifier` param lets callers
1226
- pass e.g. `"Path"` for Point inputs such as `Center`. Behavior is unchanged for
1227
- inputs that are already animated or otherwise connected.
1228
-
1229
- - **Fixed** `add_keyframe` now creates real, editable keyframes (live-validated on
1230
- DaVinci Resolve Studio 21.0.0).
1231
- - **Added** optional `modifier` param to `add_keyframe`.
1232
- - Thanks to @sandypoli-boop for the diagnosis and fix ([#56](https://github.com/samuelgursky/davinci-resolve-mcp/pull/56)).
1233
-
1234
- ## What's New in v2.32.0
1235
-
1236
- Adds **governance tiers** for the media-creating Resolve 21 AI ops (Phase 3, the
1237
- final phase of the AI-ops build: ledger → console → governance).
1238
-
1239
- The two ops that render new files — `remove_motion_blur` and `generate_speech` —
1240
- now have **soft, per-session limits** chosen by a named tier:
1241
-
1242
- | dimension | off | lenient | standard | strict |
1243
- |---|---|---|---|---|
1244
- | deblur runs | ∞ | 50 | 15 | 5 |
1245
- | speech runs | ∞ | 50 | 15 | 5 |
1246
- | media created | ∞ | 50 GB | 10 GB | 2 GB |
1247
- | render time | ∞ | 1 h | 20 min | 5 min |
1248
-
1249
- Governance is **advisory** — it never hard-blocks (the ops are already
1250
- confirm-token gated). When you're near or over the active tier, the confirmation
1251
- dialog surfaces a warning before you proceed; the limits are computed from the
1252
- v2.30.0 AI-ops ledger for the current session.
1253
-
1254
- - **New module** `src/utils/resolve_ai_governance.py` — tiers + `check()` (status
1255
- for the next run) + `status()` (session usage vs tier). Default tier: `standard`.
1256
- - **New MCP actions** `media_analysis(action="get_ai_governance")` and
1257
- `media_analysis(action="set_ai_governance", preset, overrides?)`. Override keys:
1258
- `deblur_runs`, `speech_runs`, `render_bytes`, `render_wall_clock_ms` (int or `"unlimited"`).
1259
- - **Confirm preview** for the two creators now carries a `governance` block
1260
- (current usage, projected, warnings, exceeded/near flags).
1261
- - **Control panel** — the AI Console gains a **Governance** section: a tier picker
1262
- (off/lenient/standard/strict, with each tier's thresholds) plus live
1263
- consumption gauges, and the confirm dialog shows the warning inline.
1264
-
1265
- This completes the staged AI-ops build. Validated live against Resolve Studio
1266
- 21.0.0.47 (tier switching, persistence, gauges, confirm-dialog warnings).
1267
-
1268
- ## What's New in v2.31.0
1269
-
1270
- Adds the **AI Console** to the control panel — an interactive surface for the
1271
- Resolve 21 local AI operations (Phase 2 of the staged AI-ops build: ledger →
1272
- console → governance).
1273
-
1274
- A new **AI Console** tab runs the 21.0 ops against the current Media Pool folder
1275
- or a specific clip:
1276
-
1277
- - **Capability matrix** — shows which AI methods this Resolve build exposes (green
1278
- = available, grey = absent on older builds) and which Extra each gated method
1279
- needs to actually run.
1280
- - **Analysis** — Classify audio / Clear classification, IntelliSearch (with
1281
- identify-faces and Better-mode toggles), Analyze for slate (16-color marker
1282
- picker), Transcribe (with speaker-detection toggle), Clear transcription.
1283
- - **Motion deblur** and **Speech generator** — full options forms; because both
1284
- create new media files they route through a confirmation modal (the same
1285
- confirm-token gate the MCP tools use) before running.
1286
- - **Session** — Disable background tasks for the current Resolve session.
1287
- - A live result readout, and the *Resolve 21 AI ops* ledger refreshes after each
1288
- run so file/byte totals stay current.
1289
-
1290
- Backend: a loopback-only `POST /api/resolve_ai/run` endpoint dispatches each op
1291
- to the consolidated `folder` / `media_pool_item` / `project_settings` /
1292
- `resolve_control` tools, relaying the confirm-token two-step. No new MCP tools or
1293
- Resolve API surface — the console reuses the existing v2.29.0 actions. Validated
1294
- live end-to-end against Resolve Studio 21.0.0.47.
1295
-
1296
- ## What's New in v2.30.0
1297
-
1298
- Adds the **Resolve 21 AI-ops ledger** — usage/time/file accounting for the
1299
- Resolve-local AI operations added in v2.29.0 (audio classification, IntelliSearch,
1300
- slate, motion-deblur, speech generation). These run on Resolve's own GPU/AI engine
1301
- and do **not** consume the Claude-side analysis token budget, so they get their
1302
- own ledger instead of being metered by the analysis-caps layer.
1303
-
1304
- **What's tracked.** Every run of the five 21.0 ops records: op name, op class
1305
- (`analysis` vs `render`), clip id, success/failure, wall-clock time, and — for the
1306
- two media-creating ops (`remove_motion_blur`, `generate_speech`) — the output
1307
- file path and byte size. The reliable signal is invocation counts + the
1308
- file/disk accounting for the creators; durations for the bool-returning analysis
1309
- ops reflect the script-call time (some queue work inside Resolve).
1310
-
1311
- - **New table** `resolve_ai_op_usage` (timeline_brain DB schema v7).
1312
- - **New module** `src/utils/resolve_ai_ledger.py` — `timed()` context manager +
1313
- `record_op` / `get_usage` / `get_summary`. All writes are best-effort and never
1314
- block or mask the underlying Resolve op.
1315
- - **Instrumentation** wraps the consolidated `folder` / `media_pool_item`
1316
- `perform_audio_classification` / `clear_audio_classification` /
1317
- `analyze_for_intellisearch` / `analyze_for_slate` / `remove_motion_blur`
1318
- handlers and `project_settings.generate_speech`.
1319
- - **New MCP action** `media_analysis(action="get_resolve_ai_usage", session_only?, op?, limit?)`
1320
- returns the per-op summary + recent runs.
1321
- - **Control panel**: a read-only "Resolve 21 AI ops" card (`/api/resolve_ai_usage`)
1322
- shows runs, success/fail, total time, and files/bytes created.
1323
-
1324
- Phase 1 of a staged build (ledger → interactive console → governance). Granular
1325
- `--full` server instrumentation is deferred — the ledger covers the consolidated
1326
- server, which is the default surface. Validated live against Resolve Studio 21.0.0.47.
1327
-
1328
- ## What's New in v2.29.0
1329
-
1330
- Adds the **DaVinci Resolve 21.0** scripting-API additions. Every new method is
1331
- runtime-detected (`_requires_method`/capability flags), so the tools stay inert
1332
- on older Resolve builds and activate automatically on Resolve 21+.
1333
-
1334
- **New AI analysis actions** on the `folder` and `media_pool_item` compound tools
1335
- (and mirrored as granular `--full` tools):
1336
-
1337
- - `perform_audio_classification` / `clear_audio_classification` — classify clip
1338
- audio into categories and subcategories.
1339
- - `analyze_for_intellisearch(identify_faces?, is_better_mode?)` — IntelliSearch
1340
- analysis with optional face identification. Requires the *AI IntelliSearch* Extra.
1341
- - `analyze_for_slate(marker_color?)` — slate/clapboard detection that drops a
1342
- marker of the chosen color (validated against the 16 Resolve marker colors).
1343
- Requires the *AI Slate ID* Extra.
1344
- - `remove_motion_blur(deblur_option?)` — renders motion-deblurred copies. This
1345
- **creates new media files** (source media is never modified) and is therefore
1346
- **confirm-token gated**: the first call returns a preview + token, the second
1347
- call (with the token) runs.
1348
-
1349
- **Speaker-detection transcription.** `transcribe_audio` now accepts an optional
1350
- `use_speaker_detection` boolean (Resolve 21+); omit it to use the project's
1351
- Speech Recognition setting.
1352
-
1353
- **Speech generation.** `project_settings(action="generate_speech", ...)` wraps
1354
- `Project.GenerateSpeech` (AI text-to-speech). It creates a new audio item and
1355
- optionally places it on the timeline, so it is also confirm-token gated.
1356
- Requires the *AI Speech Generator* Extra. Granular `--full` tool: `generate_speech`.
1357
-
1358
- **Session control.** `resolve_control(action="disable_background_tasks_for_current_session")`
1359
- wraps `Resolve.DisableBackgroundTasksForCurrentResolveSession()` to quiet
1360
- background work during heavy scripted runs.
1361
-
1362
- **Capability surface.** The `media_analysis` transcription-capability report and
1363
- the control panel's boot payload (`resolve.ai_features`) now list which 21.0 AI
1364
- methods are available and which Extras each gated method needs.
1365
-
1366
- Notes: these are Resolve-local GPU/AI operations and do not consume the
1367
- Claude-side analysis token budget, so they are not metered by the analysis-caps
1368
- layer; the derivative-creating ones are protected by the confirm-token gate
1369
- instead. The granular `--full` server grew from 329 to 341 tools.
1370
-
1371
- ## What's New in v2.28.1
1372
-
1373
- Bug-fix release.
1374
-
1375
- **Audio transcription no longer passes an invalid `language` argument.** The
1376
- `transcribe_audio` (clip) and `transcribe_folder_audio` tools in the full
1377
- (`--full`) server were calling `TranscribeAudio(language)` with a language
1378
- string, but the Resolve scripting API has never accepted a language positional —
1379
- its signature is `TranscribeAudio(useSpeakerDetection=None)`. The string was
1380
- silently coerced to a truthy boolean and misread as a speaker-detection flag,
1381
- and the success message falsely claimed a transcription language. The language
1382
- is controlled by the project's Speech Recognition setting, not per call.
1383
-
1384
- - `transcribe_audio(clip_name, use_speaker_detection=None)` — the `language`
1385
- parameter is replaced with an optional `use_speaker_detection` boolean
1386
- (Resolve 21+). Omit it to use the project's setting.
1387
- - `transcribe_folder_audio(folder_name, use_speaker_detection=None)` — same
1388
- change for the folder-level tool.
1389
- - Both pass the boolean through only when supplied, so older Resolve builds
1390
- (which take no argument) keep working.
1391
-
1392
- The consolidated 32-tool server was unaffected — its `folder`/`media_pool_item`
1393
- `transcribe_audio` actions already called `TranscribeAudio()` correctly.
1394
-
1395
- ## What's New in v2.28.0
1396
-
1397
- This release adds a structural timeline-diff engine, a declarative project spec
1398
- you can `apply` like infrastructure-as-code, a project health `lint`, a clip
1399
- query DSL, and a machine-readable `state` field on error responses.
1400
-
1401
- **Timeline version diff — see exactly what an edit changed.** Comparing two
1402
- archived timeline versions now reports clips that were **added, removed, moved,
1403
- and trimmed**, plus summary counts and before/after clip totals. A new reusable
1404
- diff engine aligns clips by a rename-stable identity (so a reordered or renamed
1405
- clip reads as a move/change, not a delete-and-re-add).
1406
-
1407
- - `timeline_versioning(action="diff_versions", timeline_name, from_version, to_version)`
1408
- now returns `{added, removed, moved, trimmed, summary}` (the previous
1409
- `added`/`removed`/`moved` keys are unchanged).
1410
- - Dashboard endpoint `GET /api/timeline_versions/diff?timeline_name=&from_version=&to_version=`
1411
- exposes the same diff to the control panel.
1412
-
1413
- **Declarative project spec + `apply` — reproducible project setup.** Describe a
1414
- project's desired settings, color preset, timelines, and markers in a
1415
- `project.dvr.yaml` (or `.json`), then reconcile the live project toward it. Runs
1416
- are **idempotent** — applying twice is a no-op — and a dry run previews every
1417
- change before anything is touched.
1418
-
1419
- - New MCP actions on `project_manager`:
1420
- - `diff_to_spec(spec_path | spec)` — preview drift without mutating.
1421
- - `plan_spec(spec_path | spec)` — the ordered action list (dry run).
1422
- - `apply_spec(spec_path | spec, dry_run?, run_hooks?, continue_on_error?)` —
1423
- reconcile. Color/HDR settings apply in dependency order; markers are only
1424
- added when absent; an explicit `color_preset` can be overridden by explicit
1425
- `settings`. Failures can abort on first error or accumulate.
1426
- - New headless CLI commands: `davinci-resolve-mcp batch plan-spec SPEC` and
1427
- `davinci-resolve-mcp batch apply SPEC [--dry-run] [--run-hooks] [--continue-on-error]`.
1428
- Exit codes follow the existing convention (`0` ok, `2` partial, `3` fatal).
1429
- - Optional before/after shell **hooks** in the spec run only when `run_hooks` is
1430
- passed (opt-in).
1431
-
1432
- **Project health `lint` — a pre-flight before editing.** `project_manager(action="lint")`
1433
- returns a graded issue list (errors / warnings / info) covering: no project, no
1434
- current timeline, mixed frame rates across timelines, empty timelines, unset
1435
- render format, unmanaged color science, offline media, and unanalyzed clips.
1436
-
1437
- **Clip query DSL — find clips in one call.** `timeline(action="clip_where", ...)`
1438
- returns the clips on the current timeline matching named filters (AND), instead
1439
- of enumerating tracks by hand. Live filters: `track_type`, `track_index`,
1440
- `name_contains`, `duration_lt`, `duration_gt`. A typo'd filter name is rejected
1441
- rather than silently matching everything.
1442
-
1443
- **Machine-readable error context.** Structured error responses can now carry an
1444
- optional `state` object — a snapshot of the relevant values at failure time
1445
- (e.g. which filter was unknown, which spec failed and where) — so an agent can
1446
- react without parsing prose. Existing error fields are unchanged.
1447
-
1448
- ## What's New in v2.27.2
1449
-
1450
- **Control panel under-counted analyzed clips after a Media Pool rename (issue
1451
- #51)** — with every clip analyzed (e.g. 303/303 reports on disk), the overview
1452
- and Media tab could report something like "108 / 303 analyzed". The panel only
1453
- recognized a report when a folder's name exactly matched the clip's *current*
1454
- display name, so renaming clips after analysis hid their existing reports even
1455
- though the underlying media was unchanged.
1456
-
1457
- Root cause and fix:
1458
-
1459
- - **Lookups are keyed by a rename-stable hash, not the display-name folder.**
1460
- Report folders are named `<display-slug>-<hash>`; the count now matches on the
1461
- trailing hash (and the ids inside each report), so a renamed clip still
1462
- resolves to its existing folder. Both the disk path and the jobs-DB fallback
1463
- were corrected.
1464
- - **The hash is now anchored to the normalized file path (canonical basis).**
1465
- Previously the basis was a `clip_id`-first cascade, so the same media hashed
1466
- differently depending on which fields a record carried — Resolve inventory
1467
- (clip_id) vs path-based batch jobs (file path) disagreed on the same clip.
1468
- Anchoring to the file path removes that cross-basis mismatch. Legacy folders
1469
- (clip_id-based, or raw-path-based) still resolve via a migration-safe set of
1470
- candidate hashes, so **no on-disk migration is required**.
1471
- - **Writes reuse an existing report folder** (matched by canonical or legacy
1472
- hash) instead of minting a new `<newslug>-<hash>` directory, eliminating
1473
- orphaned duplicate folders when a renamed clip is re-analyzed.
1474
- - **A persisted clip index (`clips/index.json`)** maps every stable id found in
1475
- a report (normalized + raw file path, clip_id, media_id) to its folder, so the
1476
- count can still match a clip by any id it carries — including an offline clip
1477
- that no longer reports a file path but retains its clip_id. The index is
1478
- refreshed only when a report is added, removed, or rewritten (cheap signature
1479
- check), so the recurring poll stays inexpensive.
1480
-
1481
- No public MCP tool surface changed. Adds regression tests in
1482
- `tests/test_media_analysis.py` covering rename, cross-basis, legacy-folder reuse,
1483
- the jobs-DB fallback, and the offline/no-path case.
1484
-
1485
- ## What's New in v2.27.1
1486
-
1487
- **Faster control-panel startup with network source media (issue #50)** — on
1488
- first open the control panel could sit on "connection pending" for a long time
1489
- when Media Pool clips lived on mounted network storage, because the UI only
1490
- treated the connection as live once the full media inventory finished loading,
1491
- and that inventory probed every clip's file path on disk.
1492
-
1493
- Fixes and performance work:
1494
-
1495
- - **Connection state is decoupled from the media inventory.** The overview and
1496
- diagnostics panels now derive "connected" from the `/api/boot` handshake (which
1497
- returns as soon as the Resolve bridge is reachable) and show inventory loading
1498
- separately, so Resolve reads as live immediately while clips stream in.
1499
- - **Parallel, cached file-existence probing.** `os.path.exists` for every clip
1500
- now runs in a thread pool and is memoized for a short TTL, instead of two serial
1501
- `stat()` calls per clip — the dominant cost on network storage.
1502
- - **Background polls reuse the cached Media Pool walk.** The recurring poll no
1503
- longer re-runs the ~N serial `GetClipProperty` calls; it reuses the last walk
1504
- and re-applies only the local, disk-backed analysis-status overlay. A cheap
1505
- project-id check still catches a project switched directly in Resolve, and a
1506
- manual refresh always does a full walk.
1507
- - **Resolve scripting API access is serialized.** A re-entrant lock guards every
1508
- scripting-API entry point, since the dashboard's threaded HTTP server could
1509
- previously fire concurrent (thread-unsafe) Resolve calls at startup.
1510
- - **ETag/304 on the inventory endpoint** skips transfer and table re-render when
1511
- nothing changed; the last good inventory is cached client-side and painted
1512
- instantly on reload; and the first inventory build is warmed in a background
1513
- thread at server start.
1514
-
1515
- No public MCP tool surface changed. Adds regression tests in
1516
- `tests/test_media_analysis.py` (path-existence probing, inventory cache reuse,
1517
- project-switch detection, lock reentrancy).
1518
-
1519
- ## What's New in v2.27.0
1520
-
1521
- **Frame-sampling modes (issue #46)** — how many frames a clip gets for visual
1522
- analysis is now governed by a `sampling_mode`, decoupled from `depth` (which
1523
- still controls which layers run). A fixed frame count over-sampled short clips
1524
- and under-covered long ones; the demand-driven engine already scaled by
1525
- duration/content, but the caps layer was flat-truncating its output back to 8
1526
- frames — that flat cap was the real cause of long-clip under-coverage.
1527
-
1528
- Four clearly-tiered modes, organized so token cost is predictable per tier:
1529
-
1530
- - **Economy** (`fixed`) — flat N evenly-spaced, content-blind frames. Cheapest and
1531
- most predictable; good for proxies/triage.
1532
- - **Balanced** (`per_minute`) — `clamp(minutes × frames_per_minute, floor, ceiling)`
1533
- (defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
1534
- - **Thorough** (`adaptive_capped`, recommended/default) — content-aware: samples
1535
- shot boundaries, representatives, and flash candidates, bounded to `[floor,
1536
- ceiling]`. Best coverage with a bounded cost.
1537
- - **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
1538
- (up to the 512-frame hard cap). Use only when clips are short or few.
1539
-
1540
- The first time you analyze without a saved default, the tool returns a
1541
- `confirmation_required` response with a `sampling_mode_prompt`; choosing a mode
1542
- saves it as your standing default (mirrors `timed_markers_default`). Pass
1543
- `sampling_mode` per call any time for a one-off that doesn't change the default.
1544
- Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) and the mode are
1545
- all exposed in the control panel (Preferences → Frame sampling mode) with a live
1546
- per-clip token-cost estimate; batch jobs honor the saved default.
1547
-
1548
- Analysis-caps presets were retuned so `frames_per_clip` is now a *safety ceiling*
1549
- (minimal/standard/generous = 12/80/200), not the primary frame dial, and the
1550
- per-clip/job/day vision-token caps were raised so the default Thorough mode isn't
1551
- refused by the per-clip token cap. Cache reuse re-samples only when switching up
1552
- the thoroughness rank; a richer prior report still satisfies a cheaper mode. Adds
1553
- `tests/test_sampling_modes.py` (30 tests). Validated end-to-end on a synthetic
1554
- multi-shot clip with real ffmpeg frame extraction.
1555
-
1556
- ## What's New in v2.26.1
1557
-
1558
- **Python 3.13 / 3.14 support (issue #45)** — `npx davinci-resolve-mcp setup`
1559
- previously hard-refused any interpreter outside 3.10–3.12, so it failed outright
1560
- on Python 3.14. The 3.12 ceiling was based on a stale assumption that Resolve's
1561
- scripting bridge has ABI incompatibilities on 3.13+. Verified empirically against
1562
- DaVinci Resolve Studio 20.3.2.9: Python 3.14.4 connects and exercises the
1563
- dict/list marshalling paths cleanly. The launcher and installer now enforce only
1564
- the 3.10 floor (the `mcp[cli]` SDK requirement) with no upper cap. Python 3.13/3.14
1565
- are accepted with a soft heads-up; `setup`/`doctor` surface a precise,
1566
- connection-aware hint only when Resolve is running but the bridge returns no
1567
- connection on 3.13+. Sub-3.10 interpreters get an actionable error instead of a
1568
- dead end. `server.py` warns (never exits) on 3.13+. Adds 6 version-gate unit tests.
1569
-
1570
- ## What's New in v2.26.0
1571
-
1572
- **Fusion group-settings helpers** — Three new `fusion_comp` actions for
1573
- authoring and patching `GroupOperator` macros without leaving the kernel.
1574
- `group_settings_export` writes a live group to a `.setting` file and returns a
1575
- parsed `published_inputs` summary using a balanced-brace walker so nested
1576
- `UserControls` / `ControlGroup` tables are bounded correctly (the original
1577
- flat-regex parser truncated `InstanceInput` bodies at the first inner `}`).
1578
- `group_settings_splice_inputs` replaces the `Inputs = ordered() { ... }` block
1579
- of one `.setting` with the matching block from another, preserving the source's
1580
- outer structure and inner `Tools`. `group_settings_load` applies a `.setting`
1581
- to a live group with an automatic timestamped backup, wrapped in
1582
- `StartUndo`/`Lock`/`LoadSettings`/`Unlock`/`EndUndo(True)` so Fusion's Ctrl+Z
1583
- reverses the change — verified live via direct BMD API.
1584
-
1585
- **bulk_set_expressions** — Companion to the existing `bulk_set_inputs`. Batch
1586
- attach Fusion expressions across many timeline-item comps in one call. Each op
1587
- requires timeline scope plus `tool_name`, `input_name`, `expression`. Returns
1588
- per-op `success`/`error` rows + `op_count`, matching the bulk-inputs contract.
1589
- Useful for animating many controls at once (`time/30`, etc.) under a single
1590
- chat turn.
1591
-
1592
- **Headless batch-runner CLI** — New
1593
- `davinci-resolve-mcp batch <plan|run|status|list|resume|cancel>` subcommand
1594
- drives `src/utils/media_analysis_jobs` from outside an MCP/chat client so long
1595
- analysis batches can run via cron, CI, or terminal without holding a chat turn
1596
- open. The orchestration loop and durable state stay in the existing jobs
1597
- engine; the CLI only handles argv, progress streaming, and exit codes
1598
- (`0` ok / `2` partial / `3` fatal / `130` Ctrl+C). JSON mode (`--json`)
1599
- emits one record per progress event for log scraping. Closes #42.
1600
-
1601
- **Adapted from PR #40** — Group-settings work originated as a contribution
1602
- from @RaincloudTheDragon; PR #43 retains the keepable parts (parser, exporter,
1603
- splicer, loader, `bulk_set_expressions`) with a balanced-brace fix on the
1604
- parser and an undo+lock wrap on `group_settings_load`. The two AMZ-specific
1605
- templates and the static checklist from #40 were dropped as out-of-scope for a
1606
- general kernel.
1607
-
1608
- ## What's New in v2.25.0
1609
-
1610
- **Agentic flow improvements** — A second-pass review against the Claude
1611
- Certified Architect study material drove a sweep of correctness gains. Every
1612
- tool error now returns a structured envelope (`code` / `category` /
1613
- `retryable` / `reason` / `remediation` / `message`); `retryable` defaults are
1614
- locked per category so a host can make a one-shot retry decision without
1615
- inference. Compound-tool descriptions for `media_analysis` and
1616
- `timeline_item_color` adopt XML semantic tags (`<when_to_use>`, `<actions>`,
1617
- `<returns>`) for cheaper per-turn parsing. Repeated failures on the same
1618
- `(scope, action)` pair attach an `escalation` block on the 3rd response —
1619
- halts auto-retry loops with a `suggested_action` for the host. Batch
1620
- manifests now always carry `partial_success`, `completed_clip_ids`, and
1621
- `failed_clip_ids` for safe targeted retry.
1622
-
1623
- **MCP resources surface** — 8 read-only resource URIs the host can poll
1624
- without paying a tool-turn cost: `status://mcp_version`,
1625
- `status://resolve_connection`, `status://current_project`,
1626
- `status://current_timeline`, `status://caps_preset`,
1627
- `analysis://recent_reports`, `capabilities://installed_tools`,
1628
- `capabilities://install_guidance`. Paired tools still work for hosts that
1629
- don't consume resources.
1630
-
1631
- **MCP prompts surface** — 5 slash-command workflow templates:
1632
- `/davinci-resolve:analyze_and_propose_grade`,
1633
- `/davinci-resolve:match_bin_to_hero`,
1634
- `/davinci-resolve:verify_timeline_coverage`,
1635
- `/davinci-resolve:open_and_analyze_selection`,
1636
- `/davinci-resolve:prep_color_handoff`. First-class agentic intent, no
1637
- re-derivation from SKILL.md prose.
1638
-
1639
- **Color-grading evidence base** — `timeline_item_color.grade_evidence_base`
1640
- composes `version_snapshot` + `node_graph` + `color_group` + coverage report
1641
- into a single `evidence_base` summary string; the SKILL guide now teaches
1642
- agents to lead any color recommendation with that line.
1643
- `timeline_item_color.propose_grade` formalizes a recommendation as a
1644
- validated structured plan (returns `plan_id` + `preview_path`; requires
1645
- explicit `execute=true` re-call). `bulk_match_to_hero` drives CDL-delta or
1646
- copy-grade across many targets with a `confirm_token` gate and dry-run
1647
- preview.
1648
-
1649
- **Analysis caps layer** — Token-budget governance for analysis. 7 cap
1650
- dimensions across vision/transcription/job/clip/day scopes, 4 named presets
1651
- (`minimal` / `standard` / `generous` / `unlimited`), pre-call refusal with
1652
- `CAPS_REFUSAL` / `budget_exhausted` / `retryable: false`. New
1653
- `media_analysis` actions: `get_caps`, `set_caps_preset`. Token usage table
1654
- in the analysis DB plus a control-panel widget with gauges + override
1655
- inputs. Wall-clock timeout helper wraps vision/transcription call sites.
1656
-
1657
- **Timeline versioning + analysis↔timeline marriage** — New
1658
- `timeline_versioning` MCP tool: every destructive timeline edit
1659
- auto-archives the current timeline into an Archive bin (compound, captions,
1660
- ripple, gap close, etc.), so versions can be diffed and rolled back. Run
1661
- scoping, schema v4 migrations, concurrency safety, structural snapshots,
1662
- action filtering, strict mode, auto-save preference, media-pool destructive
1663
- coverage, thumbnails. Backed by new modules `timeline_versioning.py`,
1664
- `timeline_brain_db.py`, `brain_edits.py`, `analysis_runs.py`,
1665
- `media_pool_changes.py`, `destructive_hook.py`. Surfaced in the control
1666
- panel's Review → History view.
1667
-
1668
- **Async opt-in for long-running ops** — `analyze_clip` / `analyze_file` /
1669
- `commit_vision` accept `prefer_handle: true`. When set (and the estimated
1670
- runtime exceeds the configured threshold), the response is a fast handoff
1671
- with `job_id` + `status: "queued"`; poll `batch_job_status({job_id})`.
1672
- Default behavior unchanged.
1673
-
1674
- **Aggregated provenance** — `summarize`,
1675
- `review_timeline_markers`, and `grade_evidence_base` now return a
1676
- `provenance` block: `source_reports[]` (clip_id, signature, report_path,
1677
- analyzed_at), `missing_reports[]` (per reason: `no_report` / `stale_report`
1678
- / `caps_refused`), and inline `[ref:<clip_id>]` citations in the human
1679
- summary text. Multi-clip claims are now traceable.
1680
-
1681
- **Confirm-token gates on destructive batches** — `propose_grade`,
1682
- `bulk_match_to_hero`, and other multi-target writes now require an explicit
1683
- `confirm_token` on first execute (returned on the dry-run), with a
1684
- `pending_user_decision` error if missing.
1685
-
1686
- **Action-help indirection** — `action_help(name=...)` returns the long-form
1687
- guidance for a single action, keeping the top-level tool descriptions
1688
- compact while preserving full per-action documentation.
1689
-
1690
- **Tool-choice hint emission** — Analyze responses include a
1691
- `host_tool_choice_hint` block. Hosts that respect it pass
1692
- `tool_choice={type:"tool", name:"media_analysis"}` on the next API turn,
1693
- hard-locking the agent into the correct next call.
1694
-
1695
- **Update process hardening** — Five improvements layered onto the
1696
- update-check path: active-job lock prevents updates mid-analysis, auto-stash
1697
- strategy preserves uncommitted work across updates, restart-needed marker
1698
- surfaces to the host, channels (`stable` / `beta` / `dev`), pre-update
1699
- breaking-change scan, integrity SHA verification of downloaded artifacts,
1700
- update history table, eager DB migration on update, and rollback to the
1701
- previous build. New `analysis_caps.py` + `update_check.py` revisions.
1702
-
1703
- **Source-safe guardrails** — `destructive_hook.py` + decorator coverage
1704
- tests ensure every destructive surface goes through the auto-archive path
1705
- and never modifies, transcodes, or creates derivatives of source media.
1706
-
1707
- **Test surface** — 30+ new test modules covering error envelopes,
1708
- failure tracking, partial-success manifests, `prefer_handle`, MCP resources,
1709
- MCP prompts, provenance, XML description shape, `action_help`,
1710
- `grade_evidence_base`, `propose_grade`, `bulk_match_to_hero`,
1711
- `confirm_token`, the analysis caps layer, caps integration / events /
1712
- history, timeline versioning, the timeline-brain DB, destructive decorator
1713
- coverage, the destructive hook, update hardening, and update history.
1714
-
1715
- **Validation** — `tests/test_import.py`, `scripts/audit_api_parity.py`,
1716
- `node bin/davinci-resolve-mcp.mjs --version`, `npm pack --dry-run`, and
1717
- `git diff --check` all pass. 375 focused unit tests pass. Live Resolve
1718
- validation covered the D1–F2 surface end-to-end against project CKY /
1719
- Timeline 7 (D1 `retryable`, D2 XML descriptions, D3 partial-success on
1720
- plans + CAPS_REFUSAL manifests, E1 8 MCP resource URIs, E2 escalation on
1721
- 3× repeated failure, E3 `prefer_handle` job handoff with
1722
- `batch_job_status` polling, F1 provenance block) — 6/6 PASS on the
1723
- fourteenth-attempt smoke test. No source media was modified.
1724
-
1725
- ## What's New in v2.24.1
1726
-
1727
- **`npx davinci-resolve-mcp` no longer breaks MCP clients when invoked without a
1728
- subcommand.** The npm bootstrapper previously defaulted to `--help`, which wrote
1729
- usage text to stdout and exited 0. MCP stdio clients (Hermes Agent, Claude
1730
- Desktop, Cursor, etc.) read that as malformed JSON-RPC, retried three times,
1731
- then dropped the connection. `bin/davinci-resolve-mcp.mjs` now defaults to the
1732
- `server` subcommand when no arguments are supplied. Explicit `--help`, `-h`,
1733
- `help`, `--version`, and `-v` continue to print to stdout as before, and
1734
- existing configs that already pass `server` explicitly are unaffected. Reported
1735
- in [#41](https://github.com/samuelgursky/davinci-resolve-mcp/issues/41).
1736
-
1737
- ## What's New in v2.24.0
1738
-
1739
- **Host-chat vision protocol (V2)** — `analyze_*` actions now use
1740
- `vision.provider="host_chat_paths"` by default. The analyze response is a
1741
- deferred payload with absolute `frame_paths`, a per-shot `shot_table`, and a
1742
- JSON schema; the host chat reads each frame as a local image, produces JSON per
1743
- the schema, and calls `media_analysis(action="commit_vision", params={clip_id,
1744
- visual, vision_token})` to finalize. `commit_vision` merges the visual report,
1745
- rebuilds Media Pool clip markers, publishes metadata to Resolve, and preserves
1746
- human corrections via `corrections.json`. Skipping the commit leaves the run in
1747
- `pending_host_vision_analysis` — surfaced explicitly rather than silently
1748
- downgraded. The legacy `chat_context`/`mcp_sampling` providers still resolve to
1749
- the same host-chat path.
1750
-
1751
- **Trust-by-default analysis defaults** — `analyze_media` defaults to
1752
- `include_transcription=true`, `persist=true`, `publish_metadata=true`, and
1753
- `timed_markers="ask"` so source-safe no longer means underpowered. Agents that
1754
- need a technical-only or read-only run must explicitly pass
1755
- `include_visuals=false`, `include_transcription=false`, `publish_metadata=false`,
1756
- `timed_markers="no"`, `session_only=true`, or `dry_run=true`. The
1757
- `analyze_media` prompt and SKILL.md spell out the anti-regression rule.
1758
-
1759
- **Control panel: Review surface (Phase B)** — The local browser control panel
1760
- gains a Review tab backed by new endpoints: `/api/clips`, `/api/clips/<id>`,
1761
- `/api/clips/<id>/shots`, `/api/clips/<id>/shots/<index>`,
1762
- `/api/clips/<id>/frames/<n>`, `/api/clips/<id>/transcript`,
1763
- `/api/clips/<id>/corrections`, `/api/clips/combined`, `/api/clips/export`,
1764
- `/api/panel_state`, `/api/update/status`, `/api/update/apply`, and
1765
- `/api/resolve/open_clip`. The UI ships a bin grid with thumbnails, a clip
1766
- detail with shot strip, a shot detail with grouped V2 fields + frame grid,
1767
- inline correction editors per subjective field, transcript correction +
1768
- regeneration, an Open-in-Resolve bridge, and 2-second chat ↔ panel state
1769
- polling.
1770
-
1771
- **Control panel MCP actions** — `resolve_control.open_control_panel`,
1772
- `control_panel_status`, and `close_control_panel` manage the local panel
1773
- subprocess via a pidfile. `save_state` / `restore_state` snapshot and restore
1774
- Resolve playhead + selection state. `get_panel_state`, `set_panel_state`, and
1775
- `session_start_context` share panel focus between chat and the UI through
1776
- `panel_state.json`.
1777
-
1778
- **Correction tools** — New `media_analysis` actions for editing analysis
1779
- without re-running it: `update_shot_field`, `update_clip_field`,
1780
- `get_field_history`, `revert_field`, `list_corrections`. Writes land in
1781
- `{clip_dir}/corrections.json` with append-only changelog + provenance
1782
- (mirrors the V2 DB schema). `commit_vision` merges corrections on top of the
1783
- fresh visual report so human edits survive re-analysis.
1784
-
1785
- **Media Pool item open-in-viewer** — `media_pool_item.open_in_viewer` selects
1786
- a clip on the Media page and loads it into the source viewer, optionally
1787
- setting mark in/out and bringing Resolve to the foreground via OS-level
1788
- window activation. Useful for chat → Resolve hand-off.
1789
-
1790
- **Source-trust prompt grading** — `source_trust` parameter
1791
- (`auto`/`filename`/`low`/`medium`/`high`) on analyze actions tunes the vision
1792
- prompt to hedge identity/intent/value for archival or thin-evidence clips.
1793
-
1794
- **Analysis memory layer** — New `src/utils/analysis_memory.py` introduces
1795
- per-project memory + heartbeat + bin summary + soul scaffolding under the
1796
- analysis root. `regenerate_bin_summary_from_manifest` aggregates per-clip
1797
- fields (primary use, select potential, style, energy arc, top tags/locations)
1798
- into a bin briefing. Auto-initialized on analyze.
1799
-
1800
- **Control-panel polish** — Diagnostics + Overview restyled with a status-pill
1801
- design system, navbar dropdowns fixed so top-level buttons no longer navigate
1802
- on their own, Preferences consolidated (Dashboard Convenience + Storage pages
1803
- removed), summary-style enum renamed to `full`/`concise`/`creative`/
1804
- `technical` with backwards compat, navbar version badge + update modal,
1805
- source-trust dropdown wired through.
1806
-
1807
- **Server-side bug fixes** — `commit_vision` auto-publish now reflects per-row
1808
- status correctly (no silent-lie pending), compact analyze responses by default
1809
- (`verbose: true` for the full manifest), `resolve_output_root` skips slug
1810
- append when the configured base already terminates in the slug, frame sampler
1811
- reserves per-shot budget so shot starts aren't starved by flash candidates,
1812
- and machine markers are no longer written to Resolve (V2 architecture).
1813
-
1814
- **Path hardening for GUI launches** — `media_analysis` now augments `PATH`
1815
- with the standard tool dirs (`/opt/homebrew/bin`, `/usr/local/bin`, etc.) so
1816
- ffprobe/ffmpeg resolve even when the MCP server is launched by a GUI app
1817
- (Claude.app, Dock/Spotlight) that inherits launchd's bare PATH.
1818
-
1819
- **Documentation** — `AGENTS.md` adds the "Media Analysis Defaults Are
1820
- Mandatory" section. `docs/SKILL.md` rewrites the `analyze_media` prompt
1821
- guidance for the host-chat-paths protocol and adds the anti-regression rule.
1822
- `docs/guides/media-analysis-guide.md` covers the deferred vision payload and
1823
- commit step.
1824
-
1825
- **Validation**: static import checks, API parity audit, focused
1826
- media-analysis + marker/range/v232/v233 unit tests, npm CLI smoke,
1827
- `npm pack --dry-run`, and `git diff --check` all passed. No source media was
1828
- modified. Resolve scripting behavior is additive (new actions; existing
1829
- actions unchanged); live Resolve validation covered the control-panel +
1830
- open_in_viewer + commit_vision auto-publish + corrections-merge paths during
1831
- the V2 push sessions logged in MEMORY.md.
1832
-
1833
- ## What's New in v2.23.1
1834
-
1835
- **Control panel navigation fixes** — The local browser control panel now keeps
1836
- top-level dropdown buttons from navigating by themselves. Analysis,
1837
- Diagnostics, Docs, and Preferences open their menus first; selecting a menu item
1838
- is what changes the active view.
1839
-
1840
- **Project dropdown cleanup** — The project context dropdown is back to showing
1841
- only the open/current project context plus a bottom `View All Projects` option.
1842
- The full database browser stays in the Projects view, and the standalone
1843
- Projects navbar button has been removed.
1844
-
1845
- **Validation**: static import checks, API parity audit, focused dashboard unit
1846
- tests, npm CLI smoke tests, package dry-run, and `git diff --check` passed. A
1847
- local dashboard smoke check verified the served HTML on `127.0.0.1:8765`.
1848
- No Resolve scripting behavior changed; live Resolve mutation validation was not
1849
- required.
1850
-
1851
- ## What's New in v2.23.0
1852
-
1853
- **npm installer** — `npx davinci-resolve-mcp setup` is now the primary quick
1854
- start. The npm package bootstraps a managed per-user install, runs the existing
1855
- Python installer from that stable location, and keeps MCP client configs pointed
1856
- at the managed virtual environment and `src/server.py`.
1857
-
1858
- **Local control panel** — Added a single-user browser control panel for server
1859
- status, Resolve clip visibility, source-safe analysis jobs, analysis search, and
1860
- preference management. It can be launched from source with
1861
- `venv/bin/python -m src.control_panel` or from npm with
1862
- `npx davinci-resolve-mcp control-panel`.
1863
-
1864
- **Durable media-analysis jobs and search** — `media_analysis` can now create,
1865
- slice, inspect, cancel, resume, and list durable analysis jobs. Persisted reports
1866
- refresh a single-user SQLite index with clip, marker, timeline occurrence,
1867
- keyframe, and transcript search helpers through `build_index`, `index_status`,
1868
- and `query_index`.
1869
-
1870
- **Release automation** — Added npm package metadata, package-content guards, and
1871
- a tag-driven GitHub Actions workflow for trusted npm publishing with provenance.
1872
- The workflow skips publish when the package version already exists, which keeps
1873
- the first manual npm registration from fighting the later tag workflow.
1874
-
1875
- **Validation**: static import checks, API parity audit, focused media-analysis,
1876
- update-check, and media-pool ingest unit tests passed. npm smoke tests, setup
1877
- dry-run, package dry-run, and `git diff --check` passed. No source media was
1878
- modified.
1879
-
1880
- ## What's New in v2.22.0
1881
-
1882
- **Configurable MCP update prompting** — Update checks now carry a persisted
1883
- policy: `prompt`, `auto`, `notify`, or `never`. The server still never blocks
1884
- MCP stdio startup, but the installer can prompt users to update, continue,
1885
- snooze for 24 hours, ignore the current release, enable safe auto-update, or
1886
- disable checks. Safe auto-update is opt-in and only attempts a clean git
1887
- fast-forward from checkouts with no local changes and a configured upstream.
1888
-
1889
- **MCP update controls** — `resolve_control.mcp_update_status` reports the local
1890
- MCP version, cached or forced update status, and the current prompt decision.
1891
- `set_mcp_update_policy`, `ignore_mcp_update`, `snooze_mcp_update`, and
1892
- `clear_mcp_update_preferences` expose the same policy state through the
1893
- compound server without requiring Resolve to be connected.
1894
-
1895
- **Conversation setup defaults** — New `setup` compound tool centralizes
1896
- conversation-configurable defaults. It can read, set, dry-run, and clear
1897
- preferences for media-analysis modality, slate detection, transcription,
1898
- analysis persistence, metadata publish fields and overwrite policy, timed marker
1899
- types/colors/counts, report style, preferred analysis roots, post-operation page
1900
- behavior, and MCP update interval/snooze policy. These defaults shape future
1901
- tool calls while preserving explicit confirmation for Resolve project writes.
1902
-
1903
- **Metadata field inventory** — `media_pool.metadata_field_inventory` gives
1904
- assistant editors and metadata workflows a read-only map of clip metadata,
1905
- clip-property keys, default analysis writeback fields, optional slate fields,
1906
- and inferred Resolve Metadata-panel groups. This helps bridge analysis
1907
- publishing to the fields Resolve actually exposes on a given clip/build.
1908
-
1909
- **Optional timed analysis markers** — `media_analysis.publish_clip_metadata`
1910
- can now write source-frame Media Pool clip markers for slate claps, best
1911
- moments, and QC warnings when the user opts in. If no marker preference exists,
1912
- the tool returns a prompt with yes/no/default-yes/default-no choices rather than
1913
- silently writing markers.
1914
-
1915
- **Validation**: static import checks, API parity audit, `git diff --check`, and
1916
- focused update-check, media-analysis, and media-pool ingest unit tests passed.
1917
- Media-pool ingest tests cover the new metadata inventory and Metadata-panel
1918
- group hints. Live validation used DaVinci Resolve Studio 20.3.2.9 through the
1919
- connected MCP server with a disposable project and synthetic media only. It
1920
- verified `metadata_field_inventory`, `MediaPool.ExportMetadata()` header
1921
- comparison, default analysis writeback field mapping, and `SetMetadata()`
1922
- readback for analysis and slate fields. The standalone live metadata inventory
1923
- harness is included for future release validation with a Resolve-compatible
1924
- Python 3.10-3.12 interpreter.
1925
-
1926
- ## What's New in v2.21.0
1927
-
1928
- **Resolve metadata publishing from analysis** —
1929
- `media_analysis.publish_clip_metadata` turns source-safe analysis reports into
1930
- Resolve-native clip metadata. It proposes field-specific merges for
1931
- `Description`, `Comments`, `Keywords`, `People`, and optional slate-derived
1932
- fields, preserves existing human metadata by default, writes provenance to
1933
- third-party metadata, and requires `confirm=true` before mutating Resolve.
1934
-
1935
- **Slate-aware metadata proposals** — Metadata publishing can reuse
1936
- `detect_sync_events` slate-clap evidence and, when chat-context sampling is
1937
- available, inspect frames around the clap for high-confidence slate fields before
1938
- proposing `Scene`, `Shot`, `Take`, `Camera #`, and `Roll/Card` writes.
1939
-
1940
- **MCP update visibility** — The installer and both MCP server entrypoints now
1941
- perform a best-effort GitHub release check, cache the result under `logs/`, and
1942
- surface the local MCP version plus last update-check status from
1943
- `resolve_control.get_version`. Checks are informational only and never install
1944
- code automatically.
1945
-
1946
- **Validation**: static/import checks, API parity audit, focused media-analysis,
1947
- sync-event, and update-check unit tests passed. Live validation used DaVinci
1948
- Resolve Studio 20.3.2.9 through the active Resolve script runner with disposable
1949
- projects and synthetic media only. `tests/live_metadata_publish_validation.py`
1950
- verified dry-run previews, confirmed metadata writes, human metadata
1951
- preservation, keyword merging, third-party provenance, and cleanup;
1952
- `tests/live_sync_event_validation.py` revalidated 2-pop/slate-clap detection and
1953
- confirmed marker writes.
1954
-
1955
- ## What's New in v2.20.0
1956
-
1957
- **Sync event detection helper** — `media_analysis.detect_sync_events` detects
1958
- likely audio 2-pops and slate claps with FFprobe/FFmpeg, returns advisory
1959
- frame/timecode positions, and suggests per-file `record_offset` values for
1960
- `media_pool.setup_multicam_timeline(sync_mode="record_frame")`. The helper is
1961
- source-safe and never installs FFmpeg automatically. It also returns marker
1962
- suggestions; `media_analysis.add_sync_event_markers` writes Media Pool item
1963
- markers only when called separately with `confirm=true`.
1964
-
1965
- **Validation**: static/import checks, API parity audit, focused media-analysis
1966
- and multicam unit tests, and `tests/live_sync_event_validation.py` passed. The
1967
- live run used DaVinci Resolve Studio 20.3.2.9, a disposable project, and
1968
- synthetic audio only; it verified detection, confirmation refusal, confirmed
1969
- Media Pool marker writes, and cleanup.
1970
-
1971
- ## What's New in v2.19.0
1972
-
1973
- **Multicam setup support** — `media_pool.setup_multicam_timeline` creates a
1974
- source-safe stacked prep timeline from Media Pool clips, with one angle per video
1975
- track, optional matching audio tracks, and stack-start, manual record-frame, or
1976
- source-timecode planning. Native multicam clip conversion remains a Resolve UI
1977
- step because the public scripting API does not expose a multicam-create method;
1978
- the current UI workflow is documented in the DaVinci Resolve 20 Manual,
1979
- Edit > Chapter 42, "Multicam Editing."
1980
-
1981
- **Documentation**: added `docs/guides/multicam-setup-guide.md` and linked the
1982
- helper from the README, docs index, AI skill reference, kernel coverage, ingest
1983
- kernel, and API coverage notes so it is clearly listed as a helper rather than
1984
- a native API feature.
1985
-
1986
- ## What's New in v2.18.0
1987
-
1988
- **Edit-page title / Text+ text (undocumented keys)** — `timeline.title_property_scan`,
1989
- `timeline.set_title_text`, and `timeline.bulk_set_title_text` use
1990
- `TimelineItem.GetProperty` / `SetProperty` to discover and update generator Text+
1991
- payloads when `GetFusionCompCount()` is zero (no Fusion comp for `fusion_comp`).
1992
- Heuristic key ranking and a minimal styled-text XML fallback are included; callers
1993
- should confirm keys with `title_property_scan` on their Resolve build.
1994
-
1995
- ## What's New in v2.17.1
1996
-
1997
- Operational and client-safety hardening for the v2.17 media-analysis release.
1998
-
1999
- **MCP tool metadata**: compound and granular tools now publish MCP
2000
- `ToolAnnotations` with conservative read-only, destructive, idempotent, and
2001
- external-resource hints. Compound tool annotations are intentionally conservative
2002
- because each tool groups multiple actions behind an `action` parameter.
2003
-
2004
- **MCPSafe report cleanup**: explicitly annotated the granular tools highlighted
2005
- by the public MCPSafe report, including project settings, media import, page
2006
- switching, proxy linking, Gallery album reads, and timeline-item transforms.
2007
-
2008
- **Operational guardrails**: Resolve app-control subprocess fallbacks now use
2009
- bounded timeouts and report non-zero exits. Best-effort Resolve object
2010
- inspection and state probes now log swallowed exceptions at debug level instead
2011
- of failing silently.
2012
-
2013
- **Correctness fix**: fixed the granular
2014
- `media_pool.append_to_timeline(clip_infos=...)` path so it retains the current
2015
- project handle while normalizing positioned appends against the active timeline
2016
- start frame.
2017
-
2018
- **Documentation**: added `SECURITY.md` with the local stdio trust boundary,
2019
- confirmation guidance for destructive tools, source-media safety boundaries, and
2020
- private vulnerability reporting guidance. The README now links the security
2021
- policy and summarizes the local-only auth posture.
2022
-
2023
- **Validation**: static/import checks, API parity audit, compileall, and 161
2024
- focused unit tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9
2025
- with a direct external-scripting smoke test, `tests/live_v233_validation.py`
2026
- passing 10/10 checks, and a v2.17.1 disposable-project
2027
- `media_pool.append_to_timeline(clip_infos=...)` normalization probe passing 2/2
2028
- checks. The v2.17.1 probe used synthetic media only and verified the default
2029
- relative `record_frame` path landed at timeline start frame 86400 + 12 = 86412,
2030
- while `record_frame_mode="absolute"` preserved frame 86484.
2031
-
2032
- ## What's New in v2.17.0
2033
-
2034
- Media analysis and editorial-assist expansion - `media_analysis` now reuses
2035
- existing project reports when cache signatures satisfy the requested analysis
2036
- layers, can review timeline marker contact sheets with chat-context vision, and
2037
- `timeline` adds editor-facing helpers for story-spine reports, declarative
2038
- variant creation, bulk item property writes, multi-item look application,
2039
- thumbnail contact sheets, marker thumbnail review, and audio mix capability
2040
- fallback reporting.
2041
-
2042
- **New `media_analysis` compound tool**: added `capabilities`,
2043
- `install_guidance`, `resolve_output_root`, `plan`, `analyze_file`,
2044
- `analyze_clip`, `analyze_bin`, `analyze_project`, `review_timeline_markers`,
2045
- `summarize`, `get_report`, and `cleanup_artifacts`.
2046
-
2047
- **MCP prompts and visual review**: the compound server now registers
2048
- `davinci_resolve_workflow` and `analyze_media` prompts. `analyze_media` defaults
2049
- to chat-context visual analysis when MCP sampling is available, while
2050
- `timeline_markers.get_thumbnail_image` returns current Resolve frames as MCP
2051
- image content without writing a file.
2052
-
2053
- **Source-safe editorial helpers**: timeline actions now support
2054
- `story_spine_report`, `create_variant_from_ranges`, `bulk_set_item_properties`,
2055
- `apply_look_to_items`, `thumbnail_contact_sheet`, `marker_thumbnail_review`, and
2056
- `audio_mix_capability_report`. Positioned timeline appends normalize
2057
- `record_frame` relative to the active timeline start by default, matching
2058
- Resolve's common 01:00:00:00 start-frame behavior.
2059
-
2060
- **Documentation reorganization**: moved durable references into `docs/guides`,
2061
- `docs/kernels`, `docs/authoring`, `docs/notes`, `docs/process`, and
2062
- `docs/reference`, added a compact docs index, and kept local gameplans/scratch
2063
- artifacts ignored.
2064
-
2065
- **Privacy cleanup**: sanitized tracked live-test fixtures and scripts that had
2066
- workstation-specific source-media paths while leaving public project contact
2067
- information intact.
2068
-
2069
- **Validation**: static/import checks, API parity audit, and 141 focused unit
2070
- tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9 with a
2071
- disposable `_mcp_media_analysis_v2170_probe` project and a generated synthetic
2072
- clip only. The run covered source-adjacent output-root rejection,
2073
- `media_analysis.plan`, session-only `analyze_file`, `story_spine_report`,
2074
- `audio_mix_capability_report`, raw thumbnail retrieval, `thumbnail_contact_sheet`,
2075
- and `review_timeline_markers`; the disposable project and temp artifacts were
2076
- cleaned up.
2077
-
2078
- ## v2.16.0
2079
-
2080
- Extension Authoring kernel expansion - adding lifecycle-aware Fuse, DCTL, ACES
2081
- DCTL, and Resolve-page script probes around the existing authoring tools.
2082
-
2083
- **New `script_plugin` extension actions**: added `extension_capabilities`,
2084
- `probe_fuse_lifecycle`, `probe_dctl_lifecycle`, `probe_script_lifecycle`,
2085
- `safe_install_extension`, `safe_remove_extension`,
2086
- `refresh_or_restart_required`, and `extension_boundary_report`.
2087
-
2088
- **Lifecycle and cleanup guards**: safe extension installs require `_mcp_` names
2089
- and MCP markers by default. Safe removal refuses to delete unmarked files unless
2090
- explicitly overridden. The kernel classifies Fuse and ACES DCTL installs as
2091
- restart-required, regular LUT DCTLs as `refresh_luts`-driven, and Resolve-page
2092
- scripts as menu-refresh-only.
2093
-
2094
- **Documented support map**: added
2095
- [`docs/kernels/extension-authoring-kernel.md`](docs/kernels/extension-authoring-kernel.md) and
2096
- updated the Fuse/DCTL and script authoring docs with live lifecycle findings.
2097
-
2098
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
2099
- MCP-marked `_mcp_` extension files only. Final probe result: 14 supported, 1
2100
- partially supported installed-Lua-script execution boundary, 1 intentional
2101
- unsupported unmarked-source guard, and 0 errors. All generated extension files
2102
- and the disposable project were cleaned up.
2103
-
2104
- ## v2.15.0
2105
-
2106
- Project / Database / Archive kernel expansion - adding disposable project
2107
- lifecycle guards, settings snapshots and write/restore probes, database switch
2108
- dry-runs, preset lifecycle probing, archive safety validation, and project
2109
- boundary reporting.
2110
-
2111
- **New `project_manager` lifecycle actions**: added `project_capabilities`,
2112
- `probe_project_lifecycle`, `probe_project_settings`, `safe_project_create`,
2113
- `safe_project_export`, `safe_project_import`, `safe_project_archive`,
2114
- `safe_project_restore`, `safe_project_delete`, `safe_set_project_settings`,
2115
- `project_settings_snapshot`, `database_capabilities`,
2116
- `safe_set_current_database`, `preset_lifecycle_probe`, and
2117
- `project_boundary_report`.
2118
-
2119
- **Operational guardrails**: safe project mutation defaults to `_mcp_`
2120
- disposable names and temp paths. Database switching dry-runs by default because
2121
- Resolve closes open projects when changing databases. Archive source media,
2122
- render cache, and proxy media flags are rejected unless explicitly opted in.
2123
-
2124
- **Documented support map**: added
2125
- [`docs/kernels/project-lifecycle-kernel.md`](docs/kernels/project-lifecycle-kernel.md) with
2126
- project CRUD, DRP import/export, archive/restore, folder, settings, database,
2127
- layout preset, render preset, page, keyframe, and cloud-infrastructure
2128
- boundaries.
2129
-
2130
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
2131
- disposable `_mcp_` projects only. Final probe result: 35 supported, 5 partially
2132
- supported lifecycle/archive/keyframe/render-preset boundaries, 1 intentional
2133
- unsupported archive media-flag guard, 1 not-applicable archive restore boundary,
2134
- and 0 errors. Disposable projects, layout presets, and temp work files were
2135
- cleaned up.
2136
-
2137
- ## v2.14.0
2138
-
2139
- Audio / Fairlight kernel expansion - adding audio track/item probes, source
2140
- audio mapping reports, guarded audio property writes, voice isolation
2141
- capabilities, auto-sync planning, transcription/subtitle probes, and Fairlight
2142
- boundary reporting.
2143
-
2144
- **New `timeline` audio actions**: added `audio_capabilities`,
2145
- `probe_audio_track`, `probe_audio_item`, `safe_set_audio_properties`,
2146
- `voice_isolation_capabilities`, `audio_mapping_report`, `safe_auto_sync_audio`,
2147
- `transcription_capabilities`, `subtitle_generation_probe`, and
2148
- `fairlight_boundary_report`.
2149
-
2150
- **Audio state and mapping**: the kernel snapshots audio track state, timeline
2151
- item audio properties, source audio channel mapping, MediaPoolItem audio
2152
- mapping, and track/item voice isolation availability.
2153
-
2154
- **Guarded AI and sync surfaces**: auto-sync dry-runs by default and normalizes
2155
- Resolve audio-sync constants. Subtitle generation dry-runs unless
2156
- `allow_generate=True`; transcription capability reporting is read-only by
2157
- default.
2158
-
2159
- **Documented support map**: added
2160
- [`docs/kernels/audio-fairlight-kernel.md`](docs/kernels/audio-fairlight-kernel.md) with
2161
- track/item state, voice isolation, mapping, transcription, subtitle, auto-sync,
2162
- and Fairlight insertion boundaries.
2163
-
2164
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
2165
- generated synthetic video and audio-only media. Final probe result: 13
2166
- supported, 3 partially supported audio property/auto-sync/audio-insert
2167
- boundaries, and 0 errors. The disposable project and generated media were
2168
- cleaned up.
2169
-
2170
- ## v2.13.0
2171
-
2172
- Timeline Conform / Interchange kernel expansion - adding timeline structure
2173
- snapshots, source range reporting, gap/overlap detection, guarded interchange
2174
- export/import, round-trip comparison, missing-media detection, and relink
2175
- planning around Resolve's public timeline APIs.
2176
-
2177
- **New `timeline` conform actions**: added `conform_capabilities`,
2178
- `probe_timeline_structure`, `detect_gaps_overlaps`, `source_range_report`,
2179
- `export_timeline_checked`, `import_timeline_checked`, `compare_timelines`,
2180
- `probe_interchange_roundtrip`, `detect_missing_media`, `build_relink_plan`,
2181
- and `conform_boundary_report`.
2182
-
2183
- **Interchange probing**: export aliases now cover FCPXML, DRT, EDL, AAF, OTIO,
2184
- FCP 7 XML, and EDL subtype variants. FCPXML directory-style exports are
2185
- normalized with a `primary_file` path for import.
2186
-
2187
- **Conform analysis**: the kernel reports track/item structure, same-track gaps
2188
- and overlaps, source ranges with handles, missing/offline media, and relink
2189
- candidates without mutating user source media.
2190
-
2191
- **Documented support map**: added
2192
- [`docs/kernels/timeline-conform-interchange-kernel.md`](docs/kernels/timeline-conform-interchange-kernel.md)
2193
- with export, round-trip, missing-media, relink planning, and format-survival
2194
- boundaries.
2195
-
2196
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
2197
- generated synthetic gapped timeline. Final probe result: 17 supported, 1
2198
- partially supported FCPXML round-trip survivability boundary, and 0 errors. The
2199
- disposable project, generated media, and imported round-trip timelines were
2200
- cleaned up.
2201
-
2202
- ## v2.12.0
2203
-
2204
- Fusion Composition kernel expansion - adding safe Fusion graph inspection,
2205
- tool creation, input writes, connection validation, scoped bulk writes, and
2206
- boundary reporting around Resolve's public Fusion comp API.
2207
-
2208
- **New `fusion_comp` kernel actions**: added `fusion_graph_capabilities`,
2209
- `probe_fusion_comp`, `probe_fusion_tool`, `safe_add_tool`, `safe_set_inputs`,
2210
- `safe_connect_tools`, and `fusion_boundary_report`.
2211
-
2212
- **Timeline item graph automation**: the kernel can target timeline item Fusion
2213
- comps via `timeline_item`, `clip_id`, or `timeline_item_id`, then add tools,
2214
- write inputs with readback, inspect ports, connect tools, set frame ranges, and
2215
- export the comp through `timeline_item_fusion`.
2216
-
2217
- **Scoped bulk writes**: `bulk_set_inputs` remains the safe batch path for
2218
- applying input updates across multiple explicitly scoped timeline-item comps,
2219
- so agent workflows do not accidentally mutate the active Fusion page comp.
2220
-
2221
- **Documented support map**: added
2222
- [`docs/kernels/fusion-composition-kernel.md`](docs/kernels/fusion-composition-kernel.md) with
2223
- tool availability, input/output, scope, comp export, and page-state boundaries.
2224
-
2225
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
2226
- generated synthetic timeline item Fusion comp. Final probe result: 18
2227
- supported, 0 unsupported, 0 partially supported, and 0 errors. The disposable
2228
- project, generated media, and exported temp comp were cleaned up.
2229
-
2230
- ## v2.11.0
2231
-
2232
- Color / Grade kernel expansion - adding safe grade inspection, CDL validation,
2233
- node graph probing, grade copy, LUT export, version restore, Gallery, and color
2234
- group boundary reporting around Resolve's public Color API.
2235
-
2236
- **New `timeline_item_color` kernel actions**: added `grade_capabilities`,
2237
- `probe_grade_item`, `probe_node_graph`, `safe_set_cdl`, `safe_copy_grade`,
2238
- `safe_apply_drx`, `safe_export_lut`, `grade_version_snapshot`,
2239
- `grade_version_restore`, `color_group_capabilities`, `gallery_capabilities`,
2240
- and `grade_boundary_report`.
2241
-
2242
- **Grade and graph probing**: the kernel snapshots item grade versions, graph
2243
- availability, node counts, node LUT/cache/label/tools metadata, color-group
2244
- assignment, and cache state without guessing at opaque node internals.
2245
-
2246
- **Safe mutation helpers**: CDL payloads are validated and normalized before
2247
- `SetCDL`; grade copy resolves target timeline item IDs first; LUT export is
2248
- guarded to temp paths by default; DRX apply requires an existing DRX path and
2249
- documents that it replaces the target graph.
2250
-
2251
- **Color groups and Gallery**: color-group capability probes cover project
2252
- groups plus pre/post graph availability. Gallery capability probes report album
2253
- state and classify still export as UI/page dependent when Resolve returns false.
2254
-
2255
- **Documented support map**: added
2256
- [`docs/kernels/color-grade-kernel.md`](docs/kernels/color-grade-kernel.md) with graph, LUT, DRX,
2257
- version, Gallery, color-group, and AI-tool boundaries.
2258
-
2259
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
2260
- generated synthetic color-bar timeline. Final probe result: 25 supported, 2
2261
- version/page-dependent Gallery/DRX export boundaries, 1 not-applicable DRX apply
2262
- path because no DRX could be produced in that run, and 0 errors. The disposable
2263
- project, generated media, and temp LUT exports were cleaned up.
2264
-
2265
- ## v2.10.0
2266
-
2267
- Review Annotation kernel expansion - adding a unified marker, custom data,
2268
- flag, clip color, copy/move, and review report layer across timeline, timeline
2269
- item, and media pool item scopes.
2270
-
2271
- **New `timeline_markers` kernel actions**: added
2272
- `annotation_capabilities`, `probe_annotations`, `normalize_marker_payload`,
2273
- `copy_annotations`, `move_annotations`, `sync_marker_custom_data`,
2274
- `clear_annotations_by_scope`, `export_review_report`, and
2275
- `annotation_boundary_report`.
2276
-
2277
- **Unified annotation scopes**: the new helpers normalize marker payloads,
2278
- frame/timecode aliases, custom data aliases, and marker colors before touching
2279
- Resolve. `probe_annotations` snapshots timeline, current timeline item, and
2280
- media pool item annotations when the current playhead can resolve them.
2281
-
2282
- **Review metadata copying**: `copy_annotations` and `move_annotations` can copy
2283
- marker payloads between timeline, timeline item, and media pool item scopes
2284
- using direct frame numbers. When supported by both scopes, flags and clip color
2285
- can travel with the marker payload.
2286
-
2287
- **Read-only review reports**: `export_review_report` and
2288
- `annotation_boundary_report` produce agent-friendly summaries without mutating
2289
- media or projects.
2290
-
2291
- **Documented support map**: added
2292
- [`docs/kernels/review-annotation-kernel.md`](docs/kernels/review-annotation-kernel.md) with the
2293
- scope matrix, field support, frame-space caveats, and live probe findings.
2294
-
2295
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
2296
- generated synthetic timeline. Final probe result: 44 supported, 1 expected
2297
- unsupported invalid-color boundary, and 0 errors. The disposable project and
2298
- generated media were cleaned up after report generation.
2299
-
2300
- ## v2.9.0
2301
-
2302
- Render / Deliver kernel expansion — adding a safer render planning, settings,
2303
- format/codec compatibility, queue lifecycle, and Quick Export boundary layer.
2304
-
2305
- **New `render` kernel actions**: added `render_capabilities`,
2306
- `probe_render_matrix`, `probe_render_settings`, `validate_render_settings`,
2307
- `safe_set_render_settings`, `prepare_render_job`,
2308
- `render_job_lifecycle_probe`, `quick_export_capabilities`,
2309
- `safe_quick_export`, and `export_render_boundary_report`.
2310
-
2311
- **Render compatibility matrix**: `probe_render_matrix` walks available render
2312
- formats, codecs, and resolutions so agents can choose what this specific
2313
- Resolve install can actually deliver.
2314
-
2315
- **Job-safe rendering helpers**: render settings validation now checks documented
2316
- setting keys, value types, frame ranges, and temp-target requirements.
2317
- `prepare_render_job` creates queued jobs without starting renders, while
2318
- `render_job_lifecycle_probe` validates add/status/delete behavior safely.
2319
-
2320
- **Guarded Quick Export**: `safe_quick_export` validates temp targets, forces
2321
- `EnableUpload=False`, and requires `allow_render=True` before it can actually
2322
- start Quick Export.
2323
-
2324
- **Documented support map**: added
2325
- [`docs/kernels/render-deliver-kernel.md`](docs/kernels/render-deliver-kernel.md) with
2326
- format/codec, settings, render job, and Quick Export boundaries.
2327
-
2328
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
2329
- two-second generated synthetic timeline. Final probe result: 23 supported, 1
2330
- version/page-dependent `GetRenderSettings` readback boundary, and 0 errors. The
2331
- probe rendered one tiny synthetic output, then cleaned up the disposable project
2332
- and generated files.
2333
-
2334
- ## v2.8.0
2335
-
2336
- Media Pool / Ingest kernel expansion — applying the timeline edit kernel probe
2337
- pattern to import, organization, metadata, annotation, and media-link boundary
2338
- workflows while preserving source media integrity.
2339
-
2340
- **New `media_pool` kernel actions**: added `ingest_capabilities`,
2341
- `probe_media_pool`, `probe_ingest_item`, `safe_import_media`,
2342
- `safe_import_sequence`, `safe_import_folder`, `organize_clips`,
2343
- `copy_metadata`, `normalize_metadata`, `probe_clip_properties`,
2344
- `safe_relink`, `safe_unlink`, `link_proxy_checked`,
2345
- `link_full_resolution_checked`, `set_clip_marks`, `clear_clip_marks`,
2346
- `copy_clip_annotations`, and `media_pool_boundary_report`.
2347
-
2348
- **Safe ingest and organization**: safe import helpers validate paths, sequence
2349
- patterns, frame ranges, and optional target folders before calling Resolve.
2350
- `organize_clips` can move clips to existing folders or create missing folder
2351
- paths explicitly. All helpers support dry-run where useful for planning.
2352
-
2353
- **Metadata and annotation workflows**: bulk metadata normalization, metadata
2354
- copying, clip property probes, mark in/out bulk operations, and annotation copy
2355
- now have agent-friendly wrappers over Resolve's lower-level clip APIs.
2356
-
2357
- **Documented support map**: added
2358
- [`docs/kernels/media-pool-ingest-kernel.md`](docs/kernels/media-pool-ingest-kernel.md) so
2359
- agents and users can inspect the supported, partial, unsupported, and
2360
- version/page-dependent ingest boundaries directly.
2361
-
2362
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
2363
- generated synthetic video, audio, still, image sequence, and non-media
2364
- fixtures. Final probe result: 56 supported, 1 expected unsupported non-media
2365
- text import, and 0 errors. The disposable project and generated media were
2366
- cleaned up after report generation.
2367
-
2368
- ## v2.7.0
2369
-
2370
- Timeline edit kernel expansion — turning the v2.6.0 duplicate helper into a
2371
- broader, live-probed edit layer for clip duplication, linked audio, range edits,
2372
- state copying, and capability reporting while preserving source media integrity.
2373
-
2374
- **Expanded `timeline.duplicate_clips` action**: duplication now supports
2375
- `selected=True`, explicit `record_frame`, `track_offset`, and placement modes
2376
- `same_time`, `offset`, `at_playhead`, `track_above`, `after_source`, and
2377
- `next_gap`. `include_linked=True` duplicates linked audio and restores the
2378
- video/audio link state. `copy_clips` is an alias for duplication, and
2379
- `move_clips` duplicates successfully first before deleting the original source
2380
- items.
2381
-
2382
- **Timeline range operations**: added `copy_range`, `duplicate_range`,
2383
- `overwrite_range`, and `lift_range`. Range copies rebuild exact source segments
2384
- with positioned append operations. `overwrite_range` deletes whole destination
2385
- overlaps before appending. `lift_range` safely deletes whole matching items and
2386
- requires explicit `allow_partial_item_delete=True` for whole-item deletion when
2387
- a requested range only partially overlaps an item.
2388
-
2389
- **State copying groups**: duplicate/copy operations can now copy transform,
2390
- crop, composite, audio, retime, dynamic zoom, scaling, stabilization, clip
2391
- color, markers, flags, enabled state, cache, voice isolation, Fusion comps,
2392
- grades, takes, and keyframes where Resolve exposes readable/writable item APIs.
2393
- Transition cloning is accepted as a requested group but reported unsupported
2394
- because Resolve's public scripting API does not expose transition cloning.
2395
-
2396
- **Capability and boundary probes**: added `timeline.edit_kernel_capabilities`
2397
- for a maintained support map and `timeline.probe_edit_kernel_item` for read-only
2398
- inspection of item methods, properties, keyframes, and linked items. Added
2399
- `src/utils/timeline_kernel_live_probe.py` plus offline report/parser tests so
2400
- future work can expand the technical boundary without guessing.
2401
-
2402
- **Documented limits**: added
2403
- [`docs/kernels/timeline-edit-kernel.md`](docs/kernels/timeline-edit-kernel.md), which records
2404
- the supported, partially supported, unsupported, and version/page-dependent
2405
- surfaces. Known public-API boundaries include transition cloning, direct
2406
- razor/split edits, true partial lifts, source-less item append cloning, and
2407
- opaque speed-ramp internals.
2408
-
2409
- **Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
2410
- disposable projects and synthetic media. Final exhaustive probe result:
2411
- 255 supported, 4 partially supported, 138 unsupported, 4 version/page
2412
- dependent, and 0 errors. Static/unit checks include `tests/test_import.py`,
2413
- `scripts/audit_api_parity.py`, `git diff --check`, the focused timeline/helper
2414
- unit suite, and the full live duplicate/range/probe harness.
2415
-
2416
- ## v2.6.0
2417
-
2418
- Timeline clip duplication — adding an Alt-drag-style helper for duplicating
2419
- existing video timeline items without creating proxy media, renders, or source
2420
- derivatives.
2421
-
2422
- **New `timeline.duplicate_clips` action**: `timeline(action="duplicate_clips")`
2423
- duplicates video timeline items by re-appending the same Media Pool item with
2424
- the same source trim via `MediaPool.AppendToTimeline([{clipInfo}])`. It accepts
2425
- timeline item IDs from `timeline.get_items`, an optional
2426
- `target_track_index`, and `record_frame_offset`; each result reports per-clip
2427
- success and the duplicated timeline item ID when Resolve exposes or recovers it.
2428
-
2429
- **Resolve append-result hardening**: duplicate results now tolerate thin
2430
- `AppendToTimeline` return objects that lack readable `GetUniqueId()` or
2431
- `GetName()` methods, then scan the target video track to recover the real item
2432
- handle. Bad inputs now return clean per-clip errors for non-video items,
2433
- invalid offsets, and nonexistent target tracks.
2434
-
2435
- **Live-tested source trim semantics**: validation against Resolve Studio
2436
- 20.3.2.9 confirmed that positioned `AppendToTimeline` treats `endFrame` as an
2437
- exclusive source boundary in this workflow. `duplicate_clips` now uses
2438
- `TimelineItem.GetDuration()` and `GetSourceStartFrame()` where available, so
2439
- the duplicate preserves the original duration and source start.
2440
-
2441
- **Validation**: added `tests/live_duplicate_clips_validation.py`, which creates
2442
- a disposable project, imports synthetic media, places a trimmed clip, duplicates
2443
- it to another track, verifies record frame/duration/source trim/media identity,
2444
- checks the invalid-track error path, and deletes the project. Focused unit
2445
- coverage now includes anonymous append objects, source-start preference,
2446
- video-only `mediaType`, and target-track ID recovery.
2447
-
2448
- ## v2.5.0
2449
-
2450
- Three new compound tools for *authoring and conversationally executing* Resolve extensions: Fusion Fuse plugins, DCTL color transforms, and Resolve-page Lua/Python scripts. Plus a documentation pass on six adjacent Resolve extension systems.
2451
-
2452
- **New `fuse_plugin` tool**: generate, install, list, read, remove, and validate Fusion Fuse plugins (`.fuse`). **18 template kinds** spanning color (`color_matrix`, `per_pixel`, `channel_op`), geometric (`transform`, `spatial_warp`), text/shapes (`text_overlay`, `shape_generator`), source/temporal (`source_generator`, `time_displace`), filters (`builtin_blur`, `builtin_resize`, `variable_blur` SAT-based), modifiers (`modifier`, `point_modifier`), display shaders (`view_lut`, `dctl_kernel`), and reference (`controls_demo`, `notifychanged_demo`). Each generator produces ready-to-install Lua (or Lua + GLSL / Lua + DCTL) source that passes `luac -p` syntax checks across all option branches. **Live-verified in DaVinci Resolve Studio 20.3.2.9**: generated Fuses register on Resolve restart and instantiate via `comp:AddTool`; the `text_overlay` template was confirmed rendering glyphs into the viewer. The `view_lut` template supports `float`, `vec2`, `vec3_rgb`, and `vec4_rgba` shader parameter types. Includes a path-bug fix: corrected install path on macOS to `Fusion/Fuses/` (the SDK doc lists `Support/Fusion/Fuses/`, but Fusion's own `MapPath("Fuses:")` returns the path without `/Support/`).
2453
-
2454
- **New `dctl` tool**: generate, install, list, read, remove, and validate DCTL color-transform files plus ACES IDT/ODT transforms. **8 template kinds** — `transform`, `transform_alpha` (Resolve 19.1+ alpha modes), `transition` (with `TRANSITION_PROGRESS`), `matrix` (3x3 color matrix), `kernel` (TODO stub), `lut_apply` (wraps an external `.cube` LUT via `DEFINE_LUT`/`APPLY_LUT`), `aces_idt`, `aces_odt`. UI-parameter syntax covers all six DCTL UI types (slider float/int, value box, checkbox, combo, color picker) with optional tooltips. Per-template `suggested_category` so callers know whether to install to the regular LUT directory or the separate ACES Transforms tree. Subdir support with strict path-traversal guards. Validator catches missing entry points, brace imbalance, and float literals missing the required `f` suffix. Regular DCTLs pick up via `project_settings(action='refresh_luts')`; ACES DCTLs require a Resolve restart.
2455
-
2456
- **New `script_plugin` tool — conversational Lua/Python execution**: generate, install, and **execute** Resolve-page scripts that appear in the Workspace → Scripts menu. Two template kinds: `scaffold` (minimal stub) and `media_rules` (a comprehensive rules-and-variables DSL with sources, extract patterns, transforms, targets, actions, conditions, dry-run mode, external CSV/JSON data with exact/regex/fuzzy matching, and per-rule metadata — ~22k chars Lua engine and ~18k chars Python engine, both first-class). **Two new actions close the conversational loop**: `run_inline(source, language)` runs an ad-hoc Lua/Python snippet inside Resolve and streams stdout + return value back into the conversation; `execute(name, category, language)` runs an installed script the same way. Python uses subprocess with full stdout/stderr capture; Lua uses `fusion.RunScript()` against a temp file with completion-sentinel polling and `app:SetData()` bridge for return values (Resolve 20.x's `fusion.Execute()` is a no-op from the Python bridge — that quirk is encoded in the implementation). **Live-verified end-to-end** on Resolve Studio 20.3.2.9: Python `run_inline` returned project list and walked media pool; Lua `run_inline` enumerated `MapPath` symbols with stdout AND return value captured.
2457
-
2458
- **`list_templates` action** on all three new tools enumerates available kinds.
2459
-
2460
- **Resolve developer-package reference consolidation**: extension-system notes
2461
- were consolidated back into README/SKILL guidance, while dedicated authoring
2462
- docs remain in `docs/authoring/fuse-dctl-authoring.md` and
2463
- `docs/authoring/script-plugin-authoring.md`.
2464
-
2465
- **Test coverage**: 185 offline tests across 7 modules (`test_fuse_dctl_authoring.py` and `test_script_plugin.py` both new in this release), all green in <2s. Includes hermetic round-trip tests with mocked install paths, DSL-coverage tests confirming every documented source/action/target/transform is in both Lua and Python engines, and Python subprocess execution tests with real captured stdout/stderr.
2466
-
2467
- **Compound tool count: 27 → 30**. Granular tool count unchanged at 328.
2468
-
2469
- ## v2.4.1
2470
-
2471
- Release process hardening — documenting the version bump, validation, tag, and GitHub Release checklist.
2472
-
2473
- **Release checklist documented**: added `docs/process/release-process.md` with semantic version guidance, required version surfaces, validation requirements, tag/release commands, and release-note template.
2474
-
2475
- **Live-test requirement clarified**: Resolve behavior changes must be validated live with disposable projects and synthetic media before release. Docs-only releases do not require a live Resolve run when no behavior changed.
2476
-
2477
- ## v2.4.0
2478
-
2479
- Timeline source range extraction — adding a compound workflow helper for frame-pull and conform preparation.
2480
-
2481
- **New `timeline.extract_source_frame_ranges` action**: `timeline(action="extract_source_frame_ranges")` scans every video clip on the current timeline and returns per-source frame ranges, clip occurrences, timeline positions, source offsets, applied handles, and timeline item IDs. Clip names prefer the basename from the Media Pool `File Path`, with audio extensions skipped by default.
2482
-
2483
- **Handle-aware source ranges**: fixed handles default to 24 frames. Passing `handles=0` switches to gap-only auto handles, using neighboring timeline gaps up to `gap_max` frames. Returned `source_range_final` and `frame_ranges` endpoints are inclusive/inclusive for downstream extraction tools.
2484
-
2485
- **Inclusive endpoint fix**: live validation caught and fixed the off-by-one where Resolve's exclusive source boundary was being returned as an inclusive final frame. A 48-frame synthetic clip with `handles=0` now returns `source_used_inclusive_end=47` and `source_range_final=[0, 47]`.
2486
-
2487
- **Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic media. Added unit coverage in `tests/test_extract_source_frame_ranges.py` for zero-handle and fixed-handle ranges.
2488
-
2489
- ## v2.3.4
2490
-
2491
- Marker API hardening for Issue #34 — making the compound marker tools match the parameter shapes agents and users naturally send.
2492
-
2493
- **Marker parameter aliases fixed**: `timeline_markers`, `media_pool_item_markers`, and `timeline_item_markers` now accept `frame`, `frame_id`, and `frameId` consistently for add/get/update/delete operations. Marker lookup and delete paths also accept `customData` as an alias for `custom_data`.
2494
-
2495
- **Timeline marker ergonomics improved**: `timeline_markers(action="add")` can now add at the current playhead when no frame/timecode is provided, and also accepts explicit `timecode` input. Optional marker fields now have sensible defaults (`color="Blue"`, `name` from note or `"Marker"`, `note=""`, `duration=1`).
2496
-
2497
- **Resolve overload fallback**: marker creation first uses the documented six-argument `AddMarker(..., customData)` call, and falls back to the five-argument form when `customData` is empty and a Resolve build rejects the optional parameter.
2498
-
2499
- **Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 with `tests/live_marker_validation.py`. The harness creates a disposable project, imports synthetic media, inserts a visible timeline generator, and live-tests timeline, media-pool-item, and timeline-item marker add/get/update/delete alias paths. A `--keep-open` mode leaves a marked timeline open for visual inspection.
2500
-
2501
- ## v2.3.3
2502
-
2503
- Granular layer hardening — closing exposure gaps and dropped-dict-key bugs surfaced by an exhaustive parity audit of every documented Resolve scripting method against both server layers.
2504
-
2505
- **Cloud project helper rewritten** (Critical): `src/utils/cloud_operations.py` was calling `pm.CreateCloudProject(project_name, folder_path)` with positional arguments — but the documented Resolve API signature is `CreateCloudProject({cloudSettings})`, a single dict. Same bug affected `ImportCloudProject` and `RestoreCloudProject`. Helper now builds proper `{cloudSettings}` dicts and exposes all 5 documented keys (`PROJECT_NAME`, `PROJECT_MEDIA_PATH`, `IS_COLLAB`, `SYNC_MODE`, `IS_CAMERA_ACCESS`) per docs lines 576-594. Granular wrappers (`create_cloud_project_tool`, `import_cloud_project_tool`, `restore_cloud_project_tool`) updated to expose the full settings surface; `load_cloud_project_tool` added (was missing entirely from granular).
2506
-
2507
- **Silent-drop bugs fixed** (Critical):
2508
- - **`render_with_quick_export()` (granular)** previously dropped the documented `{param_dict}` (TargetDir, CustomName, VideoQuality, EnableUpload). Now forwards all four keys per docs line 179.
2509
- - **`timeline_create_compound_clip()` (granular)** previously dropped the documented `{clipInfo}` dict (`name`, `startTimecode`). Now exposes both keys per docs line 369.
2510
-
2511
- **Missing granular tools added**:
2512
- - **`append_to_timeline`** — both simple `clip_ids` form and positioned `clip_infos` form (`MediaPool.AppendToTimeline` was completely absent from granular layer; only compound had it).
2513
- - **`auto_sync_audio`** — with proper `{audioSyncSettings}` dict mapping per docs lines 600-614 (`sync_mode`, `channel_number` with `'automatic'`/`'mix'` aliases, `retain_embedded_audio`, `retain_video_metadata`).
2514
- - **`load_cloud_project_tool`** — was missing entirely; compound had it.
2515
- - **`rename_color_group`** — wraps `ColorGroup.SetName` (compound had it via `color_group(action="set_name")` but no granular tool).
2516
-
2517
- **Removed 4 undocumented cloud method wrappers**:
2518
- - `get_cloud_projects` resource → `GetCloudProjectList` not in API docs
2519
- - `export_project_to_cloud_tool` → `ExportToCloud`/`ExportProjectToCloud` not in API docs
2520
- - `add_user_to_cloud_project_tool` → `AddUserToCloudProject` not in API docs
2521
- - `remove_user_from_cloud_project_tool` → `RemoveUserFromCloudProject` not in API docs
2522
-
2523
- **Removed 9 legacy granular gallery tools** that wrapped undocumented or renamed methods (`gallery.GetAlbums()`, `gallery.CreateAlbum()`, `still.GetTimecode()`, `still.IsGrabbed()`, etc.). The proper documented Gallery and GalleryStillAlbum wrappers (lines 743+ of the previous gallery.py — all 14 of those, e.g. `get_gallery_still_albums`, `create_gallery_still_album`, `import_stills_to_album`, `export_stills_from_album`, `get_album_stills`, `set_still_label`) cover the documented API surface and remain. Removed: `get_color_presets`, `save_color_preset`, `apply_color_preset`, `delete_color_preset`, `create_color_preset_album`, `delete_color_preset_album`, `export_lut`, `get_lut_formats`, `export_all_powergrade_luts`.
2524
-
2525
- **Removed 2 granular project optimized-media tools** that wrapped undocumented Resolve methods (`Project.GenerateOptimizedMedia`, `Project.DeleteOptimizedMedia`, `MediaPool.SetClipSelection` — none in API docs). Removed: `generate_optimized_media`, `delete_optimized_media`. Use the Resolve UI for optimized-media generation; `set_optimized_media_mode` (which uses the documented `Project.SetSetting("OptimizedMediaMode", ...)`) is preserved.
2526
-
2527
- **Deprecated method call fixed**: `timeline(action="get_items_in_track")` was calling the deprecated `tl.GetItemsInTrack()` form (docs line 989, marked deprecated) instead of the supported `tl.GetItemListInTrack()` (line 350). Every other call site already used the correct form.
2528
-
2529
- **New: API parity CI guard** at `scripts/audit_api_parity.py`. Parses `docs/reference/resolve_scripting_api.txt` and verifies (1) no `from api.X` broken imports remain, (2) every documented Resolve method appears somewhere in `src/`, (3) wrappers calling undocumented methods are flagged for review. Includes an allowlist for legitimate undocumented-but-real Resolve API surface (Fusion compositing API, UIManager methods like `OpenProjectSettings`/`LoadUILayout`/`SaveUILayout`, internal type-discrimination helpers like `TimelineItem.GetType`/`GetMediaType`). Run with `python3 scripts/audit_api_parity.py` — currently passes all three checks cleanly.
2530
-
2531
- **Tool count: 328 granular tools** (was 354 before v2.3.2; net change since v2.3.1 is −26 broken/duplicate/undocumented tools removed and +4 missing tools added). 20 new unit tests against Resolve stubs covering the cloud settings builder, audio sync settings builder, and AppendToTimeline clipInfo builder. All 41 tests pass without a live Resolve connection.
2532
-
2533
- **Live disposable Resolve validation**: every new and changed v2.3.3 granular tool was exercised against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic temp media via `tests/live_v233_validation.py`. 10/10 checks passed: `append_to_timeline` (simple + positioned + failure path), `auto_sync_audio` (settings dict + invalid input rejection), `import_media` image-sequence form, `timeline_create_compound_clip` (info dict forwarded — compound clip created with explicit name), `rename_color_group` (renamed a real color group), `render_with_quick_export` (params dict forwarded — Resolve's structured `{JobStatus, Error}` response confirms the dict reached it), and the compound-side `GetItemListInTrack` deprecated→supported fix.
2534
-
2535
- ## v2.3.2
2536
-
2537
- API parity sweep — closing documented overloads and dropped parameters that the v2.3.1 audit surfaced.
2538
-
2539
- - **Positioned `CreateTimelineFromClips` via `clip_infos`** — `media_pool(action="create_timeline_from_clips", params={"clip_infos": [...]})` and the granular `create_timeline_from_clips(clip_infos=[...])` now expose the documented `MediaPool.CreateTimelineFromClips(name, [{clipInfo}, ...])` overload (4 keys: `mediaPoolItem`, `startFrame`, `endFrame`, `recordFrame`)
2540
- - **Image-sequence `ImportMedia` via `clip_infos`** — both layers now expose `MediaPool.ImportMedia([{FilePath, StartIndex, EndIndex}, ...])` for DPX/EXR/etc. sequence imports. PascalCase keys preserved per Resolve docs
2541
- - **Positioned `AddItemListToMediaPool` via `item_infos`** — `media_storage(action="import_to_pool", params={"item_infos": [{media, startFrame, endFrame}, ...]})` and granular `add_items_to_media_pool_from_storage(item_infos=[...])` now expose the documented `MediaStorage.AddItemListToMediaPool([{itemInfo}, ...])` overload
2542
- - **`Timeline.AddTrack` dict form** — replaced the legacy bare-string `sub_type` argument with the documented `newTrackOptions` dict (`audio_type`, `index`). Granular `timeline_add_track(track_type, audio_type=, index=)` and compound `timeline(action="add_track", params={"track_type", "options": {audio_type, index}})`
2543
- - **`CreateSubtitlesFromAudio` actually wired up** — granular `timeline_create_subtitles_from_audio` previously advertised `language` and `preset` parameters then silently dropped them. Now maps user strings (e.g. `"korean"`, `"netflix"`, `"double"`) to `resolve.AUTO_CAPTION_*` constants per docs lines 720-761, and exposes the missing `chars_per_line`, `line_break`, `gap` keys
2544
- - **Granular `import_media` no longer crashes** — the granular `import_media` tool was importing from a deleted `api.media_operations` module and would throw `ModuleNotFoundError` on first call. Rewritten to call `MediaPool.ImportMedia` directly and to share the new `clip_infos` overload
2545
- - **`SetRenderSettings` docstring completeness** — granular `set_render_settings` now documents all 27 keys per docs lines 765-799 (previously omitted `EncodingProfile`, `MultiPassEncode`, `AlphaMode`, `NetworkOptimization`, `PixelAspectRatio`, `ClipStartFrame`, `TimelineStartTimecode`, `ReplaceExistingFilesInPlace`)
2546
- - **Removed 18 broken granular tools (+ 7 broken resources)** that imported from a deleted `api.*` namespace and would crash with `ModuleNotFoundError` on first call. All 25 had working equivalents elsewhere or wrapped undocumented Resolve methods. Granular tool count is now **336** (was 354). Migration map for any caller that was hitting them:
2547
- - `delete_media` → `media_pool(action="delete_clips")`
2548
- - `move_media_to_bin` → `media_pool(action="move_clips")`
2549
- - `auto_sync_audio` (granular tool) → `media_pool(action="auto_sync_audio")`
2550
- - `unlink_clips` → `media_pool(action="unlink")`
2551
- - `relink_clips` → `media_pool(action="relink")`
2552
- - `create_bin` → `media_pool(action="add_subfolder")`
2553
- - `list_media_pool_bins` (resource) → `folder(action="get_subfolders")`
2554
- - `get_media_pool_bin_contents` (resource) → `folder(action="get_clips")`
2555
- - `get_timeline_tracks` (resource) → `timeline(action="get_track_count")` + `timeline(action="get_items_in_track")`
2556
- - `create_empty_timeline` → `media_pool(action="create_timeline")`
2557
- - `delete_timeline` → `media_pool(action="delete_timelines")`
2558
- - `add_marker` (granular timeline tool) → `timeline_markers(action="add")`
2559
- - `add_clip_to_timeline` → `media_pool(action="append_to_timeline")`
2560
- - `apply_lut` (granular graph tool) → `graph(action="set_lut")`
2561
- - `copy_grade` → `timeline_item_color(action="copy_grades")`
2562
- - `get_render_presets` (resource) → `render(action="list_presets")`
2563
- - `add_to_render_queue` → `render(action="add_job")`
2564
- - `start_render` (granular project tool) → `render(action="start")`
2565
- - `get_render_queue_status` (resource) → `render(action="list_jobs")` + `render(action="get_job_status")`
2566
- - `clear_render_queue` (granular project tool) → `render(action="delete_all_jobs")`
2567
- - `create_sub_clip`, `get_current_color_node`, `get_color_wheel_params`, `set_color_wheel_param`, `add_node`: removed — these wrapped undocumented Resolve methods that were never exposed in the official scripting API. No replacement exists; use the Resolve UI for now.
2568
-
2569
- ## v2.3.1
2570
-
2571
- - **Positioned `AppendToTimeline` via `clip_infos`** — `media_pool(action="append_to_timeline", params={"clip_infos": [...]})` now exposes the documented `MediaPool.AppendToTimeline([{clipInfo}, ...])` overload, accepting per-entry `clip_id`/`media_pool_item_id`, `start_frame`, `end_frame`, `record_frame`, `track_index`, and optional `media_type`. Each appended item returns its `timeline_item_id` for follow-up Fusion ops
2572
- - **Positioned append failure reporting** — the same call now returns `{"error": ...}` when Resolve fails to produce valid timeline items, including falsey `AppendToTimeline()` results and returned item handles without a timeline item id
2573
- - **Live disposable Resolve validation** — verified the fix against DaVinci Resolve Studio 20.3.2 with synthetic temp media in a disposable project: valid `clip_infos` append returned `success`, `count=1`, and `timeline_item_id`; invalid `clip_infos` calls returned errors
2574
-
2575
- ## v2.3.0
2576
-
2577
- - **Resolve 20.2.2 API sync** — added the 12 scripting methods introduced across Resolve 20.0-20.2.2, with compatibility guards so older Resolve builds return clear "requires Resolve 20.x" errors instead of crashing
2578
- - **Resolve 20 live validation** — revalidated the new API surface against DaVinci Resolve Studio 20.3.2, bringing live-tested coverage to 331/336 methods (98.5%)
2579
- - **Official scripting docs refreshed** — `docs/reference/resolve_scripting_api.txt` now tracks the Resolve 20 scripting README bundled with the installed 20.3.2 developer package
2580
- - **AI skill reference updated** — merged PR #30's `docs/SKILL.md` and updated it for the Resolve 20 method count, granular server, version guards, and source media integrity guidance
2581
- - **Stale Resolve handle recovery** — both server modes now validate cached Resolve handles and reconnect cleanly after Resolve restarts or Project Manager transitions
2582
-
2583
- ## v2.2.0
2584
-
2585
- - **Granular server modularized internally** — `src/resolve_mcp_server.py` is now a thin entrypoint, with the granular implementation split across `src/granular/resolve_control.py`, `project.py`, `timeline.py`, `timeline_item.py`, `media_pool.py`, `folder.py`, `media_pool_item.py`, `gallery.py`, `graph.py`, and `media_storage.py`
2586
- - **Installer now emits env blocks for every generated stdio config** — standard `.mcp.json`, VS Code `.vscode/mcp.json`, Zed `context_servers`, and manual snippets now include `RESOLVE_SCRIPT_API`, `RESOLVE_SCRIPT_LIB`, and `PYTHONPATH`
2587
- - **Windows Resolve 20.3 hardening** — on Windows, the installer also emits `PYTHONHOME` derived from the selected interpreter's base install so Resolve binds against the intended Python instead of a newer globally registered one
2588
- - **Windows stdio transport hardening** — server entrypoints now run FastMCP through strict LF-only stdio wrappers to avoid client disconnects caused by platform newline translation in Windows pipes
2589
- - **`set_cdl` accepts arrays cleanly** — both compound and granular servers now normalize JSON array, tuple, and numeric CDL values into Resolve's required string form like `"1.0 1.0 1.0"`
2590
- - **`fusion_comp` can target timeline item comps** — node graph actions can now operate on a clip's Fusion comp via `clip_id`, `timeline_item_id`, or `timeline_item`, and `bulk_set_inputs` applies scoped input changes across multiple timeline comps
2591
- - **`python src/server.py --full` now stays intact** — the compound entrypoint now correctly launches the granular server instead of importing it and exiting
2592
-
2593
- ## v2.1.0
2594
-
2595
- - **New `fusion_comp` tool** — 20-action tool exposing the full Fusion composition node graph API. Add/delete/find nodes, wire connections, set/get parameters, manage keyframes, control undo grouping, set render ranges, and trigger renders — all on the currently active Fusion page composition
2596
- - **`timeline_item_fusion` cache actions** — added `get_cache_enabled` and `set_cache` actions for Fusion output cache control directly on timeline items
2597
- - **Fusion node graph reference** — docstring includes common tool IDs (Merge, TextPlus, Background, Transform, ColorCorrector, DeltaKeyer, etc.) for discoverability
2598
-
2599
- ## v2.0.9
2600
-
2601
- - **Cross-platform sandbox path redirect** — `_resolve_safe_dir()` now handles macOS (`/var/folders`, `/private/var`), Linux (`/tmp`, `/var/tmp`), and Windows (`AppData\Local\Temp`) sandbox paths that Resolve can't write to. Redirects to `~/Documents/resolve-stills` instead of Desktop
2602
- - **Auto-cleanup for `grab_and_export`** — exported files are read into the response (DRX as inline text, images as base64) then deleted from disk automatically. Zero file accumulation. Pass `cleanup: false` to keep files on disk
2603
- - **Both servers in sync** — `server.py` and `resolve_mcp_server.py` now share the same version and both use `_resolve_safe_dir()` for all Resolve-facing temp paths (project export, LUT export, still export)
2604
-
2605
- ## v2.0.8
2606
-
2607
- - **New `grab_and_export` action on `gallery_stills`** — combines `GrabStill()` + `ExportStills()` in a single atomic call, keeping the live GalleryStill reference for reliable export. Returns a file manifest with exported image + companion `.drx` grade file
2608
- - **Format fallback chain** — if the requested format fails, automatically retries with tif then dpx
2609
- - **macOS sandbox path redirect** — `/var/folders` and `/private/var` paths are redirected to `~/Desktop/resolve-stills` since Resolve's process can't write to sandboxed temp directories
2610
- - **Key finding documented** — `ExportStills` requires the Gallery panel to be visible on the Color page. All 9 supported formats (dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx) produce a companion `.drx` grade file alongside the image
2611
-
2612
- ## v2.0.7
2613
-
2614
- - **Security: path traversal protection for layout preset tools** — `export_layout_preset`, `import_layout_preset`, and `delete_layout_preset` now validate that resolved file paths stay within the expected Resolve presets directory, preventing path traversal via crafted preset names
2615
- - **Security: document destructive tool risk** — added Security Considerations section noting that `quit_app`/`restart_app` tools can terminate Resolve; MCP clients should require user confirmation before invoking
2616
-
2617
- ## v2.0.6
2618
-
2619
- - **Fix color group operations crash** — `timeline_item_color` unpacked `_check()` as `(proj, _, _)` but `_check()` returns `(pm, proj, err)`, so `proj` got the ProjectManager instead of the Project, crashing `assign_color_group` and `remove_from_color_group`
2620
-
2621
- ## v2.0.5
2622
-
2623
- - **Lazy connection recovery** — full server (`--full` mode) now auto-reconnects and auto-launches Resolve, matching the compound server behavior
2624
- - **Null guards on all chained API calls** — `GetProjectManager()`, `GetCurrentProject()`, `GetCurrentTimeline()` failures now return clear errors instead of `NoneType` crashes
2625
- - **Helper functions** — `get_resolve()`, `get_project_manager()`, `get_current_project()` replace 178 boilerplate blocks
2626
-
2627
- ## v2.0.4
2628
-
2629
- - **Fix apply_grade_from_drx parameter** — renamed `mode` to `grade_mode` to match Resolve API; corrected documentation from replace/append to actual keyframe alignment modes (0=No keyframes, 1=Source Timecode aligned, 2=Start Frames aligned)
2630
- - **Backward compatible** — still accepts `mode` for existing clients, `grade_mode` takes precedence
2631
-
2632
- ## v2.0.3
2633
-
2634
- - **Fix GetNodeGraph crash** — `GetNodeGraph(0)` returns `False` in Resolve; now calls without args unless `layer_index` is explicitly provided
2635
- - **Falsy node graph check** — guard checks `not g` instead of `g is None` to catch `False` returns
2636
-
2637
- ## v2.0.2
2638
-
2639
- - **Antigravity support** — Google's agentic AI coding assistant added as 10th MCP client
2640
- - **Alphabetical client ordering** — MCP_CLIENTS list sorted for easier maintenance
2641
-
2642
- ## v2.0.1
2643
-
2644
- - **26-tool compound server** — all 324 API methods grouped into 26 context-efficient tools (default)
2645
- - **Universal installer** — single `python install.py` for macOS/Windows/Linux, 10 MCP clients
2646
- - **Dedicated timeline_item actions** — retime/speed, transform, crop, composite, audio, keyframes with validation
2647
- - **Lazy Resolve connection** — server starts instantly, connects when first tool is called
2648
- - **Bug fixes** — CreateMagicMask param type, GetCurrentClipThumbnailImage args, Python 3.13+ warning