v2.62.3
A single grading fix — PR #90 by @Mldphotohraphie, extended and hardened. No new tool surface.
Fixed
graph set_lut now applies LUTs/DCTLs installed by the dctl tool.
The dctl tool installs into Resolve's per-user LUT directory, but Graph.SetLUT() resolves LUT paths — relative names and absolute paths — only against the master (system) LUT directory. So a freshly installed LUT could never be applied, and set_lut always returned {"success": false}.
Verified live on Resolve Studio 19.1.3.7 (the originating report, PR #90, observed the same on Studio 21.0.2): SetLUT fails for a user-dir LUT even after RefreshLUTList() and even via an absolute user-dir path — relocation into the master dir is genuinely required.
On a SetLUT failure the server now locates the LUT, stages it under a namespaced MCP/ subfolder of the master LUT dir (avoiding basename collisions with stock/vendor LUTs), calls RefreshLUTList(), and retries with the master-relative path. No behavior change when SetLUT already succeeds.
Applied to both graph set_lut (src/server.py) and the granular graph_set_lut (src/granular/graph.py) via a shared src/utils/lut_paths.py helper, with offline coverage in tests/test_lut_paths.py.
Windows path fix: the PROGRAMDATA fallback was a literal double-backslash path (C:\\ProgramData); corrected to C:\ProgramData.
Full offline suite: 1493 tests passing.