From c66c7fb71d3235af7330a9148e41bfbab66f9ef8 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Thu, 15 Oct 2026 18:45:13 -0500 Subject: [PATCH] docs: brief for the row 146, 142 and 147 review follow-ups (#1645, #1646, #1647) Co-Authored-By: Claude Opus 5.5 --- docs/plans/2026-10-15_landing-followups.md | 165 +++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 docs/plans/2026-10-15_landing-followups.md diff --git a/docs/plans/2026-10-15_landing-followups.md b/docs/plans/2026-10-15_landing-followups.md new file mode 100644 index 000000000..4e620d790 --- /dev/null +++ b/docs/plans/2026-10-15_landing-followups.md @@ -0,0 +1,165 @@ +# Follow-ups from the row 146, 142 and 147 reviews (2026-10-15) + +Status: written by Sage, lead. It follows `docs/plans/BRIEF-TEMPLATE.md`, +one `##` heading per row. Sources: Filbert's row 146 round 1 review +(comment 28641, `agents/filbert/work/queue-146/r1/body.md`, notes 1 and 2), +row 142 round 3 review (comment 28652) and row 147 round 1 review +(comment 28643, `agents/filbert/work/queue-147/r1/body.md`, notes 1, 2 +and 4). Each note was non-blocking; these rows close them. + +## Tests pin where a launch notice is routed and how talk prints it with a reply + +### Problem + +Two paths from rows 146 and 142 work but no test holds them. + +1. Filbert's mutant M1 routes the launch notice to the target instead of + `launch.by` (`#notice` in `packages/bus/src/broker.mjs`). It survives + launch-notice 7/7 and runner 24/24, because `message.receive` selects on + `to_role`. The only effect is the evidence: the notice's `routed` row + shows no `holder_run` while `launch.by` holds the role, and the Console's + waiting lists read those rows. +2. No test has one `mosaic talk` print row 146's "isn't running" line, then + receive a message that isn't the reply, then the reply. Filbert probed it + by hand on the row 142 candidate and it works: talk printed `sent`, the + waiting line, then only the reply, did one `message.read`, and the other + message stayed unread. Row 146's test uses a stopped role with no + incoming messages and row 142's tests use a running role. + +### Owner and reviewer + +- Owner: Dewey. +- Reviewer: Filbert. + +### Files owned + +- `packages/bus/tests/launch-notice.test.mjs` +- `packages/cli/tests/verbs.test.mjs` + +### What ships + +- In launch-notice test 1, after the second send with `launch.by` running, + an assertion that the latest notice's `routed` delivery has + `holder_run` equal to `launch.by`'s run. M1 must fail it. +- A verbs test: `talk` to a stopped role while `launch.by` runs prints the + waiting line once, skips a non-reply that arrives first and leaves it + unread, then prints the reply and exits 0. A mutant that drops row 142's + reply filter or row 146's `waitingLines` write must fail it. +- Mutants for both, with the kill table in BUILD.md. No product code + changes. + +### Out of scope + +Any change to `broker.mjs` or `cli.mjs`. Whether `waiting` says the target +is a launch instance is the next row. + +### Gate + +- `after` rows 146 and 142. +- Filbert approves on the row's issue naming the candidate manifest. +- bus and cli suites and every `scripts/test-*.sh` green on Sage's gate at + the landing target. + +## A message to a role launch.by can't launch says so at once + +### Problem + +Row 146 tells `launch.by` about every message to a stopped role. For a +target that isn't in the business's `launch.instances` (cto in a business +whose launch block doesn't list it), `launch.by` can't launch it, yet +`mosaic talk` prints "chief has been told" as if a launch may follow. +chief-of-staff's contract makes chief reply with why not, so the human +learns it one round trip late. Filbert's row 146 note 2. + +### Owner and reviewer + +- Owner: Dewey. +- Reviewer: Filbert. + +### Files owned + +- `packages/bus/src/broker.mjs`: `#waiting` and `#notice` only +- `packages/bus/tests/launch-notice.test.mjs` +- `packages/bus/README.md` +- `packages/cli/src/cli.mjs`: `waitingLines` only +- `packages/cli/tests/verbs.test.mjs` +- `docs/TOOLS.md` + +### What ships + +- `waiting` gains a boolean field saying whether the target is one of + `launch.instances`. Name and shape are Dewey's call, written in BUILD.md; + the field is additive, so older readers of `waiting` keep working. +- When the target isn't launchable, the broker still stores the message, + and the notice text to `launch.by` says the target isn't in its launch + block. Whether `launch.by` is told at all in that case is Dewey's call, + argued in BUILD.md with the contract text it relies on. +- `waitingLines` prints a line that says the role isn't in the launch + block, instead of "has been told". +- Tests for both cases, in and out of `launch.instances`, and mutants. + +### Out of scope + +Any schema change. Any change to which roles `launch.by` may launch, or to +the launch block's validation. + +### Gate + +- `after` the row above, which owns the same test files. +- Filbert approves on the row's issue naming the candidate manifest. +- bus, cli, business and webui suites and every `scripts/test-*.sh` green + on Sage's gate at the landing target. + +## project init cleans up after a failure and refuses a nested records repo + +### Problem + +Filbert's row 147 probe found two gaps and one untested refusal. + +1. A failed init can't be retried. When `git commit` fails, init refuses + `project-git` but leaves `.git`, the layout and `project.json` with no + commit. A second init refuses `project-not-empty`, check reports the + project valid, and the writer refuses `project-dirty` because nothing is + tracked. The README doesn't say what to do. +2. One project's `repo` may sit inside another project's `root`. + `projectRepo` checks the overlap only against the same project's `root`, + so init accepted a records repository nested in another code checkout. +3. Mutant Q2 removes the human-author refusal and the project test still + passes 14/14. + +### Owner and reviewer + +- Owner: Rocko. +- Reviewer: Filbert. + +### Files owned + +- `packages/project/src/` and `packages/project/tests/` +- `packages/project/README.md` +- `packages/business/src/business.mjs`: `projectRepo` only +- `packages/business/tests/project-repo.test.mjs` +- `docs/TOOLS.md` + +### What ships + +- Init removes what it created when a later step fails, and only that: a + directory that existed and was empty before init stays. A test makes + `git commit` fail and then runs init again successfully. +- `project check` refuses a project whose records repository has no + commit, with its own code. +- `projectRepo` refuses a `repo` inside any declared project's `root`, not + only its own, with a test. +- A test that the writer refuses a human-authored record path, which Q2 + must fail. +- Mutants for each change. + +### Out of scope + +Any change to the project layout, the record schemas or the `spec/` rule. + +### Gate + +- `after` row 147. +- Filbert approves on the row's issue naming the candidate manifest. +- project, business and cli suites and every `scripts/test-*.sh` green on + Sage's gate at the landing target.