fix(desktop): register the relocated notification bridge actions with flow lint
Summary
desktop-flow-lint currently fails on main. Two bridge actions were relocated to a new file without adding that file to the contract list the lint reads, so both became invisible and the flow that references them fails.
Cause
d5596a6 ("refactor(macos): relocate journal copy + notification bridge actions to satisfy line-count ratchet") moved settings_notifications_snapshot and set_notification_settings out of DesktopAutomationBridge.swift into DesktopAutomationBridge+Notifications.swift, but left ACTION_SOURCE_RELATIVE_PATHS in desktop/macos/scripts/desktop_flow_contract.py unchanged.
The lint reads registered actions only from that list. notifications-settings.yaml still references both actions, so on current main:
notifications-settings.yaml: unknown bridge action 'settings_notifications_snapshot'
notifications-settings.yaml: unknown bridge action 'set_notification_settings'
desktop-flow-lint: 2 error(s)
This is main-wide rather than branch-specific: every desktop PR that merges current main inherits a red desktop-core-e2e-t0. It went unnoticed because main's own Desktop Backend Contracts runs are sitting at action_required rather than executing, so nothing re-ran the lint after the relocation.
Fix
One line: add the relocated file to ACTION_SOURCE_RELATIVE_PATHS.
That file's own comment states the intent this restores — "Keep the flow lint reader and CI impact resolver on this single list so an added bridge action cannot skip its flow validation route." A relocated action is an added action as far as that list is concerned.
Verification
- Pristine
origin/main(41afef9b) reproduces both errors — this is not introduced by any branch. - With this line:
desktop-flow-lint OK (72 flows, 162 registered actions), up from 161. - Guard proven live: removing the line again reproduces the same 2 errors, so the fix is doing the work rather than the failure having moved.
desktop/macos/tests/test-e2e-flow-coverage.sh— passed..github/scripts/test_pre_push_ci_prediction.py— 22 passed (the other consumer of this contract).
Honest gaps
No new test. The lint itself is the guard, it already runs in the desktop-core-e2e-t0 lane, and it fails correctly when the entry is absent — a test asserting the list contains a specific string would be a static tripwire restating the data, not behavioural coverage.
Failure-Class: none