diff --git a/agents/researcher/work/queue-220/r2/BUILD.md b/agents/researcher/work/queue-220/r2/BUILD.md index e47956bc6..64c8df5c8 100644 --- a/agents/researcher/work/queue-220/r2/BUILD.md +++ b/agents/researcher/work/queue-220/r2/BUILD.md @@ -461,3 +461,21 @@ under 2100 s. Reruns owed after r5 (run on Sage's CLEAR): the touched files whole (library-seats, serve, and the M8-e test), control-board whole, business whole, and every 220 mutant, M8-e included. Results are appended as a new entry. + +## Round 5b: correction of the M8-e kill claim, and the test that kills it (2026-10-23T20:21:52Z, sage-3715) + +Appended; nothing above is edited. This is a correction to the "Mutants to throw" table in this file (the M8-e +row, around line 270), which says M8-e, "`loadSeatSets` returns empty sets on any lstat error", is killed by the +`library-seats` ENOENT-vs-file tests. That claim is wrong. M8-e changes the lstat catch to +`return { librarySeats: new Set(), creativeSeats: new Set() };` for every error code, so only a test that makes lstat +fail with a code other than ENOENT can kill it. The file-as-businesses test and the dangling-symlink test I named +make lstat succeed or fail with ENOENT, never another code, so they pass under M8-e. Phase B on 2bb146b28 showed +the mutant surviving (out-mut, M8-e: no failure besides the base red). + +Added in this commit, `packages/business/tests/library-seats.test.mjs`: "M7/M8: a config directory under a regular +file throws (lstat fails with ENOTDIR); no empty set". The config path is a regular file, so +`lstat(/businesses)` fails with ENOTDIR; the test expects `BusinessError` matching "cannot list businesses". +It is a new test in this row's own file, in its own commit, and droppable without touching R1 or R2. + +The rerun of M8-e on r5 (the test must fail under it) is owed and runs on CLEAR; the result is appended as a new +entry. diff --git a/packages/business/tests/library-seats.test.mjs b/packages/business/tests/library-seats.test.mjs index e573b93ed..3cd0f86cf 100644 --- a/packages/business/tests/library-seats.test.mjs +++ b/packages/business/tests/library-seats.test.mjs @@ -80,6 +80,14 @@ test("M7/M8: a businesses symlink to a missing target throws; no empty set", (t) assert.throws(() => sets(dir), (err) => err instanceof BusinessError && /cannot list businesses/.test(err.message)); }); +test("M7/M8: a config directory under a regular file throws (lstat fails with ENOTDIR); no empty set", (t) => { + const root = mkdtempSync(join(tmpdir(), "row220-seats-notdir-")); + t.after(() => rmSync(root, { recursive: true, force: true })); + const dir = join(root, "config"); + writeFileSync(dir, "not a directory"); + assert.throws(() => sets(dir), (err) => err instanceof BusinessError && /cannot list businesses/.test(err.message)); +}); + test("M7/M8: a business file that can't be read throws; no empty set", (t) => { const { root, dir } = fixture(t); writeJson(join(dir, "businesses", "acme.json"), businessDoc(root, "acme"));