Skip to content

v2.210.0 — every destructive action carries a real risk rating

Choose a tag to compare

@samuelgursky samuelgursky released this 07 Sep 00:35
· 15 commits to main since this release

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 else branch returns medium with risk_established: false — an honest "no rule matched", but not something a gate can act on, and safe mode blocks only established high/critical. So timeline.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.finalize and the three edit_engine plan 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_clips is a deletion wearing a move's name. It passes delete_sources=True to the duplicate helper, so the originals are removed.
    • timeline_item.update_sidecar is the only registered action that writes outside the project. It rewrites the .braw sidecar or R3D .RMD file next to the camera original. No Resolve undo reaches it, and it changes how that media reads in every other application. Rated high.

    New distribution: 2 critical, 33 high, 35 medium, 38 low.

  • medium now means something. It was overwhelmingly the fallthrough, so an assessed medium and an unrated action were indistinguishable by level alone.

Fixed

  • The operator's saved setup defaults decided what the test suite did. logs/media-analysis-preferences.json holds real defaults including destructive.safe_mode. Tests calling setup already 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_guard now 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_operation and 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.