docs: brief for the row 146, 142 and 147 review follow-ups (#1645, #1646, #1647)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
jason.woltjeandClaude Opus 5.5 committed 2026-10-15 18:45:13 -05:00
1 parent 02ee7f6403
commit c66c7fb71d
1 file changed
+165
+165
View File
@@ -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.