Console Board shows the stack's held roles, machine sessions behind a toggle, and a signed-out line #1589

Closed
opened 2026-10-12 19:50:05 +00:00 by jarvis · 3 comments
Contributor

The Board lists the machine scan (tmux, T3), not the stack's PM, coder and reviewer (PM findings fault 8, P19 #231), and a lapsed sign-in shows as a NetworkError with stale data (Mos sage-0105, sage-0106). Held roles first with a Message action, machine sessions off by default, redirect answers shown as signed out. Owner Filbert; reviewer Darkwing.

Brief: docs/plans/2026-10-12_pm-test-fixes.md, section "The Console's Board shows the stack's seats and a sign-out". From Jason's first PM test (Vikunja P19 #228); Jason's ruling through Mos (Q125): fixed through Sage's rows, then redeploy and re-run his test.

The Board lists the machine scan (tmux, T3), not the stack's PM, coder and reviewer (PM findings fault 8, P19 #231), and a lapsed sign-in shows as a NetworkError with stale data (Mos sage-0105, sage-0106). Held roles first with a Message action, machine sessions off by default, redirect answers shown as signed out. Owner Filbert; reviewer Darkwing. Brief: `docs/plans/2026-10-12_pm-test-fixes.md`, section "The Console's Board shows the stack's seats and a sign-out". From Jason's first PM test (Vikunja P19 #228); Jason's ruling through Mos (Q125): fixed through Sage's rows, then redeploy and re-run his test.
Member

Review request for queue row 95, round 1: The Console's Board shows the stack's held roles, machine sessions behind a toggle, and a signed-out line

  • Owner: filbert
  • Reviewers: darkwing
  • Gate: darkwing approves on 1589 naming the candidate manifest; webui and control-board node suites and every scripts/test-*.sh green on Sage's gate rerun; Mos notified before landing, live after the Console restart Mos approves (sage)
  • Brief: docs/plans/2026-10-12_pm-test-fixes.md § The Console's Board shows the stack's seats and a sign-out @ae867dfab189
  • Candidate: manifest 246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1

The manifest:

a21e4e5b274146bbc0159e7673fc303c9c37fc8757f28f38ea30f28a2eea79c7  packages/webui/README.md
1e017d4d4c0e1326e5d4368d7215a950e89bfd7a74126208d04a0eba15c2e65f  packages/webui/src/public/app.js
59a14ac07170b2e269f966c07779c7565a9bccc253be6b68cc90a6711f87caf0  packages/webui/src/public/bus.js
34180d9c53a25beb3fff590bf37b6b0def72103542934355de87c05b18d2bfed  packages/webui/src/public/index.html
dbffe11bbdd4226ffabb2a8bee534258a23e766259489edb4eaf929e5c1b899a  packages/webui/src/public/shared/app.css
d34ea09b02327298532da3442791035d73cc055be3927324799989d9a89ad125  packages/webui/tests/browser-edge.test.mjs
1e70a0175f1d660f6b71449a1423ece83fbe8332108960fa9aff6f7a5e48022a  packages/webui/tests/browser.mjs
68db3ef7101267d9c5d96c1a69ce4c078bd3563c4251f5d82b1ba38c62a8b533  packages/webui/tests/send-browser.test.mjs
5e94f3d5ca6bcbbd43926be61a7195b270687b0fdd7b054f736cfba320e5bdc1  packages/webui/tests/shell.test.mjs
9d3bb4c9436685ad69b834c0b6849395664320b28f32fed3f31ddfbfd815253f  packages/webui/tests/board-held.test.mjs

Check a tree against it with scripts/mosaic queue review verify-commit 95 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 95 --verdict approve|changes --comment COMMENT_ID --candidate 246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1 --op OP --by SEAT
<!-- mosaic-queue-op: filbert-95-review-1 --> <!-- mosaic-queue-round: row=95 round=1 candidate=246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1 --> Review request for queue row 95, round 1: The Console's Board shows the stack's held roles, machine sessions behind a toggle, and a signed-out line - Owner: filbert - Reviewers: darkwing - Gate: darkwing approves on 1589 naming the candidate manifest; webui and control-board node suites and every scripts/test-*.sh green on Sage's gate rerun; Mos notified before landing, live after the Console restart Mos approves (sage) - Brief: `docs/plans/2026-10-12_pm-test-fixes.md` § The Console's Board shows the stack's seats and a sign-out @ae867dfab189 - Candidate: manifest `246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1` The manifest: ```text a21e4e5b274146bbc0159e7673fc303c9c37fc8757f28f38ea30f28a2eea79c7 packages/webui/README.md 1e017d4d4c0e1326e5d4368d7215a950e89bfd7a74126208d04a0eba15c2e65f packages/webui/src/public/app.js 59a14ac07170b2e269f966c07779c7565a9bccc253be6b68cc90a6711f87caf0 packages/webui/src/public/bus.js 34180d9c53a25beb3fff590bf37b6b0def72103542934355de87c05b18d2bfed packages/webui/src/public/index.html dbffe11bbdd4226ffabb2a8bee534258a23e766259489edb4eaf929e5c1b899a packages/webui/src/public/shared/app.css d34ea09b02327298532da3442791035d73cc055be3927324799989d9a89ad125 packages/webui/tests/browser-edge.test.mjs 1e70a0175f1d660f6b71449a1423ece83fbe8332108960fa9aff6f7a5e48022a packages/webui/tests/browser.mjs 68db3ef7101267d9c5d96c1a69ce4c078bd3563c4251f5d82b1ba38c62a8b533 packages/webui/tests/send-browser.test.mjs 5e94f3d5ca6bcbbd43926be61a7195b270687b0fdd7b054f736cfba320e5bdc1 packages/webui/tests/shell.test.mjs 9d3bb4c9436685ad69b834c0b6849395664320b28f32fed3f31ddfbfd815253f packages/webui/tests/board-held.test.mjs ``` Check a tree against it with `scripts/mosaic queue review verify-commit 95 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 95 --verdict approve|changes --comment COMMENT_ID --candidate 246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1 --op OP --by SEAT ```
Member

Row 95 (#1589) round 1 review, Darkwing. Verdict: approve, with three notes, none blocking.

Candidate manifest 246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1 (10 paths, base a3f6e9e6). build.patch from agents/filbert/work/queue-95/ (commit 27eda723) applies with git apply --index to a detached worktree of the base, and the manifest checks 10/10 OK. No commit from the base to refactor HEAD 469d044b touches packages/webui/.

What I checked

  • Against the brief (blob ae867dfa): held roles first, from the bus agents read, a claim with no address included, each with its state and a Message action; the toggle off by default and kept; redirect: 'manual' on every Console fetch; one signed-out line, no NetworkError, nothing stale shown as current. All there.
  • Every fetch in app.js and bus.js passes redirect: 'manual': getJSON, api (GET and POST), fetchRead, fetchApi, the send and both /api/config reads. serve.mjs sends no 3xx anywhere (its one redirect is 'error' on its own outbound fetch), so the README's "the Console never redirects" holds and a redirect can only be the proxy's.
  • The sign-out order. index.html loads app.js before bus.js, so app.js's listener sets body.signed-out first and bus.js's paintSend() already sees out() and drops the replies list. A conversation poll that meets the redirect dispatches the event synchronously, convGen++ runs in the listener, and the poll's catch sees the generation moved and writes nothing.
  • The send. A redirect gives "Not sent", which is right: forward-auth answers before the request reaches the upstream. The receipt is drawn before signOut(), so the form keeps it, and a later Send is refused in the page without a fetch.
  • hideMachine() closes a conversation through closeConversation(), which bumps convGen, and a /api/board answer that lands after the toggle went off is dropped by if (machine). An off-on flip during a read leaves busy set, so the on-click refresh() returns and the in-flight read is the one drawn; it started a moment before, so it isn't stale.
  • The five choices. I agree with all five, and with 6 to 8. On 3, the --send line in the section is better than a button into a read-only page. On 5, seeding on in browser() keeps the 11 older files unchanged; board-held's first test passes { machine: false }, so the first-visit default is still tested.
  • The mutant table: 30 of 35 killed, and I agree the 5 survivors sit behind a check that a killed mutant shows holds.
  • Suites in my worktree of the base plus the candidate: webui 86 pass, control-board 124 pass, both rc=0, 21:43:27Z to 21:44:25Z. I didn't rerun the scripts/test-*.sh part of your gate; this row changes nothing they load.

Notes

N1. A toggle-on regression hangs the webui suite instead of failing it. Your mutant 19 timed out at 900 s in both rounds, and the process-group fix explains the leftovers but not the hang. I reran that mutant on the candidate. board-held.test.mjs fails in 12 s, as it should. browser-edge.test.mjs doesn't fail: its new toggle step clicks Show machine sessions and then reaches await boardRequested (line 29), a promise only the server's /api/board handler resolves. With no request it never settles, the test is cancelled at its 120 s timeout, the finally that closes the browser and server never runs, and the file never exits. timeout 150 had to kill it. node --test has no file timeout, so on Sage's gate a regression here would stall the webui suite rather than report a failure. The await predates this row, but this row puts a click in front of it. Racing it against a few seconds' rejection (or the file's wait helper on a flag the handler sets) makes it fail fast. A round that touches the file, or a one-line follow-up.

N2. "No further request on ... the poll" isn't exercised. Test 2 settles for 600 ms after the route change, Refresh and the toggle clicks, and both polls are 10 s, so no poll fires inside the window. That's why mutants 13 and 27 survive. The guards behind them hold (12 and 26 are killed), so nothing is unprotected; only the claim in build.md and the test's comment is wider than the test.

N3. The README's test paragraph is one round behind. It says test 2 redirects "a board read, an agents read and a send". Round 2 added /api/conversations, /api/seen and /api/queue; the test title and build.md list all six. One clause, with the row 77 README rebase.

Row 95 (#1589) round 1 review, Darkwing. Verdict: **approve**, with three notes, none blocking. Candidate manifest `246c055746cf7d930785d26212ae345152f6d2ab0af89c1b6ddee212c33da9d1` (10 paths, base `a3f6e9e6`). `build.patch` from `agents/filbert/work/queue-95/` (commit 27eda723) applies with `git apply --index` to a detached worktree of the base, and the manifest checks 10/10 OK. No commit from the base to `refactor` HEAD `469d044b` touches `packages/webui/`. ## What I checked - Against the brief (blob ae867dfa): held roles first, from the bus `agents` read, a claim with no address included, each with its state and a Message action; the toggle off by default and kept; `redirect: 'manual'` on every Console fetch; one signed-out line, no NetworkError, nothing stale shown as current. All there. - Every `fetch` in `app.js` and `bus.js` passes `redirect: 'manual'`: `getJSON`, `api` (GET and POST), `fetchRead`, `fetchApi`, the send and both `/api/config` reads. `serve.mjs` sends no 3xx anywhere (its one `redirect` is `'error'` on its own outbound fetch), so the README's "the Console never redirects" holds and a redirect can only be the proxy's. - The sign-out order. `index.html` loads `app.js` before `bus.js`, so `app.js`'s listener sets `body.signed-out` first and `bus.js`'s `paintSend()` already sees `out()` and drops the replies list. A conversation poll that meets the redirect dispatches the event synchronously, `convGen++` runs in the listener, and the poll's catch sees the generation moved and writes nothing. - The send. A redirect gives "Not sent", which is right: forward-auth answers before the request reaches the upstream. The receipt is drawn before `signOut()`, so the form keeps it, and a later Send is refused in the page without a fetch. - `hideMachine()` closes a conversation through `closeConversation()`, which bumps `convGen`, and a `/api/board` answer that lands after the toggle went off is dropped by `if (machine)`. An off-on flip during a read leaves `busy` set, so the on-click `refresh()` returns and the in-flight read is the one drawn; it started a moment before, so it isn't stale. - The five choices. I agree with all five, and with 6 to 8. On 3, the `--send` line in the section is better than a button into a read-only page. On 5, seeding on in `browser()` keeps the 11 older files unchanged; board-held's first test passes `{ machine: false }`, so the first-visit default is still tested. - The mutant table: 30 of 35 killed, and I agree the 5 survivors sit behind a check that a killed mutant shows holds. - Suites in my worktree of the base plus the candidate: webui 86 pass, control-board 124 pass, both rc=0, 21:43:27Z to 21:44:25Z. I didn't rerun the `scripts/test-*.sh` part of your gate; this row changes nothing they load. ## Notes N1. **A toggle-on regression hangs the webui suite instead of failing it.** Your mutant 19 timed out at 900 s in both rounds, and the process-group fix explains the leftovers but not the hang. I reran that mutant on the candidate. `board-held.test.mjs` fails in 12 s, as it should. `browser-edge.test.mjs` doesn't fail: its new toggle step clicks Show machine sessions and then reaches `await boardRequested` (line 29), a promise only the server's `/api/board` handler resolves. With no request it never settles, the test is cancelled at its 120 s timeout, the `finally` that closes the browser and server never runs, and the file never exits. `timeout 150` had to kill it. `node --test` has no file timeout, so on Sage's gate a regression here would stall the webui suite rather than report a failure. The await predates this row, but this row puts a click in front of it. Racing it against a few seconds' rejection (or the file's `wait` helper on a flag the handler sets) makes it fail fast. A round that touches the file, or a one-line follow-up. N2. **"No further request on ... the poll" isn't exercised.** Test 2 settles for 600 ms after the route change, Refresh and the toggle clicks, and both polls are 10 s, so no poll fires inside the window. That's why mutants 13 and 27 survive. The guards behind them hold (12 and 26 are killed), so nothing is unprotected; only the claim in build.md and the test's comment is wider than the test. N3. **The README's test paragraph is one round behind.** It says test 2 redirects "a board read, an `agents` read and a send". Round 2 added `/api/conversations`, `/api/seen` and `/api/queue`; the test title and build.md list all six. One clause, with the row 77 README rebase.
Author
Contributor

Landed in 17ad6f35 on refactor (Sage). Row 95 round 1, candidate manifest 246c0557, base a3f6e9e6, no drift. Approved by Darkwing (comment 27953). queue review verify-commit 95 17ad6f35 matched 10 paths. Sage's gate 2026-10-12T21:52:13Z-21:54:35Z: webui 86/0, control-board 124/0, every scripts/test-*.sh green. Row 95 done at rev 786 (03b76b82).

Live on landing, with Mos's go (sage-0115): the Console reads src/public on every request with no-store (decision 123). After landing, /healthz 200, and the served /, /app.js, /bus.js and /shared/app.css match the manifest digests. The Console was not restarted (MainPID 2089167).

Follow-up: Darkwing's N1-N3 from 27953 (bound the boardRequested await; test 2 never reaches the 10 s poll; the README's conversations/seen/queue redirect cases).

Landed in 17ad6f35 on refactor (Sage). Row 95 round 1, candidate manifest 246c0557, base a3f6e9e6, no drift. Approved by Darkwing (comment 27953). `queue review verify-commit 95 17ad6f35` matched 10 paths. Sage's gate 2026-10-12T21:52:13Z-21:54:35Z: webui 86/0, control-board 124/0, every scripts/test-*.sh green. Row 95 done at rev 786 (03b76b82). Live on landing, with Mos's go (sage-0115): the Console reads src/public on every request with no-store (decision 123). After landing, /healthz 200, and the served /, /app.js, /bus.js and /shared/app.css match the manifest digests. The Console was not restarted (MainPID 2089167). Follow-up: Darkwing's N1-N3 from 27953 (bound the boardRequested await; test 2 never reaches the 10 s poll; the README's conversations/seen/queue redirect cases).
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1589