feat(activity): E6 · origin kill-switch + home waiting strip (#186) - #195
Merged
Conversation
Wire the pre-built stop_brake widget into the Activity header (E1 left it dead-coded for E6) and finish the two remaining v4 gaps on the Activity/home surfaces: - STOP kill-switch reframed to the shared three-state treatment, driven by whether an agent is live: disabled "No agents running" when idle, amber "Stop all agents" while an agent runs, red "Confirm STOP..." once armed (matches golden ref .killswitch / .killswitch.idle). STOP stays reachable via ⌘K regardless; the zeroize / deny-in-flight logic is untouched. - Activity header is now the quiet uppercase ACTIVITY label + killswitch, with no hero title and no explainer subtitle (golden ref .acthead). - New one-line "Waiting on you" home strip: amber "N waiting for you · Review →" (opens Activity) when requests are pending, else a calm "Nothing waiting for you." (golden ref .waitstrip). The count reuses activity_pending — the same source as the sidebar needs-you badge, so they always agree. One shared Shell::has_active_agent() predicate now backs both the Activity kill-switch and the wallet-home agent-presence "acting/idle" label so they can never contradict (a revoked policy reads not-live on both). brake_state() is a pure, unit-tested mapping (arming beats agent state). Verified: fmt clean · just check green (both configs) · cargo test --workspace green (+ a brake_state precedence test). Codex adversarial review: ACHIEVED, 0 P0/P1 — no trust regression (STOP reachable via ⌘K + the agent surface; the daemon makes revoked&&pending unreachable; no approval path touched). Screenshots PENDING: the E6 views sit behind the unlock gate, which needs a foreground unlock this agent shell can't synthesize (documented macOS limit).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Finishes the two remaining Activity/home gaps in the v4 request-origin epic and wires the
stop_brakewidget E1 left dead-coded for exactly this. The Activity STOP is reframed to the shared three-state kill-switch driven by whether an agent is live (disabled greyNo agents running→ amberStop all agents→ redConfirm STOP…), the Activity header becomes the quiet uppercaseACTIVITYlabel with no hero title/subtitle, and the wallet home gains a one-line "Waiting on you" strip (N waiting for you · Review →amber when pending, elseNothing waiting for you.). One sharedShell::has_active_agent()predicate now backs both the kill-switch and the home agent-presenceacting/idlelabel so they can never contradict, andbrake_state()is a pure, unit-tested mapping. STOP stays reachable via ⌘K from every surface even when the header shows the disabled idle marker, and no approval/zeroize path is touched.Linked issue
Closes #186
Definition of Done
cargo fmt --all --checkis cleanjust checkis green — clippy-D warningson both the default config and--features traycargo test --workspaceis greenCargo.toml/Cargo.lockDESIGN.md(amber = human, cyan = agent; matches thedeckard-v4.htmlgolden ref for.acthead/.killswitch/.waitstrip)Zeroizingand are never logged orDebug-printed (no secret-handling code touched; STOP zeroize logic unchanged)Evidence (paste command output here)
CI: all 5 checks green (linux, macos, quick, cargo-deny-advisories, cargo-deny-supply-chain).
Notes for reviewers
revoke-all(aliases stop/panic/kill/halt/emergency/freeze) firesstop_revoke_allunconditionally from every surface, and the agent surface keeps its own always-live STOP. The idle header marker is disabled presentation only.revoked && pendingunreachable (lock()denies all pending + setsrevokedatomically), so the kill-switch can't falsely read "No agents running" mid-flight. Its one actionable P2 (kill-switch vs agent-presence predicate mismatch) is fixed here via the sharedhas_active_agent().just demo(orjust qa, passphrasedeckard-qa): Home strip empty + pending; Activity header STOP in Idle / Ready (just demo-agent) / Armed.