Repository navigation
Description
[agent] Filed by the scheduled architecture audit (audit-cli-tests). Register: register comment.
Kind: refactor. Register ID: T09.
Problem
lock_cli has a helper for taking .socket/apply.lock, acquire_or_emit, and its module doc says it exists so "call sites stay one line each". Only 5 sites use it: apply, repair, remove, rollback and vendor. Even those 5 pass the same fields by hand, args.common.json, args.common.dry_run and Duration::from_secs(lock_timeout.unwrap_or(0)).
9 more sites open-code the whole sequence instead: acquire_with_status, then lock_failure, then their own rendering. They are vendor ×2, scan/withdrawn, scan/vendor_flow, scan/hosted, scan/gc ×2, agent_download and get. In total Duration::from_secs(*.lock_timeout.unwrap_or(0)) is written 14 times in the CLI.
The copies have drifted:
lock_heldis rendered 3 ways for humans:- lock_cli
format_lock_errorprintsError: Another…plus a hint and(Lock file: <path>). - vendor eject
emit_eject_refusalprintsError (lock_held): another…, with no hint and no path. - scan/vendor_flow.rs L995-L1006 prints
Error (lock_held): ….plusHELD_RETRY_HINT, with no path.
- lock_cli
- scan/hosted writes the human error under
--jsontoo.acquire_hosted_lockalwayseprint!s theError:block, even when it also builds the JSON error envelope.agent_download::report_lock_failureandacquire_or_emitsuppress it under--json. I found this by reading the code; I did not run it. report_lock_failureis in the wrong module. It lives inagent_download.rs, notlock_cli.rs.
Proposed change
- Add
GlobalArgs::lock_timeout() -> Duration. - Replace
acquire_or_emit(dir, cmd, json, dry_run, timeout)withlock_cli::acquire(common: &GlobalArgs, cmd: Command) -> Result<LockGuard, LockFailure>. It renders through one function: human text to stderr unless--json, and the envelope error otherwise. - Move
report_lock_failureintolock_cli. - Route the 9 open-coded sites through
lock_cli::acquire. The vendor-eject and vendor_flow renderers go away. - Inline lock_cli's 4 single-caller helpers:
emit,waiting_message,held_hintandheld_message.
Size
About 12 files under crates/socket-patch-cli/src/commands/, roughly −120 lines.
Acceptance criteria
- Every lock-held and lock-io exit gives the same
errorCode(lock_held/lock_io) and the same exit code as today. The existing lock tests inlock_cli.rsand the CLI lock e2e tests still pass. - Human stderr is identical across commands, and nothing goes to stderr under
--json. Add one test that runsscan --jsonagainst a held lock and asserts that stderr is empty. - Drop the subset tests
acquire_or_emit_succeeds_on_fresh_dirandheld_message_reports_whole_seconds, and fix the doc oferror_envelope_propagates_dry_run_and_command, which claims more than it asserts.
Activity