honker: row 194 b15 (b') (sage-2507): T15 drops the exited reviewer stand-in's registry entry by hand, the N6 convention, so the post-resume coder launch isn't refused on an entry with no provider/model; BUILD.md notes for (a) and (b')

This commit is contained in:
jason.woltje committed 2026-10-22 01:13:14 -05:00
1 parent 57cdee2889
commit 9cdc47d048
2 files changed
+33

No files matched your search

+31
View File
@@ -1052,3 +1052,34 @@ Doc-only. `git diff 899e30a80 <this commit> -- packages` is empty, so the runs c
- **Correction to N4 above.** "Until a human verb or a new end clears it" is wrong. `#aliveAfterFire`
checks only `session.ended`, and today nothing else clears the flag. It stays until the follow-up
row adds a clear.
### b15 (a), product change: the constructor's argument checks move ahead of the store reads (sage-2501)
- **Why.** The b14 runb8 (`run-20261022T052118Z`) went red on chief-of-staff T8b (`:864/868`). It
builds `new Broker({ store: null, roleFile: 'roles' })` and expects `roleFile must be a function`.
Row 191 (4bdc7e0e8) reads `dirname(store.directory)` in the constructor before the roleFile check,
so a null store throws its own TypeError first. The order was already like this at b8, but the last
194 run before 191 landed was b7, and runb8 had never run on 191's base until today.
- **Change.** The harnessOn (row 65), testerOn and roleFile type checks move up, unchanged, to just after
the invalid-business check and before `this.#businesses`, `this.#store` and every store read. Each
descriptive comment stays with its assignment, and one new comment line goes above the moved checks.
Nothing else moves. 191's lines are byte-identical. invalid-business stays first because it was
already ahead of every store read. Diff: broker.mjs +4/-3.
- **Pins.** chief-of-staff.test `:868` (roleFile, null store) now gets its message.
routes-verb.test `:89` (harnessOn 'yes', a real store) keeps its message.
### b15 (b'), test fixture: T15 drops the reviewer stand-in's registry entry (sage-2503, sage-2507)
- **Why.** The other b14 red was cli lifecycle T15 (`:744`). The debug run printed the launch log tail:
after the resume the coder launch closes `launch-failed` with why `running session has no exact
provider/model; reconcile before launching` (business/src/launch.mjs usageCounts, row 122). The
reviewer stand-in has exited, but its registry entry is still there, and that entry carries no
provider/model. The launcher's exit handler only removes the runs it started itself.
- **Not (b).** I didn't give standIn's entry provider/model (honker-0118). prepare()'s limits are
`{ sonnet: 1 }`, and the reviewer and coder both run claude-sonnet-5-5, so the stale entry would count
1 against a limit of 1 and the same launch would refuse on the limit instead. Sage ruled (b')
in place of (b) (sage-2507). standIn is unchanged.
- **Change.** T15, after `assert.equal(await x.exited, 143)`, adds
`s.launcher.registry.remove("acme", "reviewer-run")` with N6's comment. That's the convention at
N6 `:763-764`, and it's test-only. standIn's `t.after` removal still runs, and a second remove of
a missing run is the same no-op it already is in N6.
+2
View File
@@ -736,6 +736,8 @@ test("row 194 T15: while halted the pass closes a launch and a regenerate proces
for (const request of [launch, regen]) assert.deepEqual([s.state(request).state, s.state(request).done.refusal], ["closed", "processing-halted"], request);
assert.equal(s.state(end.request).state, "closed");
assert.equal(await x.exited, 143);
// The launcher's exit handler drops its own runs. A stand-in's entry goes by hand.
s.launcher.registry.remove("acme", "reviewer-run");
assert.deepEqual(launchLog(p.f).filter((e) => e.event === "lifecycle-end").map((e) => e.run), ["reviewer-run"]);
assert.equal(asked, 0, "a halted tick runs no thread pass");
assert.equal(s.running("coder").length, 0);