fix(native): recover unattended sync helper setup

Changes requested
FA
18h ago
+2544-318

Summary

Builds on main's explicit-Enable registration policy. #682 is stacked on this branch and will be restacked after this lands. Linear: ENG-1447.

Helper registration can look like a persistent failure while macOS is still settling, or lose a newer failure during concurrent checks. Approval, setup progress, active-sync waits, manual remediation and failure now have distinct phases and matching actions, and removal has its own copy. Retry repeats the stored decision: a stored Enable retries as an explicit Enable, a stored Disable retries the removal, and an unset decision is handled like an observation. Observation never registers a missing helper. Busy observations preserve the last meaningful status, and a report from before a newer action is skipped rather than published.

Registration errors keep their diagnostic detail, including when macOS reports Enabled but helper verification then fails. Helper action messages follow the live permission row, and Retry failures from the panel and the repair banner report through the HELPER_E001 diagnostic. Bundle validation is main's validate_bundled_definition, unchanged. A small cleanup removes a redundant .nixmacignore binding so strict Clippy passes.

The change is two commits: the backend (7ae7c8503) and the UI (4e5f80296). They ship together because the backend alone would show "Try again" copy with no Retry button.

Test Plan

  • On macOS at the current head: cargo test -p nixmac 1,130 passed, 10 ignored; nixmac-helper 77 and nixmac-sync-agent 49 passed. Strict workspace Clippy with all targets and codegen and the rustfmt check passed.
  • TypeScript typecheck passed, including at the backend commit alone. Permissions and repair suites: 53 passed. The full frontend unit suite passes except 3 system-defaults-cta tests that fail identically on main under local Node 25 (localStorage.clear is not a function).
  • Regenerated oRPC and Specta bindings are byte-identical.
  • Signed-app real-helper smoke on macOS not rerun on this head. The pre-rebase branch passed it, but this head changes the registration policy, Retry routing and removal states, so that result does not carry over.
  • CI on this head.

Docs

  • No docs update needed; this repairs existing helper setup and recovery behavior.

šŸ¤– Generated with Claude Code

https://claude.ai/code/session_01GziRseGZMsJ5Yf7EboZLMc