Files
stack/docs/plans/2026-10-11_console-reply-view.md
T
jason.woltjeandClaude Opus 5.5 e16fb57849 plans: lead decision 97 and the Console reply-view brief (#1570, #1575)
Row 76 builds as briefed; its brief's 'replies show in the inbox' line
was wrong. A read-only bus read of replies, shown on the Console receipt,
is row 81 (#1575), held behind the cutover. Option (b), a Console
message.receive, is refused because receive marks delivery.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 18:52:25 -05:00

3.5 KiB

Console: show the reply to a web send (2026-10-11)

Status: written by Sage, lead. It follows docs/plans/BRIEF-TEMPLATE.md. From Dewey's question while building row 76 (#1570). Lead decision 97. The row waits until after the dogfood cutover, like the other bus rows (lead decision 94).

Show replies to a message without receiving them

Problem

Row 76's brief said a web send's replies "show in the inbox as today". That was wrong. Dewey checked the code on 2026-10-11 and Sage confirmed it:

  • The bus inbox read returns only open decisions routed to the human (packages/bus/src/broker.mjs, the inbox case). A message to the human never appears there.
  • The runner's reply is a RESULT message.send to human with in_reply_to set (packages/harness/src/runner.mjs).
  • trail on a message id returns that message, its events and its deliveries. Nothing reads in_reply_to, so replies are not in it.
  • message.receive writes a delivered row for each message it returns. A Console that received the human's messages would take them away from mosaic talk, which prints only undelivered ones.

So after a web send, Jason sees the receipt and the delivery state but not the PM's answer. The answer shows up on his next mosaic talk, which prints every undelivered message to the human before it waits. The CLI's timeout message (packages/cli/src/cli.mjs, the talk function) says "the next mosaic talk or mosaic inbox shows it", and the inbox half is wrong for the same reason.

Owner and reviewer

Owner: Dewey, after row 76 and row 59 (both edit files this row reads or changes). Reviewer: Darkwing.

Files owned

  • packages/bus/src/broker.mjs, a read for replies only
  • packages/bus/src/views.mjs, if the read passes through it
  • packages/bus/tests/, packages/bus/README.md, the reads section only
  • packages/webui/src/, packages/webui/README.md, packages/webui/tests/
  • packages/cli/src/cli.mjs, the talk timeout message only, and packages/cli/tests/
  • agents/dewey/work/queue-<row>/

What ships

  • A bus read that, given a message id, returns the messages whose in_reply_to is that id, oldest first, at most 50. It writes no delivery or read row and changes nothing. Dewey picks whether it is a new read verb or a field on trail, and says why in the packet.
  • The read is open to the same sessions as the other reads (human and reader). An id that names no message in the business refuses message-not-found, as message.send does for in_reply_to. (trail returns an empty list instead; this read doesn't copy that.)
  • The Console receipt for a web send shows the replies that read returns, refreshed with the page. A reply shown there still reaches mosaic talk unchanged.
  • The CLI timeout message names only mosaic talk.
  • The webui README says where a reply shows and that the Console never marks one delivered or read.
  • Tests: a reply listed and its delivery rows unchanged; a message with no reply; the cap and order; an unknown id; mosaic talk still receives a reply after the Console has shown it; the new timeout message.

Out of scope

Receiving or marking messages from the Console, any write verb, the human transport, the deliveries schema, decisions in the browser (REQ-DEC-3) and conversations with T3 seats (CHAT-07).

Gate

Darkwing approves on the row's issue naming the candidate manifest. The bus, webui, control-board and cli node suites and every scripts/test-*.sh green on Sage's gate rerun.