fix(feed): agent questions post as answerable choices, named for their agent

AZ
2d ago
+1194-881

What

The Mac's feed bridge posted every question an agent asks in its chat (Claude Code's AskUserQuestion, a Codex request_user_input) as a bare notice: "Agent asks: <first question, cut to 160 characters>", with no options, no body and the poster "Agent". Only a Chief subagent's report (a message of its own in the reports basket) showed what an agent actually said, which is why only optchat-* agents' events looked complete in the Feed.

Now:

  • A question that fits a feed choice (1 to 4 questions, 2 to 8 options each, the owner's bounds in feed-kinds.ts) posts as a choice request. Its body lists every question in full with its options and descriptions. Its prompt uses positional ids (q0, o0), because Claude keys answers by question text and the owner caps ids at 40 characters. The person answers it inline in the Feed.
  • The person's choice answer maps back by position onto the same request. The bridge re-reads that request and checks it is still pending with the same digest, then sends it to acpmux as the question's own answer (AgentQuestion.reply, _acpmux/permission_respond, with answeredBy).
  • Trust: an answer the person gives in this Mac's own Feed goes to acpmux on the bridge's person-proven connection (FeedModel.onAnswer → answeredHere), as an answer typed in the chat would. Answers relayed by the owner from another device are admitted only from another install, the same rule a Deny already follows: never a session: answer, and never this Mac's own install. A question is not a permission (Leo 2026-10-21), so no phone presence proof is required. Approvals are unchanged.
  • Every item the bridge posts is named for its agent: the session's name from _acpmux/info ("claude", "codex", "Fix login"), not "Agent".
  • A question that does not fit a choice stays a notice, now also named for its agent.
  • The pure post builders moved out of the App into CmuxNextAgentPane/Approvals/AcpmuxFeedPost.swift, together with their 6 strings, which were moved byte-for-byte between catalogs. The question-to-choice mapping is new in CmuxNextAgentQuestion/AgentQuestionFeedChoice.swift. Net App lines: āˆ’3.

The phone half (every finished turn's card shows the agent's whole reply, not a 160-character flattened preview) went straight to feat-cmux-next as iOS work: db183fa..c78a916 .

Tests

CmuxNextAppTests/AcpmuxFeedBridgeQuestionTests (fleet package-test-lane.sh suite, Xcode 26.6): passed at 8b3a043 (cmux-ci step 6e65559206f0faea6d6ef847, aws-m4pro-8)

  • aQuestionPostsAsAnAnswerableChoice: choice kind, options, body, agent poster.
  • aChoiceAnswerAnswersTheQuestion: a feed answer maps back to permission_respond params; unknown question or option ids answer nothing.
  • aSessionAnswerNeverAnswersAQuestion: a session or this Mac's own install, relayed through the owner, never answers.
  • aQuestionThatDoesNotFitAChoiceStaysANotice
  • aToolPermissionStillPostsAnApproveItem, plus the 2 existing question-title tests.

Observed / Not run

  • Observed: the suite above on the fleet; the prepush gate (no new violations, App āˆ’3 lines); and the tagged dev build feed-event-details (fleet job 106cb1fb41c1fd6fb2884966), built and published.
  • Not run: a live end-to-end answer from the Mac Feed into a real Claude Code session. That needs a signed-in cloud Feed and a live acpmux question; no capture scene seeds either.

No capture: the visible change is the content of a feed item (a choice card instead of an "Agent asks:" line). The choice card UI itself (FeedChoiceControls) is unchanged. No capture scene can post a bridge item without a signed-in cloud Feed and a live acpmux question. The before/after post bodies are in the report.

Changelog

  • Fixed: Feed questions from Claude Code and Codex chats show every question and option and can be answered right in the Feed, and every Feed event names the agent that posted it.

šŸ¤– Generated with Claude Code