|
2 | 2 |
|
3 | 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 | 4 |
|
| 5 | +## What's New in v2.98.5 |
| 6 | + |
| 7 | +**Every Fusion parameter this server wrote was ignored at render.** A value |
| 8 | +write (`SetInput` / `SetExpression`) wrapped in `Comp.Lock()`/`Unlock()` is |
| 9 | +stored in the graph and reads back correctly — `GetInput` returns it, and so |
| 10 | +did this server's own `get_input` — while the delivered render ignores it |
| 11 | +completely. Found on 2026-08-21 while re-running a Fusion isolation on Studio |
| 12 | +19.1.3.7 to settle a conflicting measurement reported in |
| 13 | +[#156](https://github.com/samuelgursky/davinci-resolve-mcp/pull/156). |
| 14 | + |
| 15 | +Measured on Studio 19.1.3.7 with `MediaIn -> Blur(XBlurSize 20) -> MediaOut` on |
| 16 | +a media-backed clip, rendering the same 48 frames to H.264 each time: |
| 17 | + |
| 18 | +| value written via | render vs no-comp baseline | |
| 19 | +| --- | --- | |
| 20 | +| `fusion_comp set_input` (write inside `Comp.Lock()`) | PSNR **inf** — bit-identical, ignored | |
| 21 | +| the same write, lock removed | PSNR **24.38 dB**, 2.0 MB → 727 KB | |
| 22 | +| raw `tool.XBlurSize = 20.0` | PSNR **24.38 dB** | |
| 23 | +| raw `tool.SetInput("XBlurSize", 20)` | PSNR **24.38 dB** | |
| 24 | + |
| 25 | +The variable was isolated against the comp handle (`AddFusionComp`, |
| 26 | +`GetFusionCompByIndex` and `GetFusionCompByName` all render), the node name, and |
| 27 | +the write form. Only the lock around the write decides it. **Structural** edits |
| 28 | +are unaffected — `AddTool` and `ConnectInput` inside a lock render normally — so |
| 29 | +this is not "Lock is unsafe"; the lock suppresses the parameter-change |
| 30 | +invalidation that a value write depends on. |
| 31 | + |
| 32 | +### Fixed |
| 33 | + |
| 34 | +- **Six value-write sites no longer hold a comp lock across the write:** |
| 35 | + `fusion_comp set_input`, `fusion_comp safe_set_inputs`, `bulk_set_inputs`, |
| 36 | + `bulk_set_expressions`, the Text+ writer behind `set_text`, and |
| 37 | + `add_mask` — where the lock spanned `AddTool` *and* every input write, so a |
| 38 | + mask was created at default size and position and every parameter the caller |
| 39 | + passed did nothing. Structural work keeps its lock; in `add_mask` the lock now |
| 40 | + closes after the node is created and renamed. |
| 41 | + |
| 42 | +### Why this went unnoticed |
| 43 | + |
| 44 | +Every readback the API offers agreed with the value that was written. This is |
| 45 | +the failure mode the repo's own guidance describes — prove a Fusion or grade |
| 46 | +claim with a rendered frame, never with readback — except the cause was ours, |
| 47 | +not Resolve's. It also explains an unknown share of past "the comp was ignored" |
| 48 | +reports, which look identical from the API side. |
| 49 | + |
| 50 | +### Tests |
| 51 | + |
| 52 | +- `tests/live_fusion_value_write_validation.py` — renders a baseline, writes a |
| 53 | + blur size through the compound tool, renders again, and asserts PSNR actually |
| 54 | + moved. Disposable project, synthetic media, restores the previous project. |
| 55 | +- `tests/test_fusion_value_write_lock.py` — AST guard failing any value write |
| 56 | + that sits inside a `Comp.Lock()`/`Unlock()` region, with a self-check that the |
| 57 | + guard can still see a known-bad shape. |
| 58 | + |
| 59 | +Both were mutation-checked against the pre-fix code: reintroducing the lock in |
| 60 | +`set_input` makes the live harness report `PSNR inf -> IGNORED at render` and |
| 61 | +fails the offline guard. |
| 62 | + |
| 63 | +- `api_truth`: new `Composition.Lock` entry; the `AddFusionComp` entry records |
| 64 | + that its 2026-08-02 rooted-comp result **reproduced** on 19.1.3.7 (PSNR 24.38 dB). |
| 65 | + |
5 | 66 | ## What's New in v2.98.4 |
6 | 67 |
|
7 | 68 | **Setup reported success over an install that could never work.** Reported and |
|
0 commit comments