fix(cli): bound engine, daemon and registry waits so a hung dependency cannot freeze the CLI
Integration PR for the bound-* stack. PR #689 was merged into fix/bound-tls-leftovers (merge bb38882f8), whose base was this branch, so this PR delivers #689 plus the remaining TLS/secrets deadline work into fix/bound-shared.
- Carries the CLI deadline work from #689: engine client connect/idle/total budgets, cosign, AgentENV probes, launchctl/docker/podman, release/GitHub clients, git push credential-path neutralisation, and bounded
preloop store migrate. - Carries the TLS/secrets leftovers already on this branch.
- Merged
fix/bound-shared@906bb4b79(main @5fdbde3e7, #687, #691); only conflict wasCHANGELOG.md, resolved by keeping both the Postgres and CLI entries.
Verification is the PR check suite (rust shards, property-tests-fast, Server/Runner light conformance, rust-lint).
Summary by cubic
Binds the CLI's waits on the engine, daemon, and registry so a hung dependency fails the command instead of freezing it.
Previously every outbound call the CLI made had no deadline in some path: an engine that accepted the TCP connection and never answered held preloop status, run, logs, push, and the rest open indefinitely. The engine client now has a 10-second connect deadline, a 10-minute idle-read bound (above the engine's own 5-minute liveness window, so a quiet long job is never cut), and per-call totals of 30 seconds for one-shot control calls, 5 minutes for durable log fetches, and 15 minutes for git-bundle uploads. Streaming paths (logs --follow, the run event feed) deliberately keep no total.
Bounded external calls
- cosign verification, AgentENV egress sudo/systemctl, and debug guest probes now run under deadlines.
launchctlinserver install, docker/podman build operations ininit, the release and manifest GitHub clients, and smolvm/systemctl inupdateare bounded.git pushruns non-interactively under a deadline without breaking the developer's keychain credentials.store migratebounds its Postgres connect across the whole session-setup sequence and replaces the indefinitepg_advisory_lockwait with a boundedpg_try_advisory_lockretry.- Shared TLS roots are installed on the OTLP exporter, GitHub and lint clients verify against in-process roots, and transient push errors are classified by walking the error chain for typed deadline expiry so retries stay bounded.