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]>
This commit is contained in:
2026-10-11 18:52:25 -05:00
co-authored by Claude Opus 5.5
parent 36cd6bd12b
commit e16fb57849
2 changed files with 106 additions and 0 deletions
+25
View File
@@ -2101,3 +2101,28 @@ which stay with him. Each item names who decided it and what happened.
the faster option. In exchange, the in-stack Mos never runs with
its wider authority under Jason's user, with PID-only isolation,
for more than the trial.
97. **Row 76 builds as briefed; the reply view is its own row after the
cutover (2026-10-11).** Dewey found, building row 76 (#1570), that the
brief's "replies show in the inbox as today" is wrong. The bus inbox
lists only open decisions, and nothing reads `in_reply_to`. Sage wrote
that line; the error is Sage's.
- Row 76 goes ahead with Dewey's option (a). Its README says the PM's
reply to a web send shows on Jason's next `mosaic talk`, which
prints every undelivered message to the human first
(`packages/cli/src/cli.mjs`, `talk`).
- Option (b), a Console `message.receive` with no `message.read`, is
refused. `message.receive` writes a `delivered` row, so the Console
would take the reply away from `mosaic talk`. It is also a bus
change, which row 76's brief puts out of scope.
- The web send keeps the broker's default class, INFO. The brief puts
other classes out of scope, and the runner answers any class but
RESULT.
- Row 81 (#1575): a read-only bus read of the replies to a message,
shown on the Console receipt, plus the CLI talk timeout message,
which also names `mosaic inbox` wrongly. Owner Dewey after rows 76
and 59, reviewer Darkwing. Held behind the cutover with the other
bus rows (decision 94).
- The tradeoff: on cutover day Jason sends from the browser and reads
the answer in the CLI. In exchange no broker change lands before the
cutover and row 76 needs no extra review round.
@@ -0,0 +1,81 @@
# 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.