Skip to content

acpmux: a question answered in the pane counts on another machine under the person's proof (re-cut of #23869, daemon side) - #25424

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
lane/hb-stale-pane-answer-proof
Oct 26, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
lane/hb-stale-pane-answer-proof

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Re-cut of #23869 (by the cosmic-gray lane 01a15bdd, now gone), rebased onto feat-cmux-next. The stale-pr-reconciler gave it to hb-acpmux; Leo, 2026-10-25: "these should never have been this stale for this long". Credit for the work goes to #23869. It is split in two to stay under 800 lines: this PR is the daemon side (acpmux, cmux-tui), and #25440 is the pane side (Swift, web). Each lands on its own: until both are in, an answer relayed from the pane is still refused, the same as today.

Answering an agent's question in the Mac app's chat pane failed for a chat on an ssh peer (Leo hit it live on huge-blue). The peer's acpmux refused it with "approve this on the Mac app: allowing a permission is accepted only from the cmux app".

Cause

A chat on another machine gets its answers over a connection that is never the person, so the peer counts an allow only when it carries the person's decision proof (cx-0q7o). That proof never covered question answers: person_decided and respond_permission refused any proof when answers was present.

Fix

  • acpmux: a new proof, acpmux-person-decision-answers-v1 (hub/person/decision_answers.rs), signs the allow's five parts plus the sha256 of the canonical answers JSON (approvers::answers_digest). When the answer has annotations (Claude Code's chosen preview and notes, Send a question's chosen preview back to Claude Code (annotations) #24356), the sha256 of the canonical annotations is a seventh part.
  • An answer from a connection that is not the person counts only under that proof, so a relay can neither swap the answers nor add annotations. Annotations from such a connection count only on the proof path: never for an ancestor's answer, and never with a phone's signed answer, whose signature covers the answers alone. Each nonce is still spent once, under the prompt's lock.
  • cmux-tui agent-session-permission carries answers and annotations (objects of at most 64 KiB each, annotations only beside answers) to acpmux unchanged (spec/commands.md).

Tests

  • cargo test -p acpmux --test person_allow:
  • cargo test -p cmux-tui-core:
    • a_question_answer_carries_its_answers_and_proof_to_acpmux_unchanged, red at e621126.
    • a_question_answers_annotations_go_to_acpmux_unchanged, red at 9aab5bf.
    • Green at b7ab635.
  • cargo test -p acpmux --test hub_integration questions: 8 of 8 pass. clippy -D warnings is clean, and rustfmt is clean at this head.
  • agent_tools::tests::own_servers_run_under_the_daemon_prefix also fails on base 41e4d6b (run). It is not this PR's.

Review

Codex gpt-6-astra xhigh, through the bare mirror. Round 1 BLOCKed with two findings: the ticket did not bind the answers, and the remote wire dropped annotations. Both are fixed with tests. Round 2 BLOCKed on Unicode equality in the Swift ticket, which is fixed in #25440. Round 2 confirmed the daemon side by inspection. The final verdict at this head is in a comment.

No new timers or observers.

No capture: the change is in the proof and the daemon verb, and nothing in the UI changes.

Changelog

Fixed: Answering an agent's question in a chat on another machine no longer fails with "accepted only from the cmux app" (with #25440).

risk:high: this changes what the person's decision proof covers (auth).

Agent session: big-red
🤖 Generated with Claude Code

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by hb-acpmux on big-red · session

teamleaderleo added a commit that referenced this pull request Oct 26, 2026
…et cover exactly what the person picked (fails: annotations are refused without the person, the daemon verb refuses them, the ticket names no answers)

Codex review of #25424: the remote wire dropped a question's annotations
(the chosen preview, #24356), and the gesture ticket named no answers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 26, 2026
… under the person's proof, and its ticket binds the answers

Codex review of #25424:
- The remote wire, the session daemon's client and agent-session-permission
  now carry a question's annotations (Claude Code's chosen preview and
  notes, #24356) beside its answers. acpmux counts annotations from a
  connection that is not the person only under the person's decision proof
  over them: the answers proof gains a seventh part, the annotations'
  digest, when the answer has annotations. A phone's signed answer still
  never carries them.
- A permission answer's gesture ticket now names the question's answers and
  annotations, compared by their canonical JSON, so a ticket the page took
  for one answer never redeems or gets signed for another.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 26, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

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

Review fd848fb: 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=pr25424 -f ref=lane/hb-stale-pane-answer-proof -f platform=macos -f backend_mode=local

Stale: these images are of b7ab635; the head is now a7c004b and a new capture is running.

Gallery before/after for b7ab635: 16 states rendered, 4 images differ, 1951 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 40306404424 -R manaflow-ai/cmux -n gallery-advisory-25424-b7ab6351d6d05f7e241cbb7540362466c75ecc6d (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-width/standard Apple System Colors changed 23.4% imports direct.ts (1 hops)
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide Apple System Colors Light changed 1.53% imports direct.ts (1 hops)
agent-pane.chat-width/wide Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide-blocks Apple System Colors Light changed 1.53% imports direct.ts (1 hops)
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/composer-grown Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/composer-grown Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/new-chat Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/new-chat Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/after-turn Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/after-turn Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/working Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/working Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/typing-in-dock Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/typing-in-dock Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/long-title Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.docked-chat/long-title Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.gutter-select/from-left-margin Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.gutter-select/from-left-margin Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.gutter-select/from-right-margin Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.gutter-select/from-right-margin Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.inspector/chat-menu Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.inspector/chat-menu Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.inspector/wire-log Apple System Colors Light changed 0.0135% imports direct.ts (1 hops)
agent-pane.inspector/wire-log Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.orchestration-lab/local-queue Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.orchestration-lab/local-queue Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.orchestration-lab/build-box Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.orchestration-lab/build-box Apple System Colors unchanged 0% imports direct.ts (1 hops)

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Oct 26, 2026
…er the person proof over its answers and annotations

Re-cut of #23869 (cosmic-gray lane), daemon side; the pane side is its own PR.
A relayed AskUserQuestion answer was refused because the person decision
proof (cx-0q7o) never covered answers. acpmux-person-decision-answers-v1
covers the answers digest, and the annotations digest when there are any;
annotations from a connection that is not the person count only under it.
cmux-tui agent-session-permission carries answers and annotations to acpmux
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo force-pushed the lane/hb-stale-pane-answer-proof branch from b7ab635 to a7c004b Compare October 26, 2026 10:37
@teamleaderleo
teamleaderleo force-pushed the lane/hb-stale-pane-answer-proof branch from a7c004b to fd848fb Compare October 26, 2026 10:37
@teamleaderleo teamleaderleo changed the title acpmux, agent pane: a question answered in the pane counts on another machine (re-cut of #23869) acpmux: a question answered in the pane counts on another machine under the person's proof (re-cut of #23869, daemon side) Oct 26, 2026
@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:high Risk tier (docs/ci/risk-tiers.md) labels Oct 26, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra xhigh, hb-stale-pane-review): SHIP at 40cba81

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / post cmux-next/fast-gates is red on 16 of 20 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo
teamleaderleo merged commit 1663447 into feat-cmux-next Oct 26, 2026
162 of 170 checks passed
@teamleaderleo
teamleaderleo deleted the lane/hb-stale-pane-answer-proof branch October 26, 2026 11:37
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

This branch had an error being deployed

1 failed and 3 inactive (1 outdated) deployments
artifacts — 40cba815 Deployed Oct 26, 2026 by teamleaderleo via add the Windows daemon to the tree #56832
sentry-dsyms — 40cba815 Deployed Oct 26, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #56832
cmux-tui-merge-tree — 40cba815 Deployed Oct 26, 2026 by teamleaderleo via publish the merge tree #6450
ci-routing-agent — a7c004b7 Deployed Oct 26, 2026 by teamleaderleo via namespace autofix #3308
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant