Skip to content

Chief: never ask for approvals; another person's turn is refused at once - #22747

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
feat-cmux-next-chief-no-approvals
Oct 21, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
feat-cmux-next-chief-no-approvals

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

What

Lawrence (2026-10-20): "remove all chief approvals. chief should never have to ask for approvals". He was blocked: his NIGHTLY Chief (df694bd, which already has #22640) still asked "Reply allow or deny" from his phone.

Root cause of the asks he saw: turn 7193 was a resume after a host restart. Resume and item records from older builds had no provenance and failed closed (requires_approval default true), and a resume carries the flag forward, so one old record gated every turn after each restart (every NIGHTLY update restarts the host). remote.autoApprove: true in his settings could not lift it.

  • The owner's turns (this Mac, a paired device, Home) always run with the configured policy. remote.ask, home.ask and remote.autoApprove are removed; old settings files are ignored and the keys dropped at the next write.
  • A turn that carries another person's text still runs with policy ask, but the host refuses every local effect at once: no approval card, no question, no allow/deny chat answers. Children and section 9 subagents spawned under it keep the ask floor and are refused the same way. (Lawrence chose "refuse, never ask" for other people.)
  • The other-person flag is stored as other_person; old requires_approval keys are ignored, so the persistent taint is gone.
  • Review fix (existed before this PR): a kept turn session is reused only by a turn of the same policy (keep_sig includes the policy), so a teammate turn cannot reuse an approve-all session and an owner turn never reuses an ask one.
  • The owner's own subagent failures/reports no longer gate the next turn; a subagent that fails while the spawn floor is up keeps ask.

Takes back #22640: Lawrence removed Chief approvals entirely (this PR removes the opt-in gates and the approval card that #22640 added).

Supersedes the approach of #22639 (approval card in Home): with this change the Chief never posts an approval.

Risk

  • Accepted (documented in README "Remote-origin messages"): a stolen paired phone can act until revoked; Home text and the owner's own subagent reports reach turns with the owner's policy; a pending teammate turn recorded before this upgrade resumes as the owner's once.
  • Kept: another person's text never reaches an approve-all session (steer guard unchanged; kept-session reuse now checks policy).

Verification

rbx (cmux-rust-builder-1, lane chief-no-approvals), crate optchat-chief:

  • cargo fmt --check: pass. cargo clippy --locked --all-targets -- -D warnings: pass.
  • cargo test --locked --no-fail-fast: approval_gates (rewritten, 6 behavior tests at the brain boundary), corpus, crash (fixed by this PR), remote_wake, owner_stop and the rest pass. Two failures are base reds, identical on base 828d367 (lane chief-base-check): daemon_workspaces::a_subagent_workspace_is_located_by_its_public_id_and_session and turn_seal_binding::a_subagent_cannot_reach_owner_controls_on_the_shared_socket.

Observed / Not run

Review: independent subagent correctness review; findings and resolutions in a PR comment.

Changelog

Changed: Chief never asks for approval; another person's requests in a shared Chief are refused instead of asked.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Removes Chief approvals entirely: the Chief never asks a person before it acts, and a turn that carries another person's text is refused at once instead of showing an approval card.

  • Removes remote.ask, home.ask, and remote.autoApprove; old settings files are ignored and the keys are dropped.
  • A turn with another person's text still runs with policy ask, but the host refuses every local effect immediately with no card, no question, and no allow/deny answers.
  • Stores other-person turns as other_person; old requires_approval keys are ignored, so a resumed turn no longer gates every turn after a restart.
  • A kept turn session is reused only by a turn of the same policy.
  • The owner's own subagent failures and reports no longer gate the next turn.

Behavior

Written for commit ed84a32. Summary will update on new commits.

View guided diff Turn on auto-fix

The owner's turns (this Mac, a paired device, Home) always run with the
configured policy: remote.ask, home.ask and remote.autoApprove are gone and
ignored in old settings files. A turn that carries another person's text
still runs with policy ask, but the host refuses its local effects at once
with no approval card and no question; children spawned under it take the
same floor. A startup failure or report of the owner's own subagent no
longer holds the next turn.
…start); store another person's text as other_person
…icy; a subagent failing under the spawn floor keeps ask; stale approval comments
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Correctness review (independent subagent) and resolution

Reviewed 84d6022; fixes are in ed84a32.

  1. HIGH (existed before): a kept turn session was reused with no policy check, so a teammate turn could reuse an approve-all session, and an owner turn could reuse an ask one and hang. Fixed: keep_sig now includes the policy (brain/turns.rs).
  2. MEDIUM: old records with another person's text now read as the owner's, once per upgraded host. Accepted as a one-time risk and documented in the README. Without this, the old flag kept gating Lawrence's own turns after every restart.
  3. MEDIUM-LOW: a subagent from another person's turn that failed to start lost the ask floor. Fixed: sub_failed keeps ask when the spawn floor is up.
  4. LOW: question requests and non-approve-all policies are still left to the harness. Not changed: questions are not approvals, and the Chief runs approve-all by default.
  5. LOW: the ask floor stays up while an ask child or subagent lives. Kept on purpose: this way another person cannot reach the Mac through a subagent.
  6. LOW (existed before): Source::Child reports are not gated. Not changed: agents spawn is retired.

Compile check: no findings. Stale comments the reviewer listed in the crate are fixed. The shared cmux-chief policy and the TypeScript conformance corpus still define remote_auto_approve; optchat-chief no longer reads it.

Tests (rbx): fmt and clippy -D warnings pass. Every optchat-chief test passes except 2 that fail the same way on base 828d367: daemon_workspaces and turn_seal_binding.

@lawrencecchen lawrencecchen added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review ed84a32: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr22747 -f ref=feat-cmux-next-chief-no-approvals -f platform=macos -f backend_mode=local

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Bead cx-l4r0u created for this PR by the cmux coordinator.

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants