v2.210.0 — every destructive action carries a real risk rating
Safe mode shipped in v2.209.0 gating 20 actions. It should have been gating 35.
Changed
-
All 108 registered destructive actions are now classified; 80 were not. The classifier's
elsebranch returnsmediumwithrisk_established: false— an honest "no rule matched", but not something a gate can act on, and safe mode blocks only establishedhigh/critical. Sotimeline.move_clips,timeline.ripple_insert,timeline.create_compound_clip,timeline.import_into_timeline,graph.apply_grade_from_drx,timeline_item_color.copy_grades,timeline_item_takes.finalizeand the threeedit_engineplan executors all passed a gate meant to stop them.Every rating was taken from the action's handler, not its name — the name heuristic being the thing replaced. Two findings worth naming:
timeline.move_clipsis a deletion wearing a move's name. It passesdelete_sources=Trueto the duplicate helper, so the originals are removed.timeline_item.update_sidecaris the only registered action that writes outside the project. It rewrites the.brawsidecar or R3D.RMDfile next to the camera original. No Resolve undo reaches it, and it changes how that media reads in every other application. Ratedhigh.
New distribution: 2 critical, 33 high, 35 medium, 38 low.
-
mediumnow means something. It was overwhelmingly the fallthrough, so an assessedmediumand an unrated action were indistinguishable by level alone.
Fixed
- The operator's saved
setupdefaults decided what the test suite did.logs/media-analysis-preferences.jsonholds real defaults includingdestructive.safe_mode. Tests callingsetupalready overrode the path; the other three thousand read it. With safe mode left enabled on a machine, seventeen tests failed with "Safe mode blocked critical-risk action" — a red suite caused by a setting rather than the code, and indistinguishable from a regression in this very change.tests/offline_guardnow redirects that path for the whole run, alongside the v2.209.1 audit-log redirect.
Added
- A guard test asserting no registered destructive action is unrated, so a new one cannot silently rejoin the ungated set — which is how the 80 accumulated. Registering an action and rating it are now one commit.
- A test pinning that
inspect_operationand the safe-mode gate report the same level for all 108 actions. - A test asserting the guard names the same environment variable the server reads — a mismatch there fails open and silently.
Validation
Suite 3317 → 3319. Live-validated on DaVinci Resolve Studio 19.1.3.7 in a disposable project: create_compound_clip, convert_to_stereo, update_sidecar and execute_tighten are refused with the timeline unchanged; set_track_name, add_track and set_start_timecode still pass; every audit row carries risk_established: true.