filbert: row 67 round 2 packet, rebase onto f38b7f46 (#1560)

Manifest 4387c8d5. Rebase only: same added and removed lines, three files
re-digested after rows 58, 60 and 59. Gate green, round 1 mutants all killed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-11 20:53:36 -05:00
co-authored by Claude Opus 5.5
parent a5e8cd1be5
commit 7d032da5b4
3 changed files with 104 additions and 10 deletions
+94
View File
@@ -1,3 +1,97 @@
# Row 67 (#1560): decisions read follow-up, round 2
Filbert, 2026-10-12. Brief: `docs/plans/2026-10-11_decisions-read-follow-up.md`,
"Decisions read follow-up: seen-then-resolve, list-before-503 and full-row
tests" (blob 7674ff40, unchanged). Darkwing and Dewey review. Sage commits
after the gate. Nothing in the candidate is committed, staged or pushed.
Base f38b7f46, origin/refactor's tip when I rebased. `build.patch` applies
there with `git apply --index`, and `candidate-manifest.sha256` pins all 4
files after the patch. Round 1 was manifest `8959e615…7369` on 970ef729,
approved by Dewey (27452) and Darkwing (27627).
## Round 2: rebase only
Sage set the scope: a rebase onto the current tip, the merged hunks named
here, a fresh manifest, and a digest re-approval. Nothing new goes in, so the
round 1 description, mutants and questions below still apply. Dewey's N1 (an
assertion that test 4's new decisions are listed) is not folded in; it stays
a follow-up.
### What landed on the manifest paths
Since 970ef729, three rows changed 3 of the 4 files.
`packages/bus/tests/decisions.test.mjs` is untouched.
- Row 58 (aaf87213): the bus README, `broker.mjs` and webui `bus.test.mjs`.
- Row 60 (1771bf98): the bus README, `broker.mjs` and webui `bus.test.mjs`.
- Row 59 (a8512007): the bus README and `broker.mjs`.
### Digest check
Round 1's patch no longer applies plain (README line 205), as Darkwing found.
It applies to f38b7f46 with `git apply --index --3way` with no conflicts.
I compared the round 1 and round 2 patches:
- The added and removed lines are byte-identical (106 lines each).
- The hunk headers moved: README 205 to 235, `broker.mjs` 837 to 861, webui
`bus.test.mjs` 163 to 191. The `decisions.test.mjs` hunks are unchanged.
- One context line differs, below.
`decisions.test.mjs` keeps its digest (`9477cfa7…`). The other three have new
digests because their bases changed.
### Merged hunks
Line numbers are in the round 2 tree.
- `packages/bus/README.md`, lines 235–243: the "Every row is…" sentence is
rewritten as in round 1. In round 1 the hunk's last context line was the
`## Shared reads and adapter boundary` heading. Row 60 has since put its
`credentials` paragraph between the two, so that paragraph's first line
is the context now. The sentence and the paragraph share no lines.
- `packages/bus/src/broker.mjs`, lines 864–867: the comment above
`case 'decisions'` (line 868). Row 59's `agents` block ends above it
(line 852 on), and row 60's `case 'credentials'` follows it (line 889).
Neither touches the comment or the case.
- `packages/webui/tests/bus.test.mjs`, lines 194–198: the three no-bus
requests still follow the `/api/bus/agents` not-configured check, inside
"bus refusals map to statuses…". Row 58 and row 60's additions sit above.
### Gate (round 2)
Run in a worktree of f38b7f46 with the round 2 patch staged and
`node_modules` linked, in sequence, with `TMPDIR` in my scratch and
`DOCKER_HOST` pointed at a missing socket, 2026-10-12T01:47:57Z to 01:52:03Z.
- Packages: webui 62/0, bus 95/0, cli 114/0, control-board 124/0.
- All nine `scripts/test-*.sh` exit 0: auth 15, conductor 17, config 24,
discord 66, extension-package 18, foundation 44, queue 27, release 4,
task 26. `test-queue` skipped `verify` and `render --check`, because the
worktree isn't the queue's canonical root. `test-release` skipped its
Docker cases without a daemon.
- Afterwards `git status` showed only the four staged paths and the
`node_modules` link, and the tree checked 4/4 against the manifest.
### Mutants (round 2)
I reran round 1's nine mutants (`mut/run.mjs`) on the round 2 tree,
2026-10-12T01:52Z to 01:53Z. All nine are killed, each by the same test as in
round 1. The bus suite now has 95 tests and the webui file 9, so the counts
read 94/1, 92/3 for `view-blocking-raw` and 8/1 for `web-503-first`, where
round 1 read 80/1, 78/3 and 7/1. One edit changed: row 59 added a second
`blocking: !!d.blocking,` in the `agents` read (`broker.mjs` line 930), and
the runner refuses a target that isn't unique. So `view-blocking-raw` ran
from a copy of the runner that anchors on its whole line (line 297, inside
the decisions view), and the edit is the same. After each run `git diff` was
unchanged, and the tree checked 4/4 against the manifest afterwards.
---
The round 1 packet follows unchanged: the description, files, round 1
mutants, round 1 gate and questions. Its base and line numbers are round 1's.
# Row 67 (#1560): decisions read follow-up, round 1
Filbert, 2026-10-11. Brief: `docs/plans/2026-10-11_decisions-read-follow-up.md`,
+7 -7
View File
@@ -1,8 +1,8 @@
diff --git a/packages/bus/README.md b/packages/bus/README.md
index 5b57b7fc..fcd0f69e 100644
index 08be6307..11489360 100644
--- a/packages/bus/README.md
+++ b/packages/bus/README.md
@@ -205,7 +205,9 @@ decisions. It takes `{list}`, nothing else. `roles` lists the business's open
@@ -235,7 +235,9 @@ decisions. It takes `{list}`, nothing else. `roles` lists the business's open
decisions routed to a role, never to the human, oldest first. `recent` lists
its last `RECENT` (50) closed decisions of every route, newest close first,
each with `closed`, the closing `decision_events` row. Every row is the
@@ -12,12 +12,12 @@ index 5b57b7fc..fcd0f69e 100644
+raise's `action.allowed` event, which `trail` also gives. So the lists add no
data a reader couldn't already read one id at a time; they add the listing.
## Shared reads and adapter boundary
`credentials` (row 60, #1549) is also for human and reader sessions only; a
diff --git a/packages/bus/src/broker.mjs b/packages/bus/src/broker.mjs
index 84db8799..07f35114 100644
index 5e86c60c..5acc8329 100644
--- a/packages/bus/src/broker.mjs
+++ b/packages/bus/src/broker.mjs
@@ -837,7 +837,10 @@ export class Broker {
@@ -861,7 +861,10 @@ export class Broker {
return this.#trail(s, identifier(a.subject));
}
// Row 57 (#1546): the Inbox's "Routed to roles" and "Recent" lists, for human and
@@ -143,10 +143,10 @@ index 6626460b..069e2ef4 100644
test("a role session can't list decisions, so it can't read another role's open decisions", (t) => {
diff --git a/packages/webui/tests/bus.test.mjs b/packages/webui/tests/bus.test.mjs
index 2d9ca6ba..86fae610 100644
index 46d8016c..a243ae7e 100644
--- a/packages/webui/tests/bus.test.mjs
+++ b/packages/webui/tests/bus.test.mjs
@@ -163,6 +163,11 @@ test('bus refusals map to statuses and never carry a path or a stack', async t =
@@ -191,6 +191,11 @@ test('bus refusals map to statuses and never carry a path or a stack', async t =
assert.deepEqual([shape.status, (await shape.json()).error], [502, 'invalid-response']);
const unset = await fetch(`http://127.0.0.1:${none.address().port}/api/bus/agents`);
assert.deepEqual([unset.status, (await unset.json()).error], [503, 'not-configured']);
@@ -1,4 +1,4 @@
1d46e3f0fd0ccdb3c5a9cb6159b0f1a7031757983297d612f78209dd20740c93 packages/bus/README.md
9fecd3d888ce86c113b6176eb86902bdd5f606965f1c0b5c90d59016f4f6cd92 packages/bus/src/broker.mjs
3d3aa48934df0c929889fcb4f5028eb650a7ddb29a9cab8d6f911e5369037dfb packages/bus/README.md
8c53efeb3b2398882da13634f109da936546c1bafe133150c1f5a0a4e446be7c packages/bus/src/broker.mjs
9477cfa7411fc46b4be4c960942b9f5c912bb050b1119a635ab161d321b77b2a packages/bus/tests/decisions.test.mjs
10bc41d8a332027aa902da836ad7644cdc09ef8be26a2b8bab106c5f365e3da1 packages/webui/tests/bus.test.mjs
42285ef5ae5ec5464c814bbccab0205058b6c51019d4a768754caf441bb33c2c packages/webui/tests/bus.test.mjs