Files

47 KiB
Raw Permalink Blame History

Row 224 — C2-05b broker lookups and typed tools (#1725)

Owner: Della; reviewer: Dewey. Assignment sage-2795; scope extension sage-2804. Base: 4f3fbc25a (Researcher C2-05a). Branch: della/row224. Brief: C2-05b in docs/plans/2026-10-20_case2-rows.md at aca16404c and 51cc0445c; design section 3, 5.3 M3 and 7.2; C2-05a BUILD rulings.

Execution boundary and progress

Code/docs and local Git only while row 253 holds the gate. No Node (including syntax checks), HTTPS Git, queue claim, test or push until Sage's CLEAR. Tests are written first; their RED/GREEN runs are deferred, not claimed. Queue next is deferred too: its executable uses Node. Sage assigned this row explicitly. After 253 and 216 land, rebase under a new branch name.

  • Pre-flight: query.mjs consumes {repo,commit,mapping}; broker cannot import Git/filesystem library code because it is in the sandbox import closure. Runtime injects the host lookup adapter; existing human file/status/sync stay.
  • Pre-flight: resolved has no project list and a library is never a checkout. Bundle needs an explicit library flag from launcher business configuration.
  • M3 reading: exact creative base is five lookups plus send_message; retain explicitly granted broker web_search/web_fetch for research/companion under landed C2-08 and sage-2804. No generic spec, task, evidence or decision tools. Residual (mos-1308): those reads lack broker action checks; their typed-tool absence is the only fence for creative roles. M1/M2 deny bash; broker-side refusal is outside this row. Mos confirmed this interpretation in mos-1308; design wording fix belongs to Gosalyn. Other definitions retain their current tools.
  • Multi-library businesses use an optional project ID; omit it only with one configured library. Universe is required for all five tools, including get.
  • Missing library uses the brief's library-not-configured; argument errors reuse invalid-request and C2-05a query codes. No new action or authority.

Manifest (draft code, unrun)

  • bus/src/broker.mjs: five lookup verbs, strict args, holder/business rechecks.
  • bus/src/runtime.mjs: host lookup adapter, stale-before-read sync, served pin.
  • harness/src/tools.mjs: five schemas; creative exact-set filtering.
  • harness/src/bundle.mjs: library flag forwarded to typedTools.
  • cli/src/launcher.mjs: one flag derived from trusted business projects.
  • bus/tests/library-lookups.test.mjs: real query/broker/socket/runtime cases.
  • harness/tests/library-tools.test.mjs: schemas, role snapshots, bundle parity.
  • cli/tests/thread-launch.test.mjs: flag reaches a real launched bundle with no library checkout.
  • agents/della/work/queue-224/BUILD.md: manifest, rulings and deferred verification ledger.

Verification ledger

No test or syntax-check run yet. Acceptance requires full bus/cli/harness suites and every scripts/test-*.sh on Sage's gate; focused files and affected CLI/ seat import-closure tests precede that only in an authorized CLEAR.

Coordination

Huey272 reports no runtime/bundle/launcher overlap. Rocko219 changes launcher THREAD_DEFINITIONS checks only, separate from our buildBundle flag argument. The launcher argument is required: bundle cannot derive library presence from checkout IDs (a library has no agent clone). No role, authority or config schema changes; library project entries are already validated and protected by M9.

Mount and pin impact (inspection only)

No new imports in broker.mjs or tools.mjs; no RUNNER_FILES or sandbox mount addition. runtime.mjs is host-only and already imports library index.mjs. Bundle forwards only a boolean, never a root/mapping/slot/credential. The existing import-closure tests are bus/tests/project-runtime.test.mjs and seat/tests/sandbox.test.mjs. Grep found no literal sha256 pin for runtime.mjs or bundle.mjs; bundle tests derive current source digests through SOURCES. Library sources remain in the existing whole-directory release copy.

Runs to schedule only after CLEAR

Set TMPDIR=/mnt/storage/scratch/tmp. Focused new bus/harness files first, then existing library.test.mjs, library-sync.test.mjs, project-runtime.test.mjs, harness creative/tools/spec-tools/bundle files and affected CLI launch tests. Follow with the required whole bus/cli/harness suites and Sage's full shell gate. No timing claim yet: use the repository/Sage per-file limits and record every command, outcome, elapsed time and timeout before acceptance. No focused skip or pattern run substitutes for whole-file gate evidence.

Read-through findings and residuals

  • Library get requires universe although the older design table omitted it; section 3 isolation rule and C2-05a's accepted API are binding.
  • Query type enum matches mapping.TYPES (five values); manuscript is a distinct lookup and not a find type. Unknown host-path/commit/business/accept fields are refused; explicit project is restricted to this business's library list.
  • Async reads recheck the live holder and current project revision. A stale read attempts sync, then takes the new served snapshot; a returned fetch failure/divergence keeps serving the old pin. Busy sync uses the current pin. Unreadable state, no served commit or unsafe configuration refuse. Query and sync never hold a SQLite transaction over await.
  • Processing halt refuses new agent lookup work and rechecks before returning async results. Existing human library file/status/sync behavior is unchanged.
  • Timer sync and reads still use C2-03a's 60-second contract. No timer tuning or resource-limit schema is introduced by this row. Q222 creative reply settings are in C2-06; no reply guard or writing capability is implemented here.
  • The generic tool socket's existing 60-second client timeout can precede the server's 120-second Git timeout. This row does not change the generic timeout; a timed-out lookup is read-only and retryable, never a write/outcome claim.
  • All tests are authored but unrun. No RED, GREEN, syntax, runtime performance, sandbox, broker/harness suite, shell gate, claim or push evidence exists yet.

Candidate review checklist (read-through only)

  • Five verbs mapped to real C2-05a methods, all require universe.
  • Default sole library or explicit owned project; no caller repo/commit.
  • Human-only file/status/sync gates kept; lookup holder rechecked.
  • Async socket dispatch includes lookup verbs through LIBRARY_VERBS.
  • Stale/unknown fetch syncs first; results use current immutable served pin.
  • Six/eight creative names per mos-1308; other roles retain their tools.
  • Launcher -> bundle -> typedTools passes presence without a library clone.
  • No imports added to sandbox source closure; no mount change.
  • Execute new tests, RED characterization, full files/suites after CLEAR.
  • Rebase after rows 253/216 land, under a new branch name.
  • Claim/push only in Sage-authorized gap; Dewey review and Sage gate.

Candidate preservation commits are explicitly unrun under sage-2795; they are not completion, green-suite or landing claims. No dependencies installed.

Correction: the first committed-range diff --check found a blank line at EOF in the new library-tools test, missed while it was untracked. Removed in a follow-up local commit; the complete range must be checked again. No tests ran.

Shared-log receipts for Sage (sage-2815)

The shared logs are unchanged from the base in this row. Sage appends these receipts in the landing sweep; they are preserved here, not in the manifest.

For BUILD-LOG.md:

2026-10-22T16:36:30Z | Della row224 C2-05b #1725 preparation | Before: C2-05a queries exist at 4f3fbc25a but no broker lookup verbs or typed tools. Scope: broker/tools plus Sage-authorized runtime/bundle integration, tests and docs. Existing human-only library reads retained; five agent queries require a live holder and trusted configured source. Code/docs only under row253 gate; no Node/test/push/claim. Runtime ownership coordinated with Rocko219/Huey272.

For docs/SESSIONS.md:

2026-10-22T16:36:30Z | Della (sage-2795 / sage-2804, Q220) | Row 224 C2-05b #1725, della/row224 base 4f3fbc25a | Read both pinned briefs and C2-05a source; preparing broker/typed tools and authorized host runtime/bundle seams. No queue command, Node, HTTPS Git, claim, test or push during Gander gate. Dewey reviewer; Rocko/Huey runtime coordination sent. Tests and integration verification deferred to CLEAR.

Local-only draft pins 19c0a7adf/7cf39c390 are superseded by the log-free candidate. Saved as local branch della/row224-draft-with-logs before rebuilding the unpublished candidate commit; no remote history changed.

Dewey dewey-0852 and Sage sage-2819 — focused corrections

B1: inline freshness uses max(lastFetch, lastError.at), not lastFetch alone. An error within 60 seconds counts as a recent attempt, so later lookups serve the old served pin without another fetch. Keep inline sync: the brief requires it and businesses without timed libraries have no sync timer. The extended failed-fetch test makes reads at +1, +59,999 and +60,000 ms (one attempt total), then +60,001 ms (second attempt). All reads must return the old commit.

Required mutant M-B1: remove lastError.at from recentAttempt. The repeated reads must fail the attempted-count assertion. This mutant has NOT been run.

Residual (Sage will defer): the first inline fetch in each outage window can still exceed the tool timeout (60 seconds, or the runner broker client’s 30 seconds). Bounding that fetch is out of scope for 224. Subsequent reads are paced by persisted lastError.at. No claim of first-read outage latency.

N1: whole bus, cli and harness suites are required, plus the shell gate. If the new thread-launch integration test skips due to sandboxProblem(), name the skip; a skip is not launcher integration proof. N2: cli/tests/thread-launch.test.mjs now depends on library/tests/helpers.mjs mappingEntry() and library/tests/fixtures/mapping.json. Changes to that fixture must rerun the CLI launch file. N3: harness/tests/library-tools.test.mjs compares the type enum to mapping.mjs TYPES, so adding a mapped type cannot silently leave the typed tool behind.

These edits are local code/docs only. No Node, RED/GREEN run, mutant, claim, HTTPS Git or push. New local pin goes to Dewey/Mos/Sage for focused review.

sage-4163 — row224-r2 static rebase, 2026-10-24

New isolated worktree: /mnt/storage/scratch/della-row224-r2. Branch della/row224-r2, base refactor 487500a16f4ab5902c318509fdec6acc56a543ca. Only the two row-owned commits were cherry-picked, in order: 38e322ea0 -> 327073400; 23816cf28 -> e138b2c55. No old prerequisite commits were copied into this series. Rows 216 and 217 are now upstream. Row 266 remains a landing dependency: rebase on its landing when Sage announces it. No broker hunk touches room.read or its hydration.

One content conflict: the footer of cli/tests/thread-launch.test.mjs. Kept both upstream C2-09a test bodies and every assertion, followed by our unchanged C2-05b launched-bundle test. No test was removed or weakened. Range-diff shows only that context relocation and the upstream sandbox workspace expression beside launcher's added library flag. The B1 commit is patch-identical.

B1 answer: e138b2c55 retains max(lastFetch, lastError.at), the repeated-read regression and M-B1 specification. Dewey already checked the original fix at 23816cf28 in dewey-0853; it still needs executed mutant and gate evidence. N2 dependency also includes harness/tests/library-tools.test.mjs importing library/src/mapping.mjs TYPES; changes there must rerun that harness file.

Static checks: complete-range git diff --check clean; nine manifest paths. Scanned packages//tests for every changed basename alongside literal 64-hex hashes (three lines on either side): no matching hash pins. Broker and tools add no imports; no RUNNER_FILES or sandbox mount changes. No Node, syntax check, test, mutant, install or build was run. The historical verification ledger above records the original preparation, not current gate permission. Under sage-4163 the required gate is Dewey's manifest approval, whole bus and harness suites, plus every scripts/test-.sh on Sage's gate; record every skip. Tests and mutants wait for Sage's explicit CLEAR. Static Git and pushing this new branch are authorized now. Shared logs remain unchanged; Sage owns their append-only landing receipts.

sage-4181 — row266 landing rebase, 2026-10-24

Rebased the complete r2 series onto refactor 3e5041b43b36d7f1c5ba7ce2f14b3634fe0955db under new branch della/row224-r3; r2 is preserved, no force-push. No conflicting files and no manual conflict resolutions. Range-diff: all three prior commits equal (212aef616, 82d6cc62c, c509dcb6e). B1 remains patch-identical. Complete-range diff --check is clean. No test, syntax or mutant run.

Own touched test files, each to run whole in Sage's slot:

  • packages/bus/tests/library-lookups.test.mjs
  • packages/cli/tests/thread-launch.test.mjs
  • packages/harness/tests/library-tools.test.mjs

Tests changed by the new upstream base, also named for the rebase-rule gate:

  • packages/bus/tests/room-check.test.mjs
  • packages/plugins/tests/room-channel.test.mjs
  • packages/supervisor/tests/pressure.test.mjs
  • packages/supervisor/tests/purity.test.mjs
  • packages/supervisor/tests/rules.test.mjs
  • packages/webui/tests/room-browser.test.mjs
  • packages/webui/tests/room-http.test.mjs

None of those seven upstream test files has a row224-owned diff. Full bus and harness suites plus every scripts/test-*.sh remain the row gate; the listed CLI and upstream files require whole-file runs under sage-4181 too. Dewey's delta review follows Sage's run. No CLEAR is inferred from the rebase.

sage-4192 CLEAR — run receipt and old-test stop, 2026-10-24

Candidate named by CLEAR: a1a7357457. Fresh mktemp TMPDIR: /mnt/storage/scratch/tmp/della-224-4192.r3L7cj. Each command used nice -n 19 and timeout -k 10 300 node --test FILE. Inherited OS niceness was -4, so nice initially yielded 15; corrected the current runner tree to absolute 19 during the CLI run. Future runs must set absolute 19 before spawning. No other seat's processes were changed.

First whole bus/tests/library-lookups.test.mjs run: 11 tests, 8 pass, 3 fail, 0 skipped, duration 1.173 s (exit 1). All three are this row's new tests. Root causes: Broker clones businesses, so mutating the original fixture did not publish the second project or the delisting; runtime requires the selected harness to be enabled. Fixed only new fixture setup: reloadBusiness after each of the two changes and plugins.harness ['pi'] in runtime fixture. All assertions and production code are unchanged. Whole-file rerun: 11 pass, 0 fail/cancelled/skipped, 1.322 s (exit 0). B1 regression included and passed; M-B1 has not been executed.

Next whole cli/tests/thread-launch.test.mjs reported OLD-test reds at :167, :216 and :241. On observing them stopped only this run's process tree; no rerun or next file was started. Interrupted-file summary: 0 pass, 3 fail, 1 cancelled, 0 skipped, 62.988 s. Returned slot to Sage in della-0041 under mos-1592. No old test changed. No in-review move: the third own file, all seven new-base files, both whole suites and mutant evidence remain pending. No shell/full landing gate was run.

Exact completed run receipts:

{"name": "packages/bus/tests/library-lookups.test.mjs", "command": ["nice", "-n", "19", "timeout", "-k", "10", "300", "node", "--test", "packages/bus/tests/library-lookups.test.mjs"], "exit": 1, "seconds": 1.173, "TMPDIR": "/mnt/storage/scratch/tmp/della-224-4192.r3L7cj"}
{"name": "packages/bus/tests/library-lookups.test.mjs", "command": ["nice", "-n", "19", "timeout", "-k", "10", "300", "node", "--test", "packages/bus/tests/library-lookups.test.mjs"], "exit": 0, "seconds": 1.322, "TMPDIR": "/mnt/storage/scratch/tmp/della-224-4192.r3L7cj"}

Old-test failure output (interrupted whole file, not a whole-file pass):

✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20120.78425ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (185.485131ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30082.743341ms)

Interrupted while running:

⚠ packages/cli/tests/thread-launch.test.mjs (packages/cli/tests/thread-launch.test.mjs:1:1)
✖ packages/cli/tests/thread-launch.test.mjs (62982.9717ms)
ℹ tests 4
ℹ suites 0
ℹ pass 0
ℹ fail 3
ℹ cancelled 1
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 62987.534861

✖ failing tests:

test at packages/cli/tests/thread-launch.test.mjs:167:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20120.78425ms)
  Error: timed out waiting
      at until (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:48:9)
      at async ask (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:153:17)
      at async TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:179:17)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)

test at packages/cli/tests/thread-launch.test.mjs:216:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (185.485131ms)
  AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
  + actual - expected

  + 'harness-binary-missing'
  - 'capacity-full'

      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:227:10)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
    generatedMessage: true,
    code: 'ERR_ASSERTION',
    actual: 'harness-binary-missing',
    expected: 'capacity-full',
    operator: 'strictEqual',
    diff: 'simple'
  }

test at packages/cli/tests/thread-launch.test.mjs:241:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30082.743341ms)
  Error: timed out waiting
      at until (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:48:9)
      at async TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:251:3)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)

test at packages/cli/tests/thread-launch.test.mjs:1:1
✖ packages/cli/tests/thread-launch.test.mjs (62982.9717ms)
  'Promise resolution is still pending but the event loop has already resolved'

Receipt correction: copied test output contained two whitespace-only lines; complete-range diff-check caught them. Trimmed those log lines in this follow-up; no test/code or failure text changed, and no test was rerun.

sage-4195 / mos-1595 — pre-install evidence

No canonical node_modules link made; that suggestion was refused under mos-1575. Before installing anything in this worktree, ran:

$ ls -l node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli.js
ls: cannot access 'node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli.js': No such file or directory
rc=2

The file is missing, so the authorized local npm ci follows. This is an environment finding; prior existing-test reds do not establish a row-code regression. No old-test edit or rerun preceded this CLEAR.

sage-4195 — install and single-run STOP receipt

$ [ -L node_modules ] && rm node_modules; timeout -k 10 900 npm ci --ignore-scripts --no-audit --no-fund
npm warn deprecated [email protected]: Use your platform's native DOMException instead
added 128 packages in 2s
npm_ci_rc=0
$ readlink -f node_modules/.bin/pi
/mnt/storage/scratch/della-row224-r2/node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli.js

One authorized whole-file invocation, no retry or test edit. Absolute runner and timeout niceness 19 before launch; observed Node parent/worker niceness 16 during execution (host ananicy rule), recorded without stopping for nice. Fresh TMPDIR and command in receipt below. Stopped test process tree upon observing existing-test reds. Interrupted summary: 0 pass, 2 fail, 1 cancelled, 0 skipped; exit 1, 40.056 s. This is not a whole-file pass. The capacity test now receives launch-failed, rather than harness-binary-missing. Root cause of that launch failure is not established. No assertion/production changes. Slot returned to Sage in della-0044 for escalation to Mos; all other files, suites and M-B1 remain held pending their own CLEAR.

{
  "command": [
    "timeout",
    "-k",
    "10",
    "900",
    "node",
    "--test",
    "packages/cli/tests/thread-launch.test.mjs"
  ],
  "TMPDIR": "/mnt/storage/scratch/tmp/della-224-4195._yq176su",
  "exit": 1,
  "seconds": 40.056,
  "start_runner_nice": 19,
  "observed_timeout_nice": 19
}

Failure output:

✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20109.08171ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (330.738356ms)

Interrupted while running:

⚠ packages/cli/tests/thread-launch.test.mjs (packages/cli/tests/thread-launch.test.mjs:1:1)
✖ packages/cli/tests/thread-launch.test.mjs (40023.3188ms)
ℹ tests 3
ℹ suites 0
ℹ pass 0
ℹ fail 2
ℹ cancelled 1
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 40027.912798

✖ failing tests:

test at packages/cli/tests/thread-launch.test.mjs:167:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20109.08171ms)
  Error: timed out waiting
      at until (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:48:9)
      at runNextTicks (node:internal/process/task_queues:65:5)
      at process.processTimers (node:internal/timers:615:9)
      at async ask (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:153:17)
      at async TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:179:17)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)

test at packages/cli/tests/thread-launch.test.mjs:216:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (330.738356ms)
  AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
  + actual - expected

  + 'launch-failed'
  - 'capacity-full'

      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:227:10)
      at runNextTicks (node:internal/process/task_queues:65:5)
      at process.processTimers (node:internal/timers:615:9)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
    generatedMessage: true,
    code: 'ERR_ASSERTION',
    actual: 'launch-failed',
    expected: 'capacity-full',
    operator: 'strictEqual',
    diff: 'simple'
  }

test at packages/cli/tests/thread-launch.test.mjs:1:1
✖ packages/cli/tests/thread-launch.test.mjs (40023.3188ms)
  'Promise resolution is still pending but the event loop has already resolved'

sage-4204 — chief credential fixture correction (unrun)

Sage's control pair with a 29-byte TMPDIR: base 3e5041b43 passes 14/14; ed985c044 passes all 14 existing tests but this row's new CLI fixture refuses chief-library-gitea-required before launch. Added only chief.credentials.gitea as a copy of the fixture coder's reference in the C2-05b edit callback, matching cli/tests/launcher.test.mjs:35 and trackers-boot.test.mjs:17. This is a reference to synthetic fixture credentials; no credential value was read or introduced. All assertions, old tests and production code unchanged. No run performed.

The earlier 48-byte TMPDIR explains the launch-failed reds through the 107-byte tools.sock limit, as confirmed by Sage's control. Future named CLEAR uses shell TMPDIR=$(mktemp -d /mnt/storage/scratch/tmp/gXXX), 29 bytes with alphanumeric suffix, not Python mkdtemp or a canonical node_modules link. Next authorized run order: whole thread-launch first, other eight files, whole bus/harness suites, M-B1; all await next CLEAR after Fethry/Gyro slots.

sage-4208 — first-file red, sequence stopped

Named candidate 6160b4981. Whole thread-launch.test.mjs invoked once. Shell-created TMPDIR /mnt/storage/scratch/tmp/gCXV, 29 bytes; absolute runner and timeout niceness 19 at start, Node observed 16 afterwards (host policy). 15 tests: all 14 existing tests pass, the one new C2-05b fails; no skips or cancellations. Exit 1 in 18.740 s. Stopped sequence and returned slot to Sage in della-0047 before any edit or rerun. No other file, suite or mutant ran. The original r3 list has nine files beyond thread-launch (two row-owned plus seven upstream), rather than eight; none started in this CLEAR.

New-test failure is call(...).find is not a function in existing ask helper :153, called by new C2-05b :550. Root cause not yet established; no assertion, fixture or production change made. Await Sage's own-new-test ruling.

Exact run receipt:

{"number": 1, "name": "packages/cli/tests/thread-launch.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/cli/tests/thread-launch.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gCXV", "start_nice": 19, "observed_timeout_nice": 19, "exit": 1, "seconds": 18.74}

Failure output:

ℹ tests 15
ℹ suites 0
ℹ pass 14
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 18707.936662

✖ failing tests:

test at packages/cli/tests/thread-launch.test.mjs:540:1
✖ C2-05b a real launched bundle gets lookups for a library project without a library checkout (139.729167ms)
  TypeError: call(...).find is not a function
      at file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:153:71
      at until (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:44:21)
      at ask (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:153:23)
      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/cli/tests/thread-launch.test.mjs:550:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)

sage-4210 — new-test async citation fixture fix

Only C2-05b now inlines send/wait, awaits thread.messages before .find, and keeps the from_role assistant / to_role human assertions previously provided by ask. Comment names broker.mjs:4854 async citation hydration. Existing ask, old tests and production unchanged. This is Sage's own-new-test ruling under mos-1590; Dewey re-reviews the delta. Whole-file rerun once authorized, then the nine other files, whole bus/harness, M-B1 and clean-tree check on green. Each gets a fresh shell gXXX TMPDIR and absolute nice 19; any red stops.

sage-4210 — resumed sequence, harness new-test red

On 8f1b045f4: whole CLI 15/15 pass, no skips (19.164 s); whole bus lookup 11/11 pass, no skips (1.309 s). Own new harness file 1 pass, 3 fail, no skips (0.129 s); stopped sequence, returned slot in della-0050 before edits/reruns. Each invocation used fresh shell gXXX TMPDIR, 29 bytes. Runner was set to absolute nice 19 before first spawn; host subsequently reniced runner too, so timeout process observations were 19, -4, -4. Correct future driver to set absolute 19 in each child before exec, as well as parent. Priority-only change did not stop these runs. No claim that later timeout processes retained 19.

All three new harness failures are fixture validation: roles.bean.credentials must reference gitea (got none). Shared role() helper in this row creates bean without its required credential reference. No fixture/assertion/production edit or rerun yet; awaiting Sage's ruling. Seven upstream files, whole bus/harness suites and M-B1 not run. No full landing gate or in-review move.

Exact receipts:

{"number": 1, "name": "packages/cli/tests/thread-launch.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/cli/tests/thread-launch.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gBj5", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 19.164}
{"number": 2, "name": "packages/bus/tests/library-lookups.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/bus/tests/library-lookups.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gD8X", "start_nice": 19, "observed_timeout_nice": -4, "exit": 0, "seconds": 1.309}
{"number": 3, "name": "packages/harness/tests/library-tools.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/harness/tests/library-tools.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gt7o", "start_nice": 19, "observed_timeout_nice": -4, "exit": 1, "seconds": 0.129}

Harness failure output:

✖ M3: per-role snapshots contain six names, or eight with the C2-08 web grant (6.427541ms)
✔ every noncreative role gets lookups when a library is configured, not otherwise (6.837154ms)
✖ lookup schemas require a universe even for get, include paging, and cannot select repo or commit (1.52147ms)
✖ bundle flag reaches both harness tool manifests and creative prompt without generic tools (2.019053ms)
ℹ tests 4
ℹ suites 0
ℹ pass 1
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 99.111266

✖ failing tests:

test at packages/harness/tests/library-tools.test.mjs:19:1
✖ M3: per-role snapshots contain six names, or eight with the C2-08 web grant (6.427541ms)
  Error [BusinessError]: /mnt/storage/scratch/tmp/gt7o/mosaic-harness-biz-CZEENl/businesses/acme.json roles.bean.credentials must reference exactly the services its role definition needs (gitea; got none)
      at refuse (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/errors.mjs:12:9)
      at checkCredentialMap (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:51:5)
      at checkRoles (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:162:20)
      at validateBusinessDocument (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:251:34)
      at resolvedFor (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/helpers.mjs:46:20)
      at role (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:13:49)
      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:21:42)
      at Test.runInAsyncScope (node:async_hooks:226:14)
      at Test.run (node:internal/test_runner/test:1402:25)
      at Test.start (node:internal/test_runner/test:1262:17) {
    exitCode: 2
  }

test at packages/harness/tests/library-tools.test.mjs:38:1
✖ lookup schemas require a universe even for get, include paging, and cannot select repo or commit (1.52147ms)
  Error [BusinessError]: /mnt/storage/scratch/tmp/gt7o/mosaic-harness-biz-iAwXhO/businesses/acme.json roles.bean.credentials must reference exactly the services its role definition needs (gitea; got none)
      at refuse (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/errors.mjs:12:9)
      at checkCredentialMap (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:51:5)
      at checkRoles (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:162:20)
      at validateBusinessDocument (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:251:34)
      at resolvedFor (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/helpers.mjs:46:20)
      at role (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:13:49)
      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:39:40)
      at Test.runInAsyncScope (node:async_hooks:226:14)
      at Test.run (node:internal/test_runner/test:1402:25)
      at Test.processPendingSubtests (node:internal/test_runner/test:974:18) {
    exitCode: 2
  }

test at packages/harness/tests/library-tools.test.mjs:57:1
✖ bundle flag reaches both harness tool manifests and creative prompt without generic tools (2.019053ms)
  Error [BusinessError]: /mnt/storage/scratch/tmp/gt7o/mosaic-harness-biz-c2N3Bv/businesses/acme.json roles.bean.credentials must reference exactly the services its role definition needs (gitea; got none)
      at refuse (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/errors.mjs:12:9)
      at checkCredentialMap (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:51:5)
      at checkRoles (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:162:20)
      at validateBusinessDocument (file:///mnt/storage/scratch/della-row224-r2/packages/business/src/business.mjs:251:34)
      at resolvedFor (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/helpers.mjs:46:20)
      at role (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:13:49)
      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/harness/tests/library-tools.test.mjs:60:65)
      at Test.runInAsyncScope (node:async_hooks:226:14)
      at Test.run (node:internal/test_runner/test:1402:25)
      at Test.processPendingSubtests (node:internal/test_runner/test:974:18) {
    exitCode: 2
  }

sage-4213 — creative fixture credential reference

Only the new library-tools.test.mjs role() helper now gives bean its required gitea reference copied from coder, matching creative.test.mjs:27. No assertion, shared helper, old test or production change. One whole harness-file retry then seven upstream files, whole bus/harness, M-B1 and clean-tree check are cleared; no CLI or lookup rerun needed (both passed, unchanged). Each child sets absolute niceness 19 before exec, with fresh shell gXXX TMPDIR.

sage-4213 — GREEN verification and M-B1 receipt

Verified candidate e4c0c8931; prior CLI/lookup passes on 8f1b045f4 remain applicable under sage-4213 (only harness fixture and receipts changed). Every run below used a fresh shell mktemp -d /mnt/storage/scratch/tmp/gXXX, 29 bytes. Each child set absolute niceness 19 immediately before exec; timeout process observations were 19 for all ten runs and M-B1. Bus-suite Node later observed at nice 16, consistent with host ananicy policy; no stop for nice. No unexpected red, cancellation or skip in this cleared sequence.

Whole-file results:

File or suite Pass Fail Skip Seconds
packages/harness/tests/library-tools.test.mjs 4 0 0 0.213
packages/bus/tests/room-check.test.mjs 2 0 0 0.21
packages/plugins/tests/room-channel.test.mjs 1 0 0 0.102
packages/supervisor/tests/pressure.test.mjs 15 0 0 0.101
packages/supervisor/tests/purity.test.mjs 1 0 0 0.102
packages/supervisor/tests/rules.test.mjs 29 0 0 0.102
packages/webui/tests/room-browser.test.mjs 9 0 0 6.801
packages/webui/tests/room-http.test.mjs 7 0 0 0.183
bus-whole 1011 0 0 30.46
harness-whole 176 0 0 13.346

Earlier cleared whole CLI 15/15 (19.164 s), bus lookup 11/11 (1.309 s), zero skips. Whole bus includes lookup again; whole harness includes fixture file again. No full shell/landing gate run: every scripts/test-*.sh belongs to Sage's landing gate, not this CLEAR.

M-B1: temporarily replaced only lastError.at freshness term with -Infinity. Whole lookup file: 10 pass, 1 expected fail, no skips; killed at :178 attempted assertion (actual 2, expected 1, recent lastError prevents another sync). Restored exact original runtime bytes in finally. Afterwards git diff --stat and git status --porcelain both empty against committed e4c0c8931, before adding this receipt. Compared with named 6160b4981 the only later package changes are Sage-authorized async CLI fixture and harness credential fixture; no mutant or production change remains. No extra post-restore rerun.

Exact commands, TMPDIRs, exit codes and elapsed receipts:

{"number": 1, "name": "packages/harness/tests/library-tools.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/harness/tests/library-tools.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gct3", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.213}
{"number": 2, "name": "packages/bus/tests/room-check.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/bus/tests/room-check.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/g0ki", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.21}
{"number": 3, "name": "packages/plugins/tests/room-channel.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/plugins/tests/room-channel.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gyTq", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.102}
{"number": 4, "name": "packages/supervisor/tests/pressure.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/supervisor/tests/pressure.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gK1n", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.101}
{"number": 5, "name": "packages/supervisor/tests/purity.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/supervisor/tests/purity.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gFne", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.102}
{"number": 6, "name": "packages/supervisor/tests/rules.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/supervisor/tests/rules.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gs9Y", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.102}
{"number": 7, "name": "packages/webui/tests/room-browser.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/webui/tests/room-browser.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gP9P", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 6.801}
{"number": 8, "name": "packages/webui/tests/room-http.test.mjs", "command": ["timeout", "-k", "10", "900", "node", "--test", "packages/webui/tests/room-http.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gP9G", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 0.183}
{"number": 9, "name": "bus-whole", "command": ["timeout", "-k", "10", "1800", "node", "--test", "packages/bus/tests/access-revoke.test.mjs", "packages/bus/tests/account-migration.test.mjs", "packages/bus/tests/address.test.mjs", "packages/bus/tests/agents.test.mjs", "packages/bus/tests/approval-binding.test.mjs", "packages/bus/tests/broker.test.mjs", "packages/bus/tests/business.test.mjs", "packages/bus/tests/channel-proof.test.mjs", "packages/bus/tests/chief-of-staff.test.mjs", "packages/bus/tests/citation-availability.test.mjs", "packages/bus/tests/citation-guard.test.mjs", "packages/bus/tests/citation-runtime.test.mjs", "packages/bus/tests/comment-cursors.test.mjs", "packages/bus/tests/comment-migration.test.mjs", "packages/bus/tests/console-decide.test.mjs", "packages/bus/tests/creative.test.mjs", "packages/bus/tests/credential-claim.test.mjs", "packages/bus/tests/credential-status.test.mjs", "packages/bus/tests/credential-store.test.mjs", "packages/bus/tests/credential-verbs.test.mjs", "packages/bus/tests/credentials.test.mjs", "packages/bus/tests/csuite-messaging.test.mjs", "packages/bus/tests/daily-quota-runtime.test.mjs", "packages/bus/tests/decision-close.test.mjs", "packages/bus/tests/decision-route.test.mjs", "packages/bus/tests/decisions.test.mjs", "packages/bus/tests/end-launch.test.mjs", "packages/bus/tests/fire-revokes-grants.test.mjs", "packages/bus/tests/gitea-grant-docker.test.mjs", "packages/bus/tests/gitea-grant.test.mjs", "packages/bus/tests/gitea-migration.test.mjs", "packages/bus/tests/grant-enroll.test.mjs", "packages/bus/tests/grant-executor.test.mjs", "packages/bus/tests/grant-host.test.mjs", "packages/bus/tests/grant-migration.test.mjs", "packages/bus/tests/grant-scope-runtime.test.mjs", "packages/bus/tests/grant-scope.test.mjs", "packages/bus/tests/hard-waits.test.mjs", "packages/bus/tests/host-run.test.mjs", "packages/bus/tests/host-tools.test.mjs", "packages/bus/tests/human.test.mjs", "packages/bus/tests/instances-verb.test.mjs", "packages/bus/tests/interpreter.test.mjs", "packages/bus/tests/land.test.mjs", "packages/bus/tests/launch-notice.test.mjs", "packages/bus/tests/launcher-released.test.mjs", "packages/bus/tests/library-credential.test.mjs", "packages/bus/tests/library-lookups.test.mjs", "packages/bus/tests/library-sync.test.mjs", "packages/bus/tests/library.test.mjs", "packages/bus/tests/lifecycle-revoke.test.mjs", "packages/bus/tests/lifecycle-verbs.test.mjs", "packages/bus/tests/limit-checks.test.mjs", "packages/bus/tests/limit-stop.test.mjs", "packages/bus/tests/limits-runtime.test.mjs", "packages/bus/tests/limits.test.mjs", "packages/bus/tests/message-citation.test.mjs", "packages/bus/tests/message-filter.test.mjs", "packages/bus/tests/messages.test.mjs", "packages/bus/tests/messaging.test.mjs", "packages/bus/tests/name-migration.test.mjs", "packages/bus/tests/names.test.mjs", "packages/bus/tests/peer-transport.test.mjs", "packages/bus/tests/peercred.test.mjs", "packages/bus/tests/plugins-verb.test.mjs", "packages/bus/tests/principal.test.mjs", "packages/bus/tests/process.test.mjs", "packages/bus/tests/processing-runtime.test.mjs", "packages/bus/tests/processing-timeout.test.mjs", "packages/bus/tests/processing-web.test.mjs", "packages/bus/tests/processing.test.mjs", "packages/bus/tests/project-await.test.mjs", "packages/bus/tests/project-files.test.mjs", "packages/bus/tests/project-runtime.test.mjs", "packages/bus/tests/publish.test.mjs", "packages/bus/tests/reload.test.mjs", "packages/bus/tests/replies.test.mjs", "packages/bus/tests/requirements.test.mjs", "packages/bus/tests/review.test.mjs", "packages/bus/tests/revoke-window.test.mjs", "packages/bus/tests/room-check.test.mjs", "packages/bus/tests/rooms.test.mjs", "packages/bus/tests/routes-verb.test.mjs", "packages/bus/tests/schema.test.mjs", "packages/bus/tests/session-clear.test.mjs", "packages/bus/tests/session-compactions.test.mjs", "packages/bus/tests/sessions.test.mjs", "packages/bus/tests/single-use.test.mjs", "packages/bus/tests/spec-migration.test.mjs", "packages/bus/tests/spec-review.test.mjs", "packages/bus/tests/spec-socket.test.mjs", "packages/bus/tests/spec.test.mjs", "packages/bus/tests/staff-request.test.mjs", "packages/bus/tests/state.test.mjs", "packages/bus/tests/store.test.mjs", "packages/bus/tests/task-page.test.mjs", "packages/bus/tests/task-read.test.mjs", "packages/bus/tests/tasks.test.mjs", "packages/bus/tests/tester-threads.test.mjs", "packages/bus/tests/tester-writes.test.mjs", "packages/bus/tests/tester.test.mjs", "packages/bus/tests/thread-claims.test.mjs", "packages/bus/tests/thread-migration.test.mjs", "packages/bus/tests/thread-shares.test.mjs", "packages/bus/tests/threads.test.mjs", "packages/bus/tests/transport.test.mjs", "packages/bus/tests/usage-broker.test.mjs", "packages/bus/tests/usage-migration.test.mjs", "packages/bus/tests/usage-runtime.test.mjs", "packages/bus/tests/usage.test.mjs", "packages/bus/tests/user-principal.test.mjs", "packages/bus/tests/viewer.test.mjs", "packages/bus/tests/web.test.mjs", "packages/bus/tests/workflow-roles.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/gfwc", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 30.46}
{"number": 10, "name": "harness-whole", "command": ["timeout", "-k", "10", "1800", "node", "--test", "packages/harness/tests/bundle.test.mjs", "packages/harness/tests/citation-runner.test.mjs", "packages/harness/tests/claude-gate.test.mjs", "packages/harness/tests/claude-session.test.mjs", "packages/harness/tests/creative.test.mjs", "packages/harness/tests/gate.test.mjs", "packages/harness/tests/git-tools.test.mjs", "packages/harness/tests/library-tools.test.mjs", "packages/harness/tests/mcp-server.test.mjs", "packages/harness/tests/pi-session.test.mjs", "packages/harness/tests/raise-domain.test.mjs", "packages/harness/tests/runner.test.mjs", "packages/harness/tests/skills.test.mjs", "packages/harness/tests/spec-tools.test.mjs", "packages/harness/tests/tools.test.mjs"], "TMPDIR": "/mnt/storage/scratch/tmp/g8Yn", "start_nice": 19, "observed_timeout_nice": 19, "exit": 0, "seconds": 13.346}
{
  "mutant": "M-B1",
  "change": "drop lastError.at term from recentAttempt",
  "command": [
    "timeout",
    "-k",
    "10",
    "900",
    "node",
    "--test",
    "packages/bus/tests/library-lookups.test.mjs"
  ],
  "TMPDIR": "/mnt/storage/scratch/tmp/g8my",
  "start_nice": 19,
  "observed_timeout_nice": 19,
  "exit": 1,
  "seconds": 1.359
}
$ git diff --stat
(empty)
$ git status --porcelain
(empty)
HEAD=e4c0c8931 (authorized fixture fix after 6160b4981)

M-B1 output:

✔ all five agent verbs read the configured served commit through real queries (130.428728ms)
✔ each verb refuses missing universe and unknown keys before host work (78.900515ms)
✔ no library, missing host adapter and undeclared project refuse library-not-configured (149.899073ms)
✔ reads need the current holder on each call; human/tester/reader are not agents (90.636537ms)
✔ releasing a claim during an async lookup fences the response (60.938885ms)
✔ a business library removed during an async read cannot leak its result (51.783488ms)
✖ freshness boundary, unknown last fetch and failed fetch still use immutable served state (123.453393ms)
✔ an unreadable sync state fails closed; a busy sync keeps serving the existing pin (89.763849ms)
✔ a stale lookup sees the commit published by its sync, not the prior served commit (108.213675ms)
✔ real socket awaits lookup results and rechecks rejected query arguments (152.413684ms)
✔ runtime actually injects the lookup adapter, without exposing human library.file (157.701866ms)
ℹ tests 11
ℹ suites 0
ℹ pass 10
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1327.433364

✖ failing tests:

test at packages/bus/tests/library-lookups.test.mjs:153:1
✖ freshness boundary, unknown last fetch and failed fetch still use immutable served state (123.453393ms)
  AssertionError [ERR_ASSERTION]: recent lastError prevents another sync even though lastFetch is null

  2 !== 1

      at TestContext.<anonymous> (file:///mnt/storage/scratch/della-row224-r2/packages/bus/tests/library-lookups.test.mjs:178:12)
      at async Test.run (node:internal/test_runner/test:1409:7)
      at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
    generatedMessage: false,
    code: 'ERR_ASSERTION',
    actual: 2,
    expected: 1,
    operator: 'strictEqual',
    diff: 'simple'
  }