Compare commits

...
Author SHA1 Message Date
jason.woltje ea02c061e4 Merge row 227 (C2-14, #1728) R3: Case 2 end-to-end suite that runs alone with a cleanup that cannot touch other processes 2026-11-02 16:46:36 -06:00
jason.woltje dca9bc8691 Row 227 R3 (#1728): restore the executable bit on scripts/test-case2.sh
R3 (abc66a598) changed its mode from 100755 to 100644. Every other scripts/test-*.sh is 100755.
The landing gate runs it through bash, so no run broke; this restores the R2 mode.
2026-11-02 16:35:54 -06:00
jason.woltje 9a9c60d9c0 row 227 R3 (#1728): record the round in BUILD.md, BUILD-LOG and SESSIONS
Appends the R3 section to agents/steelbeak/work/queue-227/BUILD.md: the
R2 red on dummy links, the fixes, how the TMPDIR limit is derived, the
namespace containment and control table, runs, signal probes, the tip
check on 5df0e9d6f and follow-ups. One line each in BUILD-LOG.md and
docs/SESSIONS.md. Earlier entries are unchanged.
2026-11-02 16:34:22 -06:00
jason.woltje abc66a5988 row 227 R3 (#1728): guard the test-case2.sh sandbox, sweep cwd links literally, refuse a long TMPDIR
P1: a failed mktemp, mkdir or output redirect now stops the script with
exit 2 before it derives a path, sets a trap or starts anything. The
sandbox root is checked to be absolute, a new empty directory this user
owns and its own physical path, and its device:inode is recorded.
sweep_sandbox and remove_sandbox in scripts/case2/sandbox.sh each refuse
unless the root still matches, so an early, late or empty call gets a
refusal instead of a sweep of the host.

P2: the sweep reads every /proc/<pid>/cwd target with one find and
compares it as a string, root or root plus "/", so *, ? and [ in the
path are literal. A cwd in a deleted directory under the root matches.

P3: a TMPDIR whose tools socket path would pass the 107-byte limit in
packages/seat/src/session.mjs is refused at entry with one line naming
the limit and both lengths. The length comes from the socket path built
on the real sandbox root.

scripts/case2/sandbox-check.sh checks the guard and the match against
dummy symlinks; nothing in it sends a signal.
2026-11-02 16:27:56 -06:00
jason.woltje 5df0e9d6fa Merge row 332 (P3, #1830) R2 with the lead fix: pi harness config from the proxy, hermetic pi launches in tests 2026-11-02 15:48:51 -06:00
jason.woltje bd76d43453 row 227 R2 (#1728): record the standalone round in BUILD.md, BUILD-LOG and SESSIONS
Appends the "R2" section to agents/steelbeak/work/queue-227/BUILD.md: findings and fixes,
no step failures past launchFixture, the environment and signal controls, the mutant table
(m6 on requireCitation survived and is a follow-up), run times and the tip check. One line
each in BUILD-LOG.md and docs/SESSIONS.md. Earlier sections are unchanged.
2026-11-02 15:48:06 -06:00
jason.woltje a8e71be034 Row 332 R2 (#1830): lead correction for the GPT review F1 and F2
F1 fixed in da1f0ceda, with the federation acceptance red and green runs and
the script suite results. F2: the invalid-proxy-context BundleError is raised
at launcher.mjs:569, outside the try at :655, so :686 never sees it;
fromSession maps it at :1199 and launchPm rethrows it at :1215.
2026-11-02 15:47:39 -06:00
jason.woltje da1f0ceda6 Row 332 R2 (#1830): give the federation acceptance hosts a fake pi key
GPT review F1: prepare() built the host env from HOME, PATH, TMPDIR,
MOSAIC_CONFIG and NODE_EXTRA_CA_CERTS only, so the pi credential preflight
refused the assistant launch (no-session-credential) and the RESULT wait
failed. scripts/test-federation-acceptance.sh red on 6e9f3d723, green with
the fake ZAI_API_KEY the cli tests use.
2026-11-02 15:46:57 -06:00
jason.woltje 04e1ce24cc row 227 R2 (#1728): run test-case2.sh standalone, without the slot controller
Remove the R1 slot-controller ties from the C2-14 fixture: the ROW227_CONTROL_ROOT
check, the native permit wait in bindLaunch, the fixture-cleanup.json write, the
priority.mjs preload and the owned-bwrap.sh override. The launcher uses its own bwrap.

The shell runs the driver from an explicit env -i environment (PATH, LANG, a sandbox
HOME, XDG dirs and TMPDIR, MOSAIC_CONFIG, no global git config) as its own process
group. On a signal the driver gets 3 s by the clock, then its group and any process
whose cwd is in the sandbox get SIGKILL, inside the landing gate's 5 s grace.

The fixture credentials are defined only in scripts/case2/fixture-credentials.mjs.
The new scripts/case2/leak-check.mjs reads them from there and never prints them.
2026-11-02 15:41:17 -06:00
jason.woltje 6e9f3d7231 Row 332 R2 (#1830): record R2 evidence in fethry BUILD.md
Append-only R2 section: correction to R1's evidence, the two causes of the
53 cli failures, items 1 to 6 with their tests, RED, hermetic and GREEN
tables, five killed mutants on 39eadf8ba, and the F1, F4 and F2 docs
follow-ups.
2026-11-02 15:24:56 -06:00
jason.woltje 39eadf8ba8 Row 332 R2 (#1830): hermetic pi launches in cli tests, pi bundle default, review F2 and F3
The cli tests that launch pi deleted only the session login names, so pi's
preflight passed or refused by whatever provider keys the host exported. A
shared helper now deletes every credential pi's preflight reads and gives pi
launches one made-up key. The refusal itself is unchanged.

pi bundle() takes a default argument again, so a call with none returns the
non-proxy bundle, as before P3. pi.bundle leaves out a launch.models entry
whose provider has no proxy route instead of failing every pi launch (F2);
malformed proxy entries still refuse. The invalid session proxy context
BundleError gets the code invalid-proxy-context. New tests cover F2, the code,
and the three proxy account branches in the launcher (F3).
2026-11-02 15:22:17 -06:00
jason.woltje fddae79ef6 queue: commit pending rev 4144 (sage, 2026-10-26, row 333 note Mos1961), committed by lead c5c1e8ba 2026-11-02 15:07:37 -06:00
jason.woltje a6acbbe14d SESSIONS: darkwing 10-26 status line and the lead session registration 2026-11-02 15:05:37 -06:00
jason.woltje 46cd8d5835 gitignore: ignore the .turbo build cache
210 untracked cache files at the root (inventory canonical-cleanup-inventory.md). turbo writes them; nothing tracked lives there.
2026-11-02 15:05:19 -06:00
jason.woltje aba5cc505f lead: commit 34 untracked publication-trial review records under docs/plans/reviews as evidence
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:15 -06:00
jason.woltje 8545057275 lead: commit sage's untracked evidence (100 files: prd-1-17 queue-135 queue-176 queue-199 queue-66 vikunja-setup window-repin-4429a104f)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:15 -06:00
jason.woltje 068d868a99 lead: commit rocko's untracked evidence (4471 files: queue-124 queue-129 queue-171 queue-178 queue-280 queue-31 queue-84 queue-85 queue-94)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:15 -06:00
jason.woltje 4ff4f44c98 lead: commit researcher's untracked evidence (1406 files: queue-101 queue-105 queue-128 queue-134 queue-143 queue-148 queue-183 queue-228)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:14 -06:00
jason.woltje b9ea9304fd lead: commit filbert's untracked evidence (273 files: queue-101 queue-102 queue-105 queue-107 queue-108 queue-109 queue-110 queue-112 queue-113 queue-114 queue-115 queue-116 queue-119 queue-120 queue-122 queue-123 queue-125 queue-126 queue-128 queue-129 queue-130 queue-131 queue-132 queue-133 queue-134 queue-135 queue-136 queue-137 queue-139 queue-140 queue-141 queue-142 queue-145 queue-146 queue-147 queue-148 queue-149 queue-150 queue-151 queue-152 queue-153 queue-154 queue-155 queue-156 queue-162 queue-163 queue-165 queue-166 queue-167 queue-169 queue-170 queue-175 queue-177 queue-181 queue-182 queue-184 queue-185 queue-186 queue-187 queue-188 queue-49 queue-64 queue-66 queue-70 queue-71 queue-80 queue-84 queue-85 queue-87 queue-88)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:14 -06:00
jason.woltje 6bad02612a lead: commit dewey's untracked evidence (721 files: queue-124-review queue-143 queue-149 queue-165-review queue-170 queue-175 queue-177 queue-184 queue-191)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:14 -06:00
jason.woltje 158205c5cc lead: commit darkwing's untracked evidence (348 files: queue-137 queue-141 queue-150 queue-162 queue-165 queue-166 queue-167 queue-169 queue-179 queue-180 queue-181 queue-182 queue-185 queue-186 queue-187 queue-188 queue-190 queue-93)
Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
2026-11-02 15:05:14 -06:00
jason.woltje cab3ef3e8f fix(library): row 267 R2 search hits carry their source universe (#1772)
(cherry picked from commit 3006729160ac541318fb59c0b149a38aa840bd35)
2026-11-02 14:40:12 -06:00
jason.woltje ddf20567ee morgana: row 267 r1 notes (filbert-267-static-1): R8 entries dedupe by path and line (N1) with a two-pin case; BUILD.md states the untyped-entity version rule (N2)
(cherry picked from commit ec7fa046c1)
(cherry picked from commit 9ebeb00fbbb60bf40a8722344e34f67c1bc94600)
2026-11-02 14:40:12 -06:00
jason.woltje 3b88ef399d morgana: row 267 (C2-15, #1772) build: excluded() reads both exclude forms, the validator checks exclude and pin against the hybrid's sources, R6 for excluded links, R8 pinned value changed, guard refuses an excluded cite beside a hybrid; tests in library, bus and business; survey.test.mjs:75 gains R8 0 (mos-1667); setup sheet section (sage-4389, sage-4407)
(cherry picked from commit 367fd0d240)
(cherry picked from commit 068e1e0f1c9fab08dfb2c56f7122ec513aed1e2b)
2026-11-02 14:40:12 -06:00
jason.woltje 1eb8b68e44 morgana: row 267 BUILD.md: mutants renamed X1-X9 so they don't clash with the C2-04 M9 rule; X9 names its killing test (filbert-267-early-look-1)
(cherry picked from commit 6ac8a1ecd5)
(cherry picked from commit a9f7f91a2b4233249720fe368f78acad4cabb216)
2026-11-02 14:40:12 -06:00
jason.woltje abe37ab27a morgana: row 267 (C2-15, #1772) design notes: exclude forms, excluded() helper, R8 pin rules, guard check, tests and mutants M1-M9, questions Q1-Q5
(cherry picked from commit d60d29aa7a)
(cherry picked from commit 3184d421832020442dd9e0c8de5fcdd7676a3763)
2026-11-02 14:40:12 -06:00
jason.woltje 4ef251e1a7 test(webui): row 173 Seen intent on the 09a847eda base (#1671)
The row 173 test called setup(false), which starts the page with Show machine sessions off, so the sessions table it waits for never renders. Its sibling uses setup(true). Change the one argument; app.js is unchanged. The same test fails on the r2 tip 6d15eb5fc2, so base drift was not the cause.

(cherry picked from commit 996c79524f0f5b00e7fdca4cfb447c8b007569fd)
2026-11-02 14:40:12 -06:00
jason.woltje 36a70ea9c1 row 173 (#1671) r2: rebased onto 78b69e1e6 as dewey/row173-r2 (cherry-pick of 25ff7cd3f, range-diff equal, no conflict); BUILD.md round 2 section with overlap note, run list from app.js readers, mutant procedure; no runs yet (sage-4361)
(cherry picked from commit 6d15eb5fc2)
(cherry picked from commit e553e02a752f9f5868f3e39a016057e4c5786d07)
2026-11-02 14:40:12 -06:00
jason.woltje 8eb37bed32 row 173 (#1671): a Seen click that waited out a Board read posts what its button said, read from data-intent before the wait; a fresh row that already holds it (another viewer's mark) posts nothing and announces 'already seen' or 'already waiting'; board-held test covers both; BUILD.md design and mutant plan; no runs yet (sage-2799)
(cherry picked from commit 02b50ddf35)
(cherry picked from commit d95be10ec421bb8e9e880b50109fde53fdd3ccd7)
2026-11-02 14:40:12 -06:00
jason.woltje 82ca1d3db4 gosalyn: PRD 1.18, REQ-INST-2 prints the Console's one providers entry for the user to add to config.json and the stack never writes config.json (canon invariant 2). Status line 1.18, the 1.18 header sentence and the Version 1.18 source line before 1.17. requirements.json version 1.18 with the count still 87, and the version pin in requirements.test.mjs:24 (row 335, #1833, mos-1671, sage-4418)
(cherry picked from commit d8ec9b5fbc)
(cherry picked from commit ecb7d435e559bd6e9b30b2d065082f5ad86b5e18)
2026-11-02 14:40:12 -06:00
jason.woltje 54328cfae5 Merge commit 'c78f22543' into lead/batch2b-land 2026-11-02 14:40:12 -06:00
jason.woltje 46c07df75f docs(row227): R1 to R4 packets, run receipts and author log appends (#1728)
Commits the row 227 evidence under agents/steelbeak/work/queue-227/: the remaining gate/ files, runs/ (first, corrected1, priorityprobe), target-packet, target-packet-r2, target-packet-r3, target-packet-r4, static/, and the two top-level manifests. Also commits BUILD.md and the append-only BUILD-LOG.md and docs/SESSIONS.md entries. The R4 packet hashes are PACKET.sha256 4eb60915b2144137df9b5a42afd0c5b266718d71de051fb8be53a27430a2cad4 and CURRENT-SOURCE.sha256 0cfd47c2073bc18a3ba7bff1ce6fdf39fe33a64b7fca209be71517b9feb89020, both checked against the files. The overlay bytes are committed in 4ac6f13bc. This commit adds receipts and packets only and records no scripts/test-case2.sh run on the R4 overlay.
2026-11-02 13:40:09 -06:00
jason.woltje 4ac6f13bcf fix(case2): row 227 R4 source overlay as reviewed (packet 4eb60915, #1728)
Commits the 5 product paths and 7 gate helpers of the row 227 R4 source overlay on top of HEAD 5a0c801cb. scripts/case2/console.mjs is already committed at HEAD and is not part of this commit. The R4 independent review is sha256 6667baaa6af9d6d78a3ec7c64d9f3163ecbc350b94050f62899d9c01deabe002, verdict APPROVE source-only. Packet hashes: PACKET.sha256 4eb60915b2144137df9b5a42afd0c5b266718d71de051fb8be53a27430a2cad4, CURRENT-SOURCE.sha256 0cfd47c2073bc18a3ba7bff1ce6fdf39fe33a64b7fca209be71517b9feb89020. The 12 committed files match the review hash table, the applied overlay JSON (size, mode, hash) and the saved overlay tar. No scripts/test-case2.sh run exists on these bytes.
2026-11-02 13:39:29 -06:00
jason.woltje c78f225433 test(cli): row 334 byte-identity baseline after #385, proxy refusal text (#1832) 2026-11-02 13:10:29 -06:00
jason.woltje c1e9841d36 Merge PR #1836 R5: fetch chat assets through the SSO public Host (#385) 2026-11-02 12:58:25 -06:00
jason.woltje 6951fb494f Merge PR #1835 follow-up: release 0.0.13 for the #156 worker image contract 2026-11-02 12:58:25 -06:00
jason.woltje 5514457dde chore(release): 0.0.13 for the #156 worker image contract
#156 changes src/run-agent.sh and src/load-contracts.sh, which are baked into
the worker image. Its run-agent.sh refuses to start unless the launcher sets
MOSAIC_SYSTEM_PROMPT_FILE, and no launcher before #156 does. Rebuilding the
shared 0.0.12 tag would break the live pinned copy and rollback targets, so the
new image gets its own tag. No code change.
2026-11-02 12:58:10 -06:00
jason.woltje fbf8d61a4c test(webui): fetch chat assets through the SSO public Host (#385) 2026-11-02 12:55:32 -06:00
jason.woltje 2b3e3ec83b Merge row 334 (#1832): Case 2 proxy unit in case2-unit.sh and case2-install.sh 2026-11-02 12:50:15 -06:00
jason.woltje 418f00bce2 Merge PR #1836: Require verified OIDC for Console human writes (#385) 2026-11-02 12:31:19 -06:00
jason.woltje a7a433e271 Merge PR #1837: Pin the worker to the patched immutable Node24 base (#470) 2026-11-02 12:31:19 -06:00
jason.woltje 664d8ef3d3 Merge PR #1835: Limit legacy worker mounts to selected inputs and state (#156) 2026-11-02 12:31:19 -06:00
jason.woltje f7d16e9a8d Merge PR #1834: Refuse mapped IPv6 private addresses before web.fetch dispatch (#710) 2026-11-02 12:31:19 -06:00
jason.woltje 484aef7e2a fix(upgrade): refuse a pre-#385 library Console unit before units stop (#385) 2026-11-02 12:19:07 -06:00
jason.woltje d0ddfa8de2 fix(upgrade): refuse legacy library --send before units stop (#385) 2026-11-02 12:03:59 -06:00
jason.woltje ab2bc23c7f fix(console): keep preview deployment profiles read-only (#385) 2026-10-29 00:54:30 -05:00
jason.woltje 1d6dae6fe4 fix(worker): snapshot fork input before container binding (#156) 2026-10-29 00:46:50 -05:00
jason.woltje 7fff6a20e6 fix(testing): bind image receipts to pinned build base (#470) 2026-10-29 00:33:01 -05:00
jason.woltje a19b936a8c test(web): document canonical NAT64 policy boundary (#710) 2026-10-29 00:24:04 -05:00
jason.woltje ee151685e9 fix(worker): limit legacy mounts to selected inputs and outputs (#156) 2026-10-29 00:19:26 -05:00
jason.woltje 155cb8c3e5 fix(worker): pin patched Node 24.22.2 base digest (#470) 2026-10-29 00:19:03 -05:00
jason.woltje 9936a1be1a fix(webui): require verified OIDC for human writes (#385) 2026-10-29 00:19:02 -05:00
jason.woltje 4cf888c04c fix(web): refuse hexadecimal mapped IPv6 private targets (#710) 2026-10-29 00:18:00 -05:00
jason.woltje eabeb1aa82 docs: record three killed P3 mutants and byte-identical restoration 2026-10-26 18:12:54 -05:00
jason.woltje 569765f6de docs: pin unchanged tested join bytes and record pending mutants 2026-10-26 18:03:54 -05:00
jason.woltje d6dc04e84f Join P3 harness context to landed P2 admission with private same-key delivery 2026-10-26 18:02:58 -05:00
jason.woltje 4c49919e9b row334: record integrated GREEN and killed mutant evidence 2026-10-26 17:43:07 -05:00
jason.woltje c4bba5d2a3 row334: render P1 proxy system unit in Case 2 installs 2026-10-26 17:39:34 -05:00
Steelbeak 5a0c801cb8 UNTESTED row 227: rebuild scratch acceptance on landed slices 2026-10-26 17:39:12 -05:00
jason.woltje 2a728da86c row 227: BUILD.md carry for Dewey, the launcher in the path waits for C2-06's fake harness (sage-3608) 2026-10-26 17:38:56 -05:00
jason.woltje 6df8b0fd8a row 227 (C2-14, #1728): scripts/test-case2.sh and its driver scripts/case2/e2e.mjs, end-to-end on a scratch root. Runs the steps on refactor (layout, sync over the fake Gitea, her thread and a fake-harness reply, diverged hold and accept); each step that waits on an unlanded row prints a skip naming it (216, 217, 220, 225, 283, 285, 286, 288). Unrun: the slot is Darkwing's (sage-3581) 2026-10-26 17:38:56 -05:00
jason.woltje 09a847edaa queue: cite real postlanding reviews and retain tracking-only open rows (Mos1915) 2026-10-26 13:05:08 -05:00
jason.woltje 30644a3dd5 docs: preserve real postlanding reviews and human factory policy scope 2026-10-26 13:02:39 -05:00
jason.woltje 0e1dd0a95b docs: record landed model join, scoped gates and tracking boundary 2026-10-26 12:36:12 -05:00
jason.woltje 52ba14c5f1 docs: record model join gate phases and documented acceptance entrypoint 2026-10-26 12:32:08 -05:00
jason.woltje 49c162c99e test: publish frozen model join map and fail-closed gate evidence 2026-10-26 12:31:38 -05:00
jason.woltje 362893d043 feat: integrate reviewed proxy page and managed model keys
Source-candidate: poe d9a564e6d20f5f0fd75ce45b12cbbf8bb4c9d568\nSource-candidate: magica38ba5762b06716db1dee00d0afec162656488f5c\nValidated321whole-file phase plus whole bus1349/model-proxy100/webui490; final gate tooling checks pending, not landed.
2026-10-26 12:04:21 -05:00
jason.woltje acd2f4abfa queue: record row288 landed after quiet fullgate4 (Mos1864) 2026-10-26 11:10:57 -05:00
jason.woltje 63ec2544c2 Merge verified row288 and deterministic timing repairs after full gate4 GREEN 2026-10-26 11:03:22 -05:00
jason.woltje 1cb0d45df0 docs: preserve append-only development receipts before landing window 2026-10-26 11:03:02 -05:00
jason.woltje 8f7ef593d9 docs: record quiet full gate4 GREEN for row288 and timing repairs 2026-10-26 11:02:33 -05:00
jason.woltje 2d3458695a test: reap owned copy children on external gate termination 2026-10-26 10:44:35 -05:00
jason.woltje 6efc4a6921 fix: make timing regressions depend on explicit probe and child outcomes 2026-10-26 10:40:04 -05:00
jason.woltje 193774d755 Record row 288 whole-file gate and six killed mutants 2026-10-25 00:08:19 -05:00
jason.woltje 5d1734dd01 Give row 288 creative tool fixture its required Gitea reference 2026-10-25 00:08:19 -05:00
jason.woltje c10f17cfeb Correct row 288 broker grant and bare mirror fixtures 2026-10-25 00:08:19 -05:00
jason.woltje acc0f8acb0 Fix bare library deletion with a private index-info input file 2026-10-25 00:08:19 -05:00
jason.woltje 64a40e712d Untested: record row 288 landed-base transplant and import run list 2026-10-25 00:08:19 -05:00
jason.woltje 90a0d690da Untested: row 288 contract and import-list preflight (sage-4282) 2026-10-25 00:08:19 -05:00
jason.woltje 2656f32f77 Untested: record row 288 fresh candidate on landed row 283 (#1793) 2026-10-25 00:08:19 -05:00
jason.woltje c5ccabc9fb Untested: record row 283 follow-up dependency receipts (#1793) 2026-10-25 00:08:19 -05:00
jason.woltje d8bd081b20 Untested: clarify existing blob requirement in library delete tool (#1793) 2026-10-25 00:08:19 -05:00
jason.woltje af7287a533 Untested: record row 288 T7 verification and landing boundaries (#1793) 2026-10-25 00:08:19 -05:00
jason.woltje 4176f3a506 Untested: add library write tools and served blob integration (#1793) 2026-10-25 00:08:19 -05:00
jason.woltje 1db5167795 Untested: migrate creative tool snapshots to eight or ten names (mos-1523) 2026-10-25 00:08:19 -05:00
jason.woltje c3e4ee4138 Untested: record notice-store failure publication behavior (#1793) 2026-10-25 00:08:18 -05:00
jason.woltje 56e9844528 Untested: retain library notice after push when publication fails (#1793) 2026-10-25 00:08:18 -05:00
jason.woltje bbc062ae86 Untested: use editor login and cover row 288 early review gaps (#1793) 2026-10-25 00:08:18 -05:00
jason.woltje dc2a49a744 Untested: protect library publication state and add broker bare-repo coverage (#1793) 2026-10-25 00:08:18 -05:00
jason.woltje c0bf87b789 Untested: row 288 library writes, notices, revert and human saves (#1793) 2026-10-25 00:08:18 -05:00
jason.woltje e1d8756b51 docs: PRD 1.18 brief, REQ-INST-2 prints the providers entry (mos-1671, sage-4418) 2026-10-25 00:02:21 -05:00
jason.woltje 83ec67dd36 docs: row 255 (de3e23dde, #1760) landed, doc-only. BUILD-LOG and SESSIONS lines. 2026-10-24 23:57:58 -05:00
jason.woltje de3e23dde9 launchpad: row 255 design, M1 conditions from mos-1666 item 3 in section 1 and P1 2026-10-24 23:57:39 -05:00
jason.woltje 446c9b8381 launchpad: row 255 design, R2 marked rejected per sage-4401 (R1 chosen, M2 dropped) 2026-10-24 23:57:39 -05:00
jason.woltje f78a45653d launchpad: row 255 design, bundled Pocket ID for users with no OIDC provider (Q203, #1760, sage-4363) 2026-10-24 23:57:39 -05:00
jason.woltje 775bbe2368 docs: rows 214 (3a8e4abad, #1715) and 193 (35f34ad27, #1691) landed. BUILD-LOG and SESSIONS lines. 2026-10-24 23:36:47 -05:00
jason.woltje 35f34ad27a morgana: row 193 design r5 (sage-1373 item 1, mos-1023 item 2): one user sentence names decisions, inbox entries, claims, tasks and project files; governance pin checks each 2026-10-24 23:35:53 -05:00
jason.woltje 624507c74b morgana: row 193 design r4 (duckworth-0011): project files row and records in the user sentence (B3), message.receive and message.read on the messages row, gated raise settled by FED r4.5 with no guard (N5) 2026-10-24 23:35:53 -05:00
jason.woltje 77a790f43b morgana: row 193 design r3 (duckworth-0008, sage-1368): messages private, run governance owner-visible with a read table and pin test (B1), message filter moves to 193b1 (B2), N1-N4 2026-10-24 23:35:53 -05:00
jason.woltje bfd2f43b10 morgana: row 193 design r2: trail and replies hide other users' unshared thread messages (sage-1354), 193b split into b1 and b2, coverage from FED r4.1 covers (gizmoduck-0018) 2026-10-24 23:35:53 -05:00
jason.woltje cb86e186dc morgana: row 193 design for #1691: owner, collaborator and viewer roles on access.json grants, thread_shares table (deviation agreed sage-1338), principal from row 196's verifier 2026-10-24 23:35:53 -05:00
jason.woltje ce8bb4d8b0 queue: revs 4073-4095. Briefs and starts: 331/334 briefed (4073-4075), starts magica 331 (4076), poe 330 (4077), rockerduck 334 (4079), bubba 288 (4080), morgana 267 (4087), launchpad 255 (4092); briefs 267 (4085), 255 (4086). Row 193: morgana in-review 4078, Sage abandon 4081, request 4082, resolve to c31674 4084, Duckworth approve c31676 4088 (posted and recorded by Sage, no Duckworth credential). Row 214: herb in-review 4083, Sage abandon 4089, request c31678 4090-4091, Filbert approve c31679 4093 (Filbert's). Row 214 landed 3a8e4abad: note 4094, done 4095. 2026-10-24 23:34:28 -05:00
Herb 3a8e4abadb docs: record granted wikilink measurement and test evidence 2026-10-24 22:50:44 -05:00
Herb c68a29fed8 build: regenerate editor bundle for inert wikilinks 2026-10-24 22:50:44 -05:00
Herb 92e82469f2 fix: share HTML escaping for invalid wikilink atoms 2026-10-24 22:50:34 -05:00
Herb 8feda29eb4 feat: carry unrun wikilink node and tests onto current refactor 2026-10-24 22:50:34 -05:00
Herb bbec5e97f1 docs: require editor rebuild and clarify baseline evidence for 214 2026-10-24 22:50:34 -05:00
Herb ec213e0336 docs: design row 214 measurement and inert editor wikilinks 2026-10-24 22:50:34 -05:00
7990 changed files with 422432 additions and 934 deletions

No files matched your search

+1
View File
@@ -1,5 +1,6 @@
# build/deps # build/deps
node_modules/ node_modules/
.turbo/
# runtime credentials — never commit, never copy into the image # runtime credentials — never commit, never copy into the image
.env .env
+294
View File
@@ -5583,5 +5583,299 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r
2026-10-24 — Magica row329 R2 (#1827): B1 ASCII-only management key fix verified with complete-tree refusals and positive auth control; package66/66,30bus readers261/261,49CLI readers726/726,config55/55, no required skip/failure. N1 corrects R1 bus total to1019; N3 stale-lock guidance and N4 34-code inventory corrected. Two over-selected file runs are recorded separately, with no F7 inference; cause unknown/Vikunja625. Old502 test/helper files byte-identical, slot returned to Sage. Evidence agents/magica/work/queue-329/BUILD.md. 2026-10-24 — Magica row329 R2 (#1827): B1 ASCII-only management key fix verified with complete-tree refusals and positive auth control; package66/66,30bus readers261/261,49CLI readers726/726,config55/55, no required skip/failure. N1 corrects R1 bus total to1019; N3 stale-lock guidance and N4 34-code inventory corrected. Two over-selected file runs are recorded separately, with no F7 inference; cause unknown/Vikunja625. Old502 test/helper files byte-identical, slot returned to Sage. Evidence agents/magica/work/queue-329/BUILD.md.
2026-10-24T23:37:46Z | Sage | Row 329 (#1827, P1 pinned model proxy, Magica) LANDED 61ebf2c34, pushed 23:31:27Z 10-24. Before: refactor at 669cdf42c. After: Magica's 4 commits (94cde633e, c65fb34ee, d1f6f2b19, 61ebf2c34) cherry-picked onto 669cdf42c, diff vs the gated tree limited to drift paths, range-diff in scratch. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r329l/wt (gate.sh 8b4978887 c8a9bcf94), started 23:08:12Z at load 14.35, GATE GREEN 23:29:14Z at load 8.67, no rerun, no test or timeout edit (mos-1634). Host note: two Codex workers cleaned T3 worktrees from about 23:14Z (mos-1639, Vikunja 632). Approvals: Dewey r2 c31643 rev 4047, Boyd r2 c31642 rev 4048. #1827 comment 31650, closed. Vikunja 237 comment 1109 (stays open for P2-P7); C4 P10 red filed as Vikunja 631. Queue: note rev 4063, done rev 4064, committed b24d917ec. DEFERRED: N2 and R2-N1 bound to row 331, N1 bound to P7. Overlap: row 284 (packages/bus/src/broker.mjs) and row 157 (scripts/mosaic-config.mjs) rebase onto 61ebf2c34 before their gates. 2026-10-24T23:37:46Z | Sage | Row 329 (#1827, P1 pinned model proxy, Magica) LANDED 61ebf2c34, pushed 23:31:27Z 10-24. Before: refactor at 669cdf42c. After: Magica's 4 commits (94cde633e, c65fb34ee, d1f6f2b19, 61ebf2c34) cherry-picked onto 669cdf42c, diff vs the gated tree limited to drift paths, range-diff in scratch. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r329l/wt (gate.sh 8b4978887 c8a9bcf94), started 23:08:12Z at load 14.35, GATE GREEN 23:29:14Z at load 8.67, no rerun, no test or timeout edit (mos-1634). Host note: two Codex workers cleaned T3 worktrees from about 23:14Z (mos-1639, Vikunja 632). Approvals: Dewey r2 c31643 rev 4047, Boyd r2 c31642 rev 4048. #1827 comment 31650, closed. Vikunja 237 comment 1109 (stays open for P2-P7); C4 P10 red filed as Vikunja 631. Queue: note rev 4063, done rev 4064, committed b24d917ec. DEFERRED: N2 and R2-N1 bound to row 331, N1 bound to P7. Overlap: row 284 (packages/bus/src/broker.mjs) and row 157 (scripts/mosaic-config.mjs) rebase onto 61ebf2c34 before their gates.
## 2026-10-24 — row332 P3 proxy harness configuration: investigation/test placement
Fethry at c8a9bcf94, per Sage sage-4292 and mos-1616 pi-route amendment. Before: every managed session receives instance-wide provider credentials; harnesses have no transient per-session proxy context; pi preflight checks only its binary. Intended after: proxy-mode isolation, Claude proxy env, pi private run-local route config using environment references only, credential preflight, and business proxy account settings. Design/test plan: agents/fethry/work/queue-332/BUILD.md. Initial tests placed before production changes. No tests run: Sage CLEAR is required and has not arrived. No success/acceptance claim, live change, or dependency landing. Existing proxy issue number requested from Sage; not yet received.
## 2026-10-24 — row332 crash stop, documentation-only checkpoint
Fethry stopped under Mos mos-1630/Jason's T3 crash instruction. No production implementation, tests, probes, mutants or acceptance runs occurred; Sage CLEAR never arrived. Explicit route metadata per sage-4293 is recorded in agents/fethry/work/queue-332/BUILD.md; full state and resumption boundaries are in HANDOFF.md there. Safe crash checkpoint commits documentation/historical plain-text import manifest only; four unrun tests and the import-audit script remain uncommitted. No long jobs restarted, protected branch changes, merges, live changes or further thread messages.
2026-10-24 — Fethry row332 P3 UNRUN implementation checkpoint: optional proxy route per sage-4325 (default Anthropic), transient preflight/bundle/spawn context and serialization split, pi private model file/provider credential requirement. Existing initial RED evidence precedes source changes; only specifically authorized old fixtures updated. GPT wire API value PENDING until separate offline CLEAR/evidence; P2 seam remains injected context, no real proxy/auth access. Not GREEN, not accepted or landed. Details agents/fethry/work/queue-332/BUILD.md.
2026-10-24 — Fethry row332 P3 checkpoint ef0939e35: required explicit route restored per sage-4293/4328; openai-responses chosen by Sage sage-4331 as reasoning-based tie-break, not evidence-decided (both offline shapes passed). Rehashed pinned8.0.42 single active-tool isolated GLM turn confirms thinking/tool_stream survive to stand-in;bundle7/7,proxy-harness5/5,no skips. Real Codex auth proof remains row209 phaseA step7. P2 landing/rebase,mutants,reviews and full gate still pending; no landing claim. Plain evidence/limitations in agents/fethry/work/queue-332/BUILD.md.
2026-10-25T00:15:48Z | Sage | Row 284 (#1789, C2-05c library.get scope, Della) LANDED ce0b6ed41, pushed 00:09:52Z 10-25. Before: refactor at 9e2689dff (row 329 landing docs). After: fast-forward to Della's 7 rebased commits 78b932feb..ce0b6ed41; 8 paths, manifest-r4 de505cfd matches the landed tree. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r284l/wt (the 329 gate.sh with D and the compose project renamed), started 23:51:19Z at load 1.62, GATE GREEN 00:09:04Z at load 5.20, no rerun, no test or timeout edit. Counts: bus 1020/0, business 283/0, cli 999 pass 1 allowed skip (FED R7), harness 177/0, library 156/0, seat 218/0, webui 458/0, every scripts/test-*.sh rc 0; queue 34 and task 87/93 skips are the standing ones. Della's whole-file runs on ce0b6ed41: library-lookups 12/0, library-tools 5/0, query 34/0. Approval: Webby round 2 delta c31654 rev 4070 (round 1 rev 4062). Overlap sweep: rows 13, 157, 309, gyro/row310 and fethry/row332-p1 clean. #1789 comment 31655, closed. No Vikunja task for the row. Queue: note rev 4071, done rev 4072, committed 7c8dc2033. DEFERRED: Webby N1 (whole-tree listing per get) bound to the next library read-path row; N2 needs nothing; N3 is this gate. 2026-10-25T00:15:48Z | Sage | Row 284 (#1789, C2-05c library.get scope, Della) LANDED ce0b6ed41, pushed 00:09:52Z 10-25. Before: refactor at 9e2689dff (row 329 landing docs). After: fast-forward to Della's 7 rebased commits 78b932feb..ce0b6ed41; 8 paths, manifest-r4 de505cfd matches the landed tree. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r284l/wt (the 329 gate.sh with D and the compose project renamed), started 23:51:19Z at load 1.62, GATE GREEN 00:09:04Z at load 5.20, no rerun, no test or timeout edit. Counts: bus 1020/0, business 283/0, cli 999 pass 1 allowed skip (FED R7), harness 177/0, library 156/0, seat 218/0, webui 458/0, every scripts/test-*.sh rc 0; queue 34 and task 87/93 skips are the standing ones. Della's whole-file runs on ce0b6ed41: library-lookups 12/0, library-tools 5/0, query 34/0. Approval: Webby round 2 delta c31654 rev 4070 (round 1 rev 4062). Overlap sweep: rows 13, 157, 309, gyro/row310 and fethry/row332-p1 clean. #1789 comment 31655, closed. No Vikunja task for the row. Queue: note rev 4071, done rev 4072, committed 7c8dc2033. DEFERRED: Webby N1 (whole-tree listing per get) bound to the next library read-path row; N2 needs nothing; N3 is this gate.
2026-10-25T00:18:35Z | Sage | Follow-up tasks for mos-1647 item 3 (Q109): Vikunja 633 (P7 cutover, CLIProxyAPI 8.0.42 startup Grok-npm and antigravity version refreshes, from row 332 isolated runs) and 634 (row 284 Webby N1, library get lists the whole tree). DEFERRED gains the 633 entry and the 634 number for row 284 N1. Filing script and receipt in agents/sage/work/vikunja-setup/. 2026-10-25T00:18:35Z | Sage | Follow-up tasks for mos-1647 item 3 (Q109): Vikunja 633 (P7 cutover, CLIProxyAPI 8.0.42 startup Grok-npm and antigravity version refreshes, from row 332 isolated runs) and 634 (row 284 Webby N1, library get lists the whole tree). DEFERRED gains the 633 entry and the 634 number for row 284 N1. Filing script and receipt in agents/sage/work/vikunja-setup/.
2026-10-24T22:15:07Z | Herb | row 214 #1715 C2-11a focused evidence | Before: wikilinks are ordinary editor text; raw/sig retention keeps no-edit bytes, but the model has no inert node. After: inert inline wikilink atom preserves spelling through neighbouring edits; invalid attrs share HTML/entity escaping. On herb/row214-r2 base487500a16, grant sage-4286 lane B: baseline10/10 roundTrips equal (outcome A); baseline structural0/1 expected red; four whole editor files40/0, both mutants killed0/1 and restored1/0, whole webui69 files455/0 in174.189s with MOSAIC_REQUIRE_EDITOR_BUILD=1, nice19, no skips/cancellations. A mistaken preliminary7-file subset28/0 is logged and excluded from gate evidence. CSS byte-identical, final process sweep0, scratch TMPDIR removed. Filbert candidate review and every scripts/test-*.sh gate remain pending; no click, target resolution or library save change.
2026-10-25T04:36:47Z | Sage | Row 214 (#1715, C2-11a editor wikilink node, Herb) LANDED 3a8e4abad, pushed 04:27Z 10-25. Before: refactor at 78b69e1e6. After: Herb's six commits cherry-picked onto 78b69e1e6 and fast-forwarded. Gate GREEN 04:10:34Z: 18 package suites rc 0 (webui 471/471, cli 999 plus the allowed FED R7 skip), every scripts/test-*.sh rc 0, queue package via test-queue.sh 156. Design skips: queue 34 (not the canonical root), task 87/93 (row 244). Filbert APPROVE c31679 rev 4093. Range-diff equal except commit 5's BUILD-LOG context; 40/41 paths same blob, BUILD-LOG additions only. #1715 closed c31680. Queue note 4094, done 4095, committed ce8bb4d8b.
2026-10-25T04:36:47Z | Sage | Row 193 (#1691, threads user roles design, Morgana) LANDED 35f34ad27, doc-only: five design commits cherry-picked onto ce8bb4d8b, adding only agents/morgana/work/queue-193/DESIGN.md (verify-commit ok, 1 path). Duckworth APPROVE c31676 rev 4088 (posted and recorded by Sage; Duckworth has no Gitea credential). No test reads queue-193. Build rows from the design: 204/#1702, 205/#1703 (landed), 275/#1780, 206/#1704, 207/#1705, 208/#1706.
2026-10-25T04:58:30Z | Sage | Row 255 (#1760, Vikunja 458, bundled Pocket ID design for Q203, Launchpad) LANDED de3e23dde, doc-only: Launchpad's three design commits e29d8ec90, 9f60021a0 and c8f2bc723 cherry-picked onto 775bbe236 (range-diff equal), adding only agents/launchpad/work/queue-255/DESIGN.md. No test reads queue-255. Webby APPROVE round 1 c31689 rev 4103 (posted by Sage; Webby has no Gitea token). Mos rulings in mos-1666: M1 approved with conditions (rollback removes components before the pointer goes back and the STATE check confirms the key is absent; the loader stays strict inside the key; four test-config.sh cases), R1 chosen, M2 dropped. Sage gate check against Q203, O6, REQ-WEB-2 and REQ-INST-1: consistent. One PRD text gap goes to Mos: REQ-INST-2 says the stack writes the providers entry, and R1 prints it for the user to paste. Webby N1 and N2 bind P4; N3-N8 carry into the P1-P6 build rows, all post-v1.
2026-10-25T07:46Z | Sage 1ef1e4f8 | Row288 quiet-host handoff (#645), late phase registration | Before: unchanged diag2 refused exit9 after07:00:05-07:30:18Z with neither base/head processing file started; no fullGREEN/run4 evidence. Faceless READY07:37:14Z and final A02 drain acknowledged. Bounded host observation07:38:31-07:43:31Z produced11 half-minute load/CPU-pressure/process-name samples at /mnt/storage/scratch/sage-r288l/quiet-20261025T073714Z/samples.jsonl. Magica331 r4 occupied the preceding slot until07:41:00Z; after its end, sampled load1 remained8.03/7.97/10.02/9.40/9.22;07:43:36Z follow-up8.97 and no gate visible. After: no288 test or run4 started, unchanged load1<4 precondition unmet. Explicit RELEASE delivered to faceless master sage-4466 and Mos sage-4467;645 c1172 read back, done=true with original title/description preserved. This closes only the bounded handoff/measured-inability/release task; row288 diagnostic and fullGREEN acceptance remain unmet. No thresholds, test deadlines, scheduling settings or running jobs changed. Earlier interrupted/refusal logs preserved separately.
2026-10-25T07:46Z | Sage 1ef1e4f8 | P2/P4 prerequisite state | Magica331 r4 on0965fe1ea under sage-4459 stopped at full-list file69 project-runtime.test.mjs: exact Broker import closure lacks new common.mjs import. Probe30/30,68 full-list files green; aggregate707/706pass/1fail/0skip/cancel;193 remaining files, config and mutants/controls unrun. Receipts8d88a6029; rawlog ee430ce92543c4027b4aa78f343c703fd00bb55433e6ed40d54b61668a5914d4 read. Static trace confirms real sandbox defect: common.mjs and top-level-read PIN absent from RUNNER_FILES, as is new first-output.mjs. Magica holds read-only; proposed pure validation module/two readonly code binds/exact guard revision sent to Mos for scope ruling sage-4468, Q246 independent review still required. Poe prepared e7438743f regression manifest8/8 verified and git show --check clean; product patch unapplied at review. Next test-first404 block CLEAR sage-4469: intended two-caseRED before narrow exactGET404 normalization, then both new whole files+8focused/acceptance/named mutants/controls, stop on unexpected outcome. Global landing gate remains afterP2. No composite green, landing or push performed by Sage.
2026-10-25T08:03Z | Sage 1ef1e4f8 | Row331 r5 narrow review and full-builder verification phase | Before: r4 deterministic import-closure RED retained; r5 focused sixteen whole files181/181 passed, zero skips/cancel, real sandbox/session controls verified with raw16hashes. Fresh independent Claude Opus5.5/high Q246 round1 APPROVE8d88a6029..4948ece0e; no blocker/high/medium. Purity-regex/no-new-test-pre-fix-RED and confined-startup-only limits retained; verdict agents/sage/work/r331-r5-review/round1.json. Full P2/global/landing not approved. Now: accepted fresh import-derived269 list on unchanged reviewed code4948ece0e, packet2ff10ffac: old262 preserved+validation+six sandbox-dependent collateral files. Graph17sources/zero parsefailures, all11packetartifacthashes verified3993f7d3; listfd724dd9 equals graphbed8a700 tests. Runnerdiff changes only comment/artifact filenames/list/count. CLEARsage-4477 wholeprobe->269wholefiles->same test-config->four original mutants/restored controls, same deadlines/flags/scheduling, stop first unexpected outcome/no retries.646 remainsopen. Result pending, not a composite green or landing claim. Mos informed sage-4478.
2026-10-25T08:23Z | Sage 1ef1e4f8 | Row331 r5 full builder verification result | After CLEAR4477, builderblock finishedrc0 at08:19:20Z on2ff10ffac/code4948ece0e, receipt/docd62c69c86; package source unchanged. Independently verified279step logSHA/bytes and exact269inventory, final11artifact/280rawlog(including driver) manifestf1b6ee9b, receiptf95b14d7. Whole2692427tests/2426pass/0fail/1skip/0cancel; probe30+config55 gives2512tests/2511pass/0fail/1skip. FEDR7 scratch acceptance skip explicitly UNVERIFIED until scripts/test-federation-acceptance.sh at its authorized/global stage. Four mutants killed by named behavior; restoredwholecontrols30/30 each and sourcead5b37f3 restored byte-for-byte. Real sandbox11/session13 passed, no confined skips. Childnice19all279, driver16two recorded host-renice observations; no timeout/retry/control edit. Slot returned; no automatic nextgate. FullP2 Boyd first review/credential landing review/Sage global gate and row288 remain outstanding; narrowr5ClaudeAPPROVE is not fullP2/landing approval.646 staysopen. Supplied verifiedBoydID and full-scope handoff requirements sage-4479, Mos informed sage-4480; builder's already-invoked canonical queue move pending, no duplicate mutation.
2026-10-25T08:25:08+00:00 | Sage 1ef1e4f8 | Correction to08:23Z row331 verification entry | The final manifest/check-and-track helper stopped on KeyError bytes before its Vikunja post, because r5-full-driver.log is hash-only; shell continuation appended the08:23 entry prematurely. Earlier independent279step logSHA/bytes/count checks were already complete. Corrected final checker now verifies all11artifacts+280rawlogs: allSHA match, byte counts match wherever supplied; only driver log lacks bytes metadata. Restored sourcead5b37f3 matches allfour mutant events.646 comment1178 posted and read back OPEN now. No product/test or run result changed. Boyd0047 confirms fullP2read-only review underway on d62c69c86/base78b69e1e6, writerC included. Initial queuein-review move refused missing --candidate rc2 without mutation; one corrected candidate-bearing operation remains pending, no duplicate operation.
2026-10-25T08:33:18+00:00 | Sage 1ef1e4f8 | Row331 first full review CHANGES and request fallback | Boyd0049 fullP2review CHANGES onehighB1: runtime modelRuns empty afterrestart until bind, no-launch neverbinds oldpersistedsessions, sweep treats emptyasnoruns and removesretiringkey beforefuturegrace/confirmedstop. Magica andSage source-onlytrace confirm; writerC no otherblocker. No newtest/fixrun. BoundedB1preparation4483 underoriginalP2acceptance: authoritativeidentitycheckedpersistedrunview before retirement, retainfailclosed onunknown/discovery/stop failure, preserve no-launch/no newstopauthority; staticruntime/restartregressions/proposal first, no productfixuntilintendedRED/futureCLEAR. Requestfallback: ownGETuserjarvisverified, canonicalreviewrequest newop4481 completedrev4121/4122 posted31700, readbackauthor/issue/candidate/markersverified. FullBoydverdict relayed verbatim31701 with explicitBoydindependentreviewer/SageJarvisrelay attribution onBoydexplicitrequest, readbackverified; Boydasked4485 torecordCHANGESasboyd againstd62c69c86. Original4119/4120missingMagicacredentialfailurepreserved, no rowmove repeated/sharedorBoydcredentialused. Queuecurrentround1posted; verdictrecordpending.646global/P2gatesstillopen; no landingor288claim.
2026-10-25T08:50:48+00:00 | Sage 1ef1e4f8 | B1/647 intendedRED verified, bounded runtime/focusedGREEN phase | Before: correctednewtestca0e83337 onunchangedproduct4948ece0e ran EXACTONEwholemodel-restart under4490:12tests/2pass/10fail/0skipcancel, all10expected old-key-remotely-installed assertions, bothboundnonrunnerstop/confirmeddeadcontrolspass. No fixture/control/cleanup/observer/timeouterror. Raw13f41a18/19069bytes/names/counts and5producthashes independentlychecked; receipte99d225a/resultmanifeste69b1ac9 match, evidence-only41e909bcc. Now:4491 authorizes b1-proposal six-step minimalruntime.mjs-only implementation/privatehoststricthelpers andfocused8wholefiles(newrestartfirst). Seedauthoritativecheckedpersistedviewbeforetimer, mergeboot/fresh/bound, unknown/discovery/identity/stopfailure retains; no-launch/no discovery-derivedstopauthority preserved. Samepublicschema/refusal/IPC/mount/config/writer/grace/stop/timer/oldassertion/deadlines; ifruntime-onlyinsufficientstopforruling. Focused stopfirstunexpected/noretries, noautomaticfullgate/landing.647c1180readbackOPEN; freshnewcandidate/fullreview/Q246/global/FEDR7/288acceptance outstanding. Mos4492informed.
2026-10-25T09:01:42+00:00 | Sage 1ef1e4f8 | B1/647 boundaryRED verified, exact two-file/focusedGREEN resume | Boundary4495ONEnewwholefile produced2tests/0pass/2fail/0skipcancel; bothintendedMissingexpectedrejection(prePUT/prelocaldelete), no fixture/cleanup/timeoutfailure. Raw911d2a59/1994bytes/exactnames/counts/5unchangedproducthashes checked; receipt7fa8e123/resultmanifest8c49df81 match; evidenceonlyc90dcc4b1, original12RED41e909bcc retained/notrerun. Conditional4493/Mos1702prerequisite met. RESUME4496minimalruntimecheckedpersistedboot+fresh+trustedboundview plus EXACTprivateModelKeysconfirm-at-two-boundaries delta only; preserve no-launch/no newstopauthority/strictidentity/unknownretain/confirmedexit; no publiccontract/mount/writer/refusal/timer/grace/assertion/deadline change. Focused9newrestart12thenboundary2thenexisting7wholefiles, sameflags/nice/privatecfg, stopfirstunexpected/noretry; no automaticfull/mutants/landing. Newcandidate/freshfullP2/Q246/global/FEDR7/288acceptance remains. Mos4497informed.
2026-10-25T09:11:09+00:00 | Sage 1ef1e4f8 | B1/647 focused result and fullbuilder phase | Code81cbdea37 changes only runtimeprivateinventory and exactapprovedModelKeysconfirmdelta; bothpreviousREDphasespreserved. Focused4496ninewholefiles131/131,0fail/skipcancel, nine rawSHA/bytes and receipt6c2ff448/resultmanifest78c1b8fa8artifacts+10rawlogs(incldriver) verified. Candidatecontent704a2469all111Gitblobs/pathinventory checked; testedsourceunchangedinevidencepacket e5a4ade07. Realconfinedstartup/sessioncontrols pass; sleepfixture doesnotproveauthorizedrealrunnerSIGTERM, limitretained. Freshfull271list=old269+exactrestart/boundary2, graph17sources0parsefailures/all271match4e01c2e8, listd6b403f0, all10fullpacketartifacts007a2adf match. Runnerdiffonlycomment/artifactnames/listcount. CLEAR4498probe->271wholefiles->sameconfig1800->4namedmutants180000+restoredcontrols, sameflags/priority/privatecfg, stopfirstunexpected/noretry/no extrarun. Resultpending; FEDR7unverified/freshfullP2round2/Q246/global/landing/row288 remain.647c1183readbackOPEN; Mos4499informed.
2026-10-25T09:35:26+00:00 | Sage 1ef1e4f8 | B1/647 newfullbuilder result and reviewROUND2 | Builder4498rc0/code81cbdea37/checkoute5a4ade07, evidenceonlyd817e5840/sourceunchanged. Independentlychecked281stepSHA/bytes/exact271list;whole2441tests2440pass0fail1FEDR7skip, probe30/config55->2526subtotal2525pass0fail1skip. All4namedmutants killed andrestored30controls/sourcebf96f941, all281driver/child19atstarts; no retry/timeout. Result20347f8a all11artifacts+282rawlogs(incldriver)verified;FEDR7UNVERIFIED/global/realrunnerSIGTERMlimitsretained. NewfullP2Boydround2request4501 includesoriginalB1/response/currentwholeP2/evidence/limits; notnarrowreview. Sequentialownerqueuetransitions4500pending. Queuecandidate standard33pathSHAmanifestfb0a7b68 pinsallchangedsource/test/script/publicdocs+DEFERRED; onlyappend-onlylogs/agents evidence excludedfromqueuepinbutretainedin111content/fullresultmanifests. Scopechoice+tradeoffstoredround2-source-scope.json: permittracking/evidenceevolution withoutweakeningsourcepin. Formalround2request/verdictrecordsawaitreceipts; freshfullClaude/Dewey/global/FEDR7/288stillrequired.647open/Mos4502informed.
2026-10-25T09:41:59+00:00 | Sage 1ef1e4f8 | Full P2 round 2 source approval and security review | Boyd0053 independently APPROVE whole P2 base78b69e1e6..d817e5840/source81cbdea37, B1 closed, no actionable findings; this is not landing approval or a recorded queue verdict yet. His 111-source-blob/11-committed-artifact checks and coverage limits remain attributed. Fresh full P2 Claude Opus5.5/high Q246 review dispatched as a NEW delegate_task, clientRequestId sage-4503-r331-full-r2-q246; prior narrow r5 approval is not reused. Dispatch metadata saved full-round2-dispatch.json. Review is read-only committed Git, no tests/proxy/live data or external writes. Queue owner moves succeeded4124/4125, round2 opened;4126 request failed due unset Magica credential, preserved in6a645188d. Sage GET user again verified jarvis; one canonical existing-round2 fallback request sage-4504-row331-round2-review is RUNNING(exec3218), not yet claimed posted. No duplicate operation; candidate fb0a7b68 unchanged.647 open; fresh review, recorded approvals, global/FEDR7/landing/row288 acceptance remain.
2026-10-25T10:03:36+00:00 | Sage 1ef1e4f8 | Full P2 round 2 corrected CHANGES / bounded preparation | Canonical fallback4504 completed4127/4128, request31702 read back jarvis/issue1829/round2/frozen33path fb0a7b68. No pending Sage queue operation. Initial independent Boyd APPROVE0053 relayed31703; fresh full Claude Q2464503 REQUEST_CHANGES saved full-round2-verdict.json and relayed31704, full range78..d817/source81. Original B1 closed but M1 terminal evidence lost on later PID reuse and M2 proxy admission suppressing historical recovery end/release are confirmed. Boyd0054 independently adjudicated CHANGES, superseding his assessment31703 without rewriting history; exact attributed correction31705 posted/read back. Boyd4515 instructed formal-pin verification then one CHANGES record as actorboyd; no round2 verdict record claimed yet. Prior narrow r5 approval and all builder receipts remain scoped; 271-file green cannot prove untested M1/M2.
Static source trace confirms known inventory loses terminal observations and exact old Broker launch matching precedes cleanup only after runtime admission; claims persist. Magica4513 authorised TEST-ONLY preparation, no product/Node/test/proxy/mutant/queue/newround launch: M1 sticky per-exact-identity strict confirmed-exit proof, separate outer/runner, stale registry protection, initial corrupt ticks/key still HOLD; no blanket mismatch=>exit or authority expansion. M2 persisted launch/claim restart matrix and negatives, exact Broker-owned cleanup proposal before any contract change; no usable cap/modelRuns/rotation-stop authority from cleanup. Marker direct-confined test may be drafted without mount expansion. L1 isolation and L3b orphan-key rehire confirmed; precise scope/repair proposals with Mos4514. L2 missing-boot hold documented tradeoff and L3a race remains fail closed. First-output clock currently starts at session launch before any model turn; Mos4511 owner-intent ruling pending, no timing/protocol edit. Source81/candidatefb0 frozen, global/FEDR7/row288/Dewey landing remain unfulfilled; no source approval or landing.
2026-10-25T10:06:00+00:00 | Sage 1ef1e4f8 | Mos1703 consolidated P2 intent/scope | Clock intent settled by Mos technical D17 reading, not a new Jason quote: one existing120s first-output budget starts at FIRST actual adapter/model turn; idle before it unarmed, no per-turn reset/extension. Task650 requires exact brief amendment/method/caller/marker delta + idle/silent/output/direct-confined cases before any product/run CLEAR. M1 task648 strict per-identity independently monotonic outer/runner confirmed-exit proof under existing absent/reaped rules only; no first mismatch or prior-live mismatch inference, no stop authority. M2 task649 Broker-owned exact immutable UNENDED cleanup, no capability/modelRuns/rotation-stop binding/new launch; exact unapplied contract/caller/negative controls must return to Mos. L1/L3b task651 static proposal/test-only prep authorised: independent instance work followed by original first error, unchanged1s/refusal; post-registration state/confirmed membership vs removed orphan/fresh issuance rules, no stale-key restoration. L2 documented hold accepted, L3a race explicit fail-closed follow-up.
Sage4517 delivered full bounded ruling to existing Magica thread; M1/M2 packets should return independently of clock/lows. Parent independently GET-read tasks647-651 OPEN/project19/owner Sage title; receipt mos1703-task-readback.json. Updated review ledger and saved exact relay. No source edits, Node/tests/proxy/sandbox/mutants/queue round/global/landing/row288 CLEAR. Boyd's ONE CHANGES record0002 remains pending per0055; no duplicate or inferred success.
2026-10-25T10:06:40+00:00 | Sage 1ef1e4f8 | P2 R2 formal CHANGES receipt | Boyd0056 definitive original command exit0; parent independently read canonical row331 round2 receipt opboyd-331-verdict-0002/rev4129/reviewerboyd/CHANGES/comment31705/frozenfb0a7b68 and exact manifest text/digest. Sole round2 verdict receipt is CHANGES; prior APPROVE31703 was never recorded. No pending Sage/Boyd queue operation; do not repeat. Saved round2-boyd-canonical-verdict-result.json and updated ledger. Mos1703/Magica4517 static-only prep648-651 remains unchanged, no product/test/newround/global/landing/row288 grant.
2026-10-25T10:19:11+00:00 | Sage 1ef1e4f8 | M1/M2 static packet review and M1 intended RED CLEAR | Inspectedbc6942412/test-onlynewmodel-terminal-proof7/model-historical-cleanup17/sharedfixture and exact UNAPPLIEDruntime/Broker+IPC proposals. Bothpreparedmanifests3666f737/b818438d each6artifacthash/bytes+9producthashes independently verified against source81; packages diffONLY3newtest/helperfiles. M1 independentownchildrenexit/reap, originalsweepcompletion observer, exactformerownPID syntheticproc only/restorednamedbuiltins+signalguard; firstcorruptticks/keyhold controls unchanged, no actualPIDreuseclaim. M2 actualStoreclose/reopen/persistedclaim/Launcher recovery, no fixturecleanupimplementation; oldfailures behavioral notundefinedfuturemethod.
CLEARsage4520 EXACTONEwholemodel-terminal-proof file pre-fix onsource81/testpacketbc6942412; expected2RED/5GREEN only, notobserved. Samewholeflags/nice19/measuredprioritiesload/privateconfig/cleanup/no retry/no productfix/M2/extra check/newround. Stop/reportwholefile; slot pending. M2 has NO execution CLEAR yet. SentMos4521 exactM1diffSHAa9189c01 andM2diffSHA92f3b899: new trusted recoverLaunch LAUNCH_OPS/Broker-ownedproof/sharedendSession/caller replaces bind+endRun, no cap/runs/modelRuns; real contract needs ruling beforeimplementation. Mos1703 required exactunapplied proposals now supplied; no global/landing/288 claim.
2026-10-25T10:21:52+00:00 | Sage 1ef1e4f8 | M1 intended RED verified / M2 intended RED CLEAR | M1sage4520 onbc6942412/source81 whole7exact5pass/2intendedfail, no skip/cancel/timeout/observercleanupfailure. Parent independently verified raw7562b5b6/7232bytes/all7names+assertions/counts; failedlatergenerationretirement andinitialcorruptkeyalreadyexitedretention, all5refusal/livecounterpart controls pass. Ownchildren exits/reaps precede syntheticproc; NOTactualOSreuse. FinalnoSignalscounterassertion inexpectedfirstfail wasnotreached; guard/interceptionrestoration remaincode/cleanup evidence, nooverstatement. Evidence-onlypacketpending; reportreceiptcc1726d6. Parent CURRENTcheckout9producthashes==81 +all6M2artifacthashbytesverified.
Mos1704 ACCEPTSexactM1a9189c01 +M2trustedcontract92f3b899 CONDITIONAL onbothintendedRED andboundedfocusedpacketinspectionbeforeapply. Sage4522 CLEAREDONLYONEwholeM2model-historical-cleanup file onunchanged81/pinnedtests; expected17/9pass/8failnotobserved, samewholeflags/nice/privatecfg/measurements, stopafterfile/no retry/productfix/extra/queue. Requestedstaticfocusedinventory/candidateplan plusNEWtest-only actualtrustedprocessIPC dispatchcoverage; existing17inprocessstandin isnotIPCproof. NoIPCtestexecutionorimplementationyet. Mosconcreteresult4523delivered. Old647REDs/narrowr5review/fullreceipts preservedatactualscope; no clock/lows/global/FEDR7/288/landing CLEAR.
2026-10-25T10:23:52+00:00 | Sage 1ef1e4f8 | Both M1/M2 intended REDs verified; implementation held at focused prerequisite | M2wholeRED4522 source81/testbc6942412 exact17tests9pass8intendedfail0skipcancel, no timeout/fixture/control/cleanupfailure. Independently rawf5f7a22e/15148bytes+all17names/outcomes/8namedassertions match preparedmap; CURRENT9productpaths byteidentical81. EarlierM1exact7/5pass/2intendedfail rawverified with signalcounter-notreached and synthetic-onlyreuse limits retained. Parent independentchecks saved separately; builderreceipt M2reported5aff9915, committedreceipt-manifestverificationpending.
Bothrawprerequisitesnowverified, notimplementationCLEAR: inspectstaticfocusedwholefileinventory/controls/newcandidateprovenance andactualtrustedprocessIPCcoveragepacket first (existing17inprocessonly). Magica0066preparingstaticpacket, no productfix. Mos4524 concrete result / Magica4525 verified nextprerequisite delivered. Tasks648/649 comments posted/readbackOPEN [{"task": 648, "commentId": 1190, "readBack": true, "done": false, "bodySHA256": "173c05ddd38776b94c2d29b3e3d6a21877f47de071059593e27fb0661fe78c8a"}, {"task": 649, "commentId": 1191, "readBack": true, "done": false, "bodySHA256": "2944d5578dafc77d47e6ab9e2b3d851a3216ac271f3cc64811f2bf34b3b7f33e"}]. Exact2diffconditionalMos1704 scope stays; clock/lows separate, no additionalexecution/newround/global/FEDR7/288/landing authority.
2026-10-25T10:32:33+00:00 | Sage 1ef1e4f8 | ActualIPC/focused prerequisite inspected | Magica0067 separateM1/M2 evidencec3eb95242 andstaticIPCpacket05d6a3336. Parent verifiedbothREDresultmanifests a5d5c48c/14059b83: each9committedartifacts+2raw/driver hashes, byteswherepresent/beforeafterequal. No earlierreceiptverificationpending. ActualIPCpreparedmanifestc5373f1d all11artifacts+9unchangedproducthashes/currentfilesverified. New9cases realstartHostfork->processboot->runtime/Broker, requiredreaderboot, ownedhost-firstcleanup, persistedSQLiteclaim/endhistory, directops+actualLauncher; no mockeddispatch. Existingordinaryfreshadmission/no-launchcontrolspreserved, newrefusalsmustleavechannelusableafterfix. OldunknownIPCpathcancloseownhostasintendedRED, notclaimednewchannelproof.
AcceptedboundedFOCUSED20wholefiles exactb5448102 +staticdependency/forkjustification: threeM1/M2/IPCregressions, originalrestart/boundary/modelkeys/stop/proxy, Broker/routes/import/sessions/threadclaims/end/process, seatrealconfinedsession/sandbox, CLIhost/launcher/sessionlaunch. Currentcandidateprovenanceplanretainold81/fb/R2CHANGES; correctedproductcommitAFTERapplicablefocusedGREEN, contenthashcanfreezeuntestedworktreefirst.
CLEARsage4527 EXACTONEwholemodel-historical-ipc.test pre-fixsource81/05d6a3336test expected9/2pass/7intendedREDnotobserved. Samewholeflags/nice19/measuredpriorities/load/privatecfg, actualforksnooverclaimedmeasurement; stop/reportwholefile/no retry/fix/otherfile/mutant/queue. ImplementationNOresumeuntilintendedIPCREDverified; exactMos1704two-diffscopeonlyafternewCLEAR. Mos4528informed. No clock/lows/global/FEDR7/288/landing grant.
2026-10-25T10:36:24+00:00 | Sage 1ef1e4f8 | All intended REDs verified / EXACT M1+M2 focused resume | ActualIPCRED4527 on05d6a3336/source81 exact9tests/2pass/7intendedfail0skipcancel, nofixture/harness/cleanup/timeoutfailure. Parent raw6ba10393/13478bytes/all9names/outcomes+assertionschecked andCURRENT9producthashes81. Separateevidence07292713b/resultmanifest16f058a1 all9committedartifacts+2raw/driver hashes/byteswhereprovided checked, machine testedCheckout05d6a3336 andbeforeafterequal. Human-summary e05typo remainshistorical, machinepin correct. Limits: onlyfirstdirectopcapturedinvalid-host-request; otherpredicateinnercodesnotcaptured andpostrefusalchannelassertionsnotreached. Nestedforkpriorityinheritednotindividuallymeasured; no pre-rootlockinventoryassertion.
AllMos1704conditionsnowmet: bothoriginalM1/M2intendedREDs+actualIPCREDverified, acceptedfocused20exactlistb5448102/dependency/realforkpacket/newcandidateplan inspectedbeforeapply. RESUME/CLEARsage4529 EXACTcombinedM1a9189c01 +M292f3b899, ONLYfourproductfiles broker/runtime/process/launcher. Freezeappliedsource/testcontent/runner/listbeforeexecution andcompareagainstexactcombineddiffs. Run20serialWHOLEfiles orderfrozen, sameflags/nice19/actualmeasurements/privatecfg; STOPfirstunexpected/no retries/fixtureassertiondeadlineedits/otherrepairs. IPCGREENmustreachpreciserefusal/channelguards/no cap/no proxyPUT/modelStallbinding; M1mustreachnoSignalscounterafterretirement. Confinement unavailable=UNVERIFIEDnotgreen. CommitproductONLYafterapplicablefocusedGREEN, thenmapcontenttocandidate. Readonlypinnedparsergraph/list/fullpacketpreparationafterGREENallowed; full/mutants/acceptance/newround remainSEPARATECLEAR. No clock/lows/global/FEDR7/288/landingauthority. Mos4530concretestate delivered;647-651open.
2026-10-25T10:45:39+00:00 | Sage 1ef1e4f8 | M1/M2 focused GREEN independently verified / final gate sequencing | Magica0071SLOTBACK4529: all20wholefiles254/254pass, zero fail/skip/cancel/timeout. Parent resultmanifest5596c74f all7artifacts+20rawSHA/bytes andcounts verified, frozen29files38c7a9e6/source26e3aef0 unchanged; separately appliedbothacceptedpatches to81 inownedtempscratch andbytecomparedall4products. ProductcommittedAFTERGREEN5868d77f18abeb01d2822cb475df48ce1336ae58, packet860582c27. All180content63642ecf blobs+37fullsourcebehavioura1cec8b5 entries independently checked; frozen29testedfilesmapexactlycodecommit, no oldtests/ModelKeys or packet-tip packages/scripts/DEFERREDdelta. IPC9 now reachesexactrefusal/channel-survival/no-cap/no-proxyPUT/modelStallrefusal/claimrelease/fresh/no-launchassertions; M1reachesnoSignalscounter; actualsandbox11/session13 passnonskip. RealOSreuse/realrunnerrotationSIGTERM/nestedforkprioritymeasurement/independentpre-rootlockinventory NOTclaimed. Manual0070header time correction10:39:41Z retained; rawmeasuredtimestamps unchanged.
Fullpacket98e601a9 all13artifacts/list274/graph17 verified: prior271retained+EXACT3newtests, no othercollaterals/omissions; fullrunnerdiff onlycomment/evidencenames/listcount. UNEXECUTED/no fullCLEAR. Sage4531 toMagica immediateALREADYauthorisedSTATIC650clock/651lowcontracts+testprep; finalwholebuilder+freshfullP2/Q246reviews sequencedafterremainingknownsourcecontractssettle tovalidatefinalsource, no scope/gatewaiver orcompositegreen. Mos4532concreteresult/orderinformed; anyacceptanceorderingconflictreturnedbeforeextraexecution. No650/651productedit/run/newqueue/global/FEDR7/288/landinggrant. Tasks648/649updated/readbackOPEN [{"task": 648, "commentId": 1192, "done": false, "readBack": true}, {"task": 649, "commentId": 1193, "done": false, "readBack": true}];647-651remainopen.
2026-10-25T10:52:07+00:00 | Sage 1ef1e4f8 | Static651 L1/L3b inspection before RED | Magica0073 prepared0ec63de70: independent each6artifacthash/bytes+9unchanged5868producthashes match L1manifest3b73bbcb/L3bbe635be2. NoNode/run/productchange. L1exactdf4ee0f4 per-instance try/catch serialsweep/firstErrororiginal/rethrowafterothers/valuefreeoutcomes meetsdirection, sentMos4535forcontractruling. New4tests expected3RED1GREENnotobserved. L3b46e68bc6 postregisterhold+freshsentinelledmembershipbeforecachedreturn/freshkeyGETPUTGET ifmissing preservesold.retiring, new6unitexpected5RED1GREENnotobserved. Concretebranch discrepancy: explicitrotate appendsoldcurrentevenifconfirmedabsent while reportclaimsnoinventedretiring; recommended appendonlyrotate&&present, exactstate/rule returnedMos4535beforecode.
Sage4534 STATIC corrections only: fixture valueFree losesclosedorremovedmodelkeys, requireimmutablehistoryscanningallfixturessecretvalues withoutprinting; attemptallownedcleanup. Requireexactstate/table/preservationcontrols andseparateactualruntimeorganizationhireorphan+failure/revokingmembershipcontrols, notcontrollercontinuationoverclaim. L1mayreturnindependentlyofL3b/650. NORED/CLEAR/productimplementationgranted; clock650staticcontinues. Task651comment1194posted/readbackOPEN. Finalfull274/reviewsremainunexecuteduntilstablecandidate; no gatewaiver/compositegreen/global/landing/288.
2026-10-25T10:57:41+00:00 | Sage 1ef1e4f8 | Mos1705 exact low-branch ruling and L1r3 intended RED verified | Mos1705relayed4537: L1removeunconditionalcomplete receipts, keeprefused-only/existinglifecycle receipts/1s+firsterror; addnoopreceiptcontrol. L3bpreserveold.retiring ALLbranches, appendcurrentONLYrotate&&confirmedpresent, noabsentcurrententry; initial/postregisterhold/freshserializedGET/sentinel/GETPUTGET/privatepersistbeforepublication unchanged. Fulltable/no-record/revoking+actualruntimehirecontrolsbeforeRED, noimplementationgrant.
Magica0074helperr2history/canary/guardedcleanupinspected; correctedL1r3 745875432exactdiff93e4de1e andmanifestd2a62d03 all6artifact/9CURRENTproductbytes5868verified. CLEAR4538 ONLYonewholemodel-sweep-isolation file unchanged5868/pinnedr3 expected5/2pass/3RED. SLOTBACK0076 actualexactexpected, zero skip/cancel/fixture/cleanup/timeout. Parent resultmanifest89adad47 all8artifacts+raw416ec873/3514bytes/allnames/assertions/counts/beforeafter+CURRENT9productsverified. Exactoriginalfirsterroridentityassertion passedbefore laterfailure visitation; bothnormalretirement/historycanary and3no-op/no-churncontrolsGREEN. Ownedroots0/nolivechildfixtures reported. Evidencecommitpending; no productfix oradditionalrun. Mos4540/Magica4541verifiedstatusdelivered. Task651c1196readbackOPEN.
No L1implementationresume: boundedfocusedplanneeded; L3bcompletebranch/runtimepacket+650clock stillSTATIC on5868. RejectedPUTpayloadcapturehistoryrequestedAFTERL1slotback/newpins (currenthelper503beforebody missesattemptedfreshvalue), oldexecutedr3anchorpreserved. Final274/fullreviewpacketstaysunexecuteduntilstablefinalscope; Mos1705acceptssequencing, no gatewaiver/compositegreen/global/FEDR7/288/landing.
2026-10-25T11:03:27+00:00 | Sage 1ef1e4f8 | Clock650 static protocol inspection / no run | Magica0077 clockpacket994ead40a b26004a3 independently8artifacthash/bytes+5unchanged5868productpins verified. ExactUNAPPLIED0875b66f+D17amendment3ea62438 returnedMos4543 beforeimplementation/RED: adapterchildspawn armingboundary, newexportinexistingmountedfirst-output, ownrunDiratomic0600temp/linknoreplace, bounded64byteNOFOLLOW/NONBLOCKread, absentunarmedvsnewmalformed/future/unreadableimmediatestallpolicy, internallegacydefaultfalse/managedtrue. SharedclockoriginLinuxINFERENCEfromprimaryNodeHrtimeBigInt->uv_hrtime->preciseCLOCK_MONOTONIC pluslocalsandboxuser/pid/ipcnamespacesnot-time; actualbwrapboundsuntested. Upstreamsource/doclinks savedclock650-static-inspection.json; no localNode execution.
Foundstaticnewreaderdefect: .toString(ascii) strips highbitsperofficialNodeBufferdocs, so proposedexactASCIIvalidationnottrue. Mos4545/Magica4546 sentstrictUTF8+ASCIIregexorrawbytecheckrevision/highbitnegatives; original0875byteshistoricalnotacceptedfinal. Magica4544 additionalSTATICnegatives symlink/FIFO/nonblocking/size/mode/shape/zero/future/lateembeddeddeadline andproducer-spawn-callbackfailurecleanuptrace; no broaderhandler/sourceeditwithoutcontractruling. Current3newfiles9casesexpected5RED4GREEN NOTobserved; no clockRED orproductCLEAR. Task650c1197posted/readbackOPEN. L1evidence2a2b0136b committed8artifactsnowverified; originalL1REDrawalreadyverified. L3bfulltable/runtimepacketstatic. Noactivegate/queue, product5868 unchanged; finalfull274/reviewsunexecuted/no gatewaiver/global/FEDR7/288/landing.
2026-10-25T11:07:40+00:00 | Sage 1ef1e4f8 | Mos1706/1707 clock boundaries relayed, exact revised bytes pending | Sage4548 relayed1706: successfuladapter/bin/shspawn acceptedboundary; embeddedonce120deadline/firstoutputcancel/readNOFOLLOWNONBLOCKregular0600currentuid<=64positive-nonfuture acceptedLinuxinferenceonlypendingrealconfinedtest. Invalid/future/unreadable=>singleexistingtrustedstop/valuefreereceiptaccepted; ENOENTunarmed. Internallegacywatcherdefaultfalse acceptedONLYmanagedlaunchertrue/no userconfig. StrictrejectANYbyte>127 beforedecode+exactASCIIshape, highbitprefix/digit/newline+extra/trailingcontrols required; original0875NOTacceptedbytes. Producerfailure mustbecaughtwithinlifecycle, ownedgroupboundedTERM/KILL+reap, controlledcleanup/exit/nolaterturnfirststamp/fixeddiagnostic. TempownershiponsuccessfulexclusiveOPEN, guardwrite/close/unlink/collisionpreexistingneverremoved. Revisedexactdelta beforeclockRED/productCLEAR.
Sage4549 relayed1707: preserveNONPROXYbehavior, no unconditionalnewhardlink/timestampdependency, no session.json/publicconfig/envschema; smallest internaloptin within4files, host-ownedrunDirmarkerproposalallowedbutexactbytespending, addnonproxycontrol. Parent read-onlycallertrace runTurnlanding540/message581/retry630, top-levelawait/eventcallbacknocatch; mainnormalserver/toolcleanup androle.release onlyEXIT.stopped; hostexitendRunreleasesclaim/records/unregisters/lockcleanup. Senttrace/no genericcatchclaim/clearescalationtimerafterchildclose/reap. No parentorchildproduct/testexecutiongrant.
OriginalL1RED4538/evidence2a2b0136bverified; L3bowner-resolvedstate/runtimepacketstatic; currentproduct5868 unchanged/focused254, full274unexecuted/finalfullfreshreviewsafterstablecontracts. No gatewaiver/global/FEDR7/row288/landing authority.
2026-10-25T11:21:49+00:00 | Sage 1ef1e4f8 | L3b exact scope, fixture diagnosis/correction, both intended REDs verified | Inspected311f49d51 L3br3 manifest3305ad47 all10artifacts+9CURRENT5868products; full14controller/3actualruntimehire/sharedhistoryrejectedPUTbefore503/guardedruntimecleanup. Exact43c14 #issue only matches1705resolvedtable. Mos1708 conditionalexactcontractaccepted, EXISTINGmodelOrganization failedhirecleanupaccepted unchanged: existedfalsebeforeorphanregister canrevoke/deleteconfirmedunpublishedorphan onfailure; controllerfileimmutabilityonly, runtimeexactmembership/no stale restoration/nousablecredential, NOTnoHTTP/immutableorphanfile/atomicrollback. No wrapperedit.
InitialCLEAR4551ONEcontroller endedUNEXPECTED14/4pass/10fail:7intendedassertions+SETUPcredential-format2/13/14. Parent verifiedraw8b61b9d8/11487bytes andCredentialsinstant exacttoISOString validation; newfixturetimestampslacked.000Z. Stopped/noauto-retry.4552authorisedONLY3canonicalnewfixtureliterals(controller2/runtime1), noassertion/deadline/helper/productweakening. Unexpectedevidence6f12b6df7/resulta6c1a31b8artifacts+rawverified/preservedseparate. a27f07e20 r4manifest814d2849 all11artifacts+9CURRENTproductsverified, bytecomparison EXACT3timestampchanges vs311only2testfiles; originaltestblobspreserved.
NewCLEAR4555ONEcorrectedcontroller actual14/6pass/8intendedfail1,2,3,4,5,7,8,10;controls6,9,11,12,13,14GREEN, no setup/cleanup/timeouts/skips. Parent verifiedresultf3d609e98artifacts+raw364f864f/8743bytes/allnames/assertions/current9products. SeparateCLEAR4557ONEruntimehirefile actual3/0pass/3intendedfail, parent verified6cf6235e8artifacts+rawe36fb211/2855bytes/names/assertions/products5868. Realinprocessruntime/Broker/SQLite/organization/fakeHTTP NOTprocessIPC. Evidencecommitpending; no productfix oradditionalrun. Mos4553/4556/4558/4560resultsrelayed; Magica4559nextfocused/candidatepacketbeforeapply. L1r3+L3bexactproposalsstillUNAPPLIED.
Source-onlycross-scopehypothesis4554: knownliveoldcurrent ->confirmedremoteabsence->newgenerationdropsoldcurrentmetadata ->M1keyassociationcanholdbeforeterminalproofevenafterOSexit. Mos1709 created652/openproject19ownerSage, explicitlyUNVERIFIEDconservativeavailabilityinteraction NOTconfirmedregression/blocker orpermanentacceptedlimit. STATICregression/proposalonly relayedMagica4557; exact5868+accepted43c14combinedcontext/ensure-rotate/separateouter-runnerOSexitvsterminalproof/laterretirement/staleRegistry-norun-corruptkeynegatives/map/minimalfuturewholefile scope withnextfocused/implementationpacket. NOextraexecution/fix/keyguardweakening/oldkeyretiringre-add/remoterestore/knownerasure/stopauthority. Finalfullreviews MUSTreceivependinginteraction+eventualexplicitdisposition. Currentruntimetestpathnotblockedby652prep.
Tasks651/652updated/readbackOPEN [{"task": 651, "commentId": 1200, "done": false, "readBack": true, "title": "Full P2 low findings: record L1-L3 dispositions and bounded follow-ups (owner Sage)"}, {"task": 652, "commentId": 1201, "done": false, "readBack": true, "title": "Investigate M1/L3b lost key association and later retirement availability (owner Sage)"}]. Currentproduct5868/focused254 unchanged; noactivegate/queue. AwaitexactL1r3+L3bfocusedinventory/candidateplan+652proposal and650revisedprotocol/strictbyte/fatalcleanup/nonproxyoptintests; finalfull274remainsunexecuted, no gatewaiver/compositegreen/global/FEDR7/288/landing.
2026-10-25T11:24:51+00:00 | Sage 1ef1e4f8 | Bounded low-focused packet and652 static proposal inspected beforeapply | Magica0083 packet13d6782dd manifest4ded0ff6 independently33artifacthash/bytes+CURRENT9products5868verified. ALL3 intendedREDresultmanifests recursively8committedartifacts+raw EACH verified, L3b pendingcommitverificationresolved; unexpected4551remainsseparate. Exactfocused23 list7f07e95e=3newL1/controller/runtime first +old20unchangedorder/noomission. Parentindependentownedtempscratch apply EXACT93e4de1e+43c14 to5868 ModelKeys gives815b92c8e0b7b6eca8495ea745c0ec7cfdc91296a44d9b0a62b94ed9b5bc9e1d, no worktreeapplication. Freezeactualcandidate/base/list/runnerbeforetest/commitafterGREEN planinspected; productModelKeysonly/no wrapper/reconcile/runtime/clock change.
Read652STATICproposalb993ae6e andcontext713110d6: no testauthored/executed/fixselected. Old5868ensurefailsknownL3bsetupprecondition/rotateappendstheoldcurrent; combinedacceptedbranchdropsabsentold thenhypothesizedincompleteproofassociationhold afterobservableOSexit. Proposedfuture1runtimefile ensure/rotate×staleRegistry/[]+terminal/no-run/corrupt/ticks/partial/changedidentitycontrols, no guardweakening/erasure/re-add/authority. RemainsUNVERIFIED/notblockerorpermanentacceptedlimit.
Mos4562 EXACTimplementationprogression+652scopeRULINGrequested: recommendonlyaccepted2lowdiffapply+inspected23focusedGREEN thenMEASURED652followupbeforefinalreview, firstauthoriseSTATIConefiletestpreptheninspect/separateboundeddiagnosticCLEARonfrozencombinedcandidate; noadditionalfix/limitbeforeevidence. Magica4563verifiedpacket/stateinformed NOapply/focused/652testauthoringgrantyet; existing650staticworkcontinues. Noactivegate/queue/productchanges;5868current/focused254,full274UNEXECUTED, freshfullreviews/global/FEDR7/288/landingstillunfulfilled.
2026-10-25T11:29:08+00:00 | Sage 1ef1e4f8 | Mos1710 exact low implementation resume, staged before actual run | MosauthorisesONLY93e4de1e+43c14 appliedto5868, soleModelKeys productblob815b92c8; exact23wholelist7f07e95e. D2requiresSAGEinspectactualdriver/list/config/baseHEAD/uncommittedcandidateblobs/soleproductdelta/all23tests/sharedinputs/9baselineproductsBEFORErunning. Relayed4564apply+freezeactualpacketNOWbutNOtestexecutionuntilparentinspectsandissuesactualrunCLEAR. Samewholeflags/nice/privatecfg/stopfirstunexpected/no retry/testhelperassertiondeadlineedit/extras; productcommitafterapplicableGREEN/mapfrozenblobs, receipt-tipsdistinct. No wrapper/reconcile/runtime/clock/guard/timer/refusal/authoritychange.
MosD4choosesMEASURED652followupbeforefinalfull-reviewacceptance. ONLYAFTERfocusedGREEN newcandidate frozen: staticauthorship/preparation1futuremodel-key-loss-interaction runtimefile/neededapprovedtesthelper underb993/context713/ownprocesses/realHTTP/originalsweeps/matrixnegatives andexplicitOSexitvsproof; NOexecution/prodseam/fix/guardweakening/implicitpermanentlimit/blockerclaim. CompletepacketthenSEPARATEdiagnosticCLEAR. FullfinalP2/Q246briefspreserveunresolvedinteraction+eventualdisposition.650staticindependent, finalfull/Q246/global/FEDR7/288/landingremain. Currentlaneidle/noqueueop; pendingactualappliedfreezeinspection.
2026-10-25T11:35:16+00:00 | Sage 1ef1e4f8 | Actual low pre-run packet inspected / RUN CLEAR4565 | Magica0084 soleModelKeys exact815b92c8 appliedUNCOMMITTED; receipt-only46c00e741, basebeforeapply13d6782dd. Parent verifiedmanifestd142c7ba10artifacts+CURRENT36frozeninputs0ebc27f9+41SCOPEDsourcepins643c5f72(all23tests/sharedhelpers/9criticalproducts/driver/list), 9baseline5868products (8unchanged+soleModelKeysdelta). Independentlyagainappliedaccepted93e4de1e+43c14inownedtempscratch andbytecomparedactualModelKeys. No stagedproduct. Actualdriverfe65fe8e/config301d4865/list7f07e95e/baseHEADinspected. Independent6503testdraftsdirtyOUTSIDE23scope; no clockproductchange, 41scopedmanifestnotclaimedallunrelateddrafts. BoundedNodeprocessscan no competingtest/gate.
ActualRUN CLEARsage4565 delivered EXACT23serialWHOLEfiles, receiptactualclear+frozenCandidateSha2560ebc27f9; sameabsolute--test--test-reporter=tap/defaultoutertimeout0/perfiledeadlines/nice19measureddriverchild+load/privateHOMEconfigTMPDIR. STOPfirstunexpected/no retry/frozenhelperassertiondeadlineedit/extra/full/mutant/config/acceptance. ProductcommitONLYafterGREEN/map36/41testedcontent BEFORE652helperauthorship; don'tstageindependentclockdrafts. AfterGREENonlyMos1710STATIC652onefuturetest/helper, no diagnosticexecution/seam/fix. Mos4566concretestateinformed;651c1204readbackOPEN. ResultPENDING/laneRESERVED,no passingclaim. Finalfull/Q246/global/FEDR7/288/landing remain separate.
2026-10-25T11:39:57+00:00 | Sage 1ef1e4f8 | Lowfocused GREEN independently verified /652static preparation resumes | Magica0085SLOTBACKsage4565 exact23whole276/276zero fail/skip/cancel/timeout/cleanup. Parentresultmanifestfe6652a8 all8COMMITTEDartifacts+23rawhash/bytes/perfilecounts/priorities verified; actualreceiptCLEAR4565/frozenCandidate0ebc27f9 matches. All36frozeninputs+41SCOPEDsourcepins643c5f72 mapexactlypostGREENproductcommit6d3edea61f0d46654771a51b505cd21473617679. packages/scripts deltafrom46receiptONLYModelKeys815b92c8 acceptedcombined, no clockdraftsstaged. Perfilecounts5,14,3,7,17,9,12,2,30,7,14,16,4,3,7,6,3,8,13,11,43,34,8. Driver/testchild19all23; nestedforkinherited/notallmeasured. ActualIPC9/sandbox11/session13nonskip;650directmarker/timestampUNEXECUTED. SleepnotrealrotationSIGTERM/PIDreuse/independentpre-removallockinventory limitsretain.
Mos1710D4conditionalnowmet: Sage4568resumedONLYSTATIC652onefuture runtimefile/neededtesthelper preparation onFROZEN6d withproposalb993/context713, ownprocesses/realHTTP/originalsweeps/OSexitvsacquiredproof/matrixnegatives. NOdiagnosticexecution/prodseam/fix/guardweakening/oldcurrentreadd/remoterestore/stopauthority/permanentlimit/blockerclaim. Separateinspectablepacket/map thenfutureCLEAR/disposition; fullP2/Q246briefmustcarryunresolved652. Mos4569concreteresultinformed. Existing650revisedexactprotocol/negative/failure/nonproxy packetreadyindependenthandoffpending, no clockproduct/REDgrant. Slotfree/noqueuepending. Full274historicalunexecuted/finalgraphandgatefreshreviews/global/FEDR7/288/landingremainunfulfilled.
2026-10-25T11:48:57+00:00 | Sage 1ef1e4f8 | Revised650 exactprotocol/tests inspected / no RED | Magica0086 packet9507e2ee4 manifest4284d712 all21artifacthash/bytes+5CURRENTclockproducts identicaltestedlow6d verified. Parenttemporaryapply exactUNAPPLIED755290c5ef575a3e68d714bf42fffbb5ffe21e00fd34766cf0cfbebaad4afc71 to6d yields4proposedclockproducts (noModelKeysdelta): first-output6263d358/runnerd4bfea03/model-stall0bdc91dc/launcherd2527440. D17/brief amendmentabd21fcb. Strictbytes>127BEFOREASCII/canonicalpositivefullcontent/64/NONBLOCK-NOFOLLOW-fstat-uid/FDclose/onceembeddeddeadline inspected. ProducerexclusiveOPENowns immediately; independentwrite/link/close/unlinkfixederror/collisionnoownership. Proxy-onlyhostenablefile/runnerprivatecachedexistsafterJSON/no publicschema; managedwatchtrue/internallegacyfalse. Controlledspawnerrorcatch withinPromise, TERM+tracked5sKILL, waitclose/reap+cleartimers, fixedprivateresult, all3callersafterusageendterminate, exit2/server-socket+role.release/hostend path inspected.
Readall5newtestfiles/fakechildprobe+actualunconfinedpubfailurepreload: narrowownedfspath/fd/groupinterception/restorenamedbuiltins, actualBroker/libraryguard/currentchildprocess, notconfinedfault orTERMresistantproof. Readerinvalidcount/single-stop/FDcleanup/FIFOownedchildbounded; oldexpectedfailuresassertionsnotnewtimerpolicy. Wrongowner/unreadable-valid0600 UNVERIFIEDexplicit. Actualbwrapstdout/nonproxy/timestampbounds UNEXECUTED. RemainingNEWunexecutedsource-grepmanagedcaller test mirrorsimplementation; Sage4570requestedmovetoexplicitcoordinatorinspectionnotes (callerinspected), preserveALL5actualclockbehaviorcases; likelyrefresh36total31RED5GREEN instead37/32/5. No oldtests/assertionschanged/no clockrun; exactprotocol755unchangedbytest-scopecorrection. SentMos4571 exactproduct+doccontractforfinalruling, currenthash755NOTapplied/REDauthorized. Task650c1205readbackOPEN.652staticonefileprepindependent/currentlow6d276verified. Noactivegate/queue/full/global/FEDR7/288/landinggrant.
2026-10-25T11:53:25+00:00 | Sage 1ef1e4f8 | Clockr3 testscope verified /Mos1711 exactcontractacceptedconditional | Magica0087 1ac21d36c r3manifest54a7ecfb all21artifacthash/bytes+5CURRENTclockproducts==testedlow6dverified. Parentbytecomparison950..1ac ONLYnewunexecutedsource-grep testcase removed, ALL5actualbehaviorcases unchanged/otherpackage-scriptfilesunchanged; map36total31expectedRED5GREEN NOTobserved. Independentlowmapping852a8da71 artifactl1-l3b-tested-commit-map.json9a5bf68f checkedall36Gitblobids/hashbytesat6d(41scopedsourcepreviouslyindependentlyverified); maprecordedbefore652authorship.
Mos1711 conditionallyACCEPTSEXACTUNAPPLIED755290c5fourclockproductdelta+abd21fcbtwo plan-docamendments, readsallsource/tests/diffs/appliedonlytempscratch. Boundaryoptin/strictmetadata/ownedcleanup/nonproxy/limitsunchanged. NOclockproductapply/focusedgrant. SequentialONEWHOLEperREDclear allowedONLYafterSageinspectsrevisednotes/test/helper/maps/pins+currentclockproducts/lowmapping. One remainingnotes-onlycorrection: JSdollaranchor withoutmultilinematchesinputend (not optionalfinalnewline); keepfullmatch-lengthguard/trailingnegativeunchanged. Relayed4573 staticnotesrepinbeforefirstRED. ParentcheckedTC39primaryCompileAssertionURLread(noNodeexecution), linkretained. ActualconfinedcasesMUSTnonskip/unavailableSTOPprogression; no aggregate/unconfinedsubstitute, no in-flightedits/retries. Wrongowner/unreadable0600/TERMresistance/unconfinedfaultlimits retained.
Noactivegate/queue;clock755UNAPPLIED;lowtested6d276current. Awaitnotes-correctedclockmanifest thensequentialRED firstfileCLEAR;652staticdiagnosticpacketindependent/noexecutionfix. Finalfull/Q246/global/FEDR7/288/landingunfulfilled.
2026-10-25T11:59:06.171733+00:00 — Sage — row331 clock650: inspected r4 eac71305 pins, corrected notes and unchanged low6d products; issued ONE-file intended RED sage-4574 (5 expected:3pass/2fail); no clock product application. 652 static packet received, no execution.
2026-10-25T12:02:48.839223+00:00 — Sage — row331 clock650 firstthree separate intended REDs verified: clock5/3/2, reader19/1/18, producer7/0/7. Producer failure stops before ownership/fault checks; no proof claim. Nineproducts/frozeninputs match low6d. Issued4580 ONLY actual confined file2cases expected1controlpass/1missingmarkerRED; skip/unavailable stops. Task650c1207 read back. 652static packet sentMos4576 awaiting exact diagnostic ruling, no execution. No clock application/full/global/landing. Next4581.
2026-10-25T12:08:14.044541+00:00 | Sage4584-4585 | ALL5clockREDindependentlyverified36/5pass31intendedfail, allnamedassertions/frozeninputs/nineproducts==low6d,0skip/cancel/timeout/cleanup. Parent aggregate clock650-all-five-red-audit.json, individualauditchecks persisted. Finalraw9837707f/2961/result441954f5. No clockproductapply, actualclockfocused/contentpacketpending.652exactdiagnosticMos1712conditionalactualdriverinspectionpending/noexecution. Next4586.
2026-10-25T12:21:07.402725+00:00 | Sage4592-4594 | #652ONE4590 diagnostic13/9safetyCONTROLpass/4final-livenessFAIL. All4ensure/rotate×stale/[] reached finalretirementassert aftervalidsetup/postphaseoriginalsweeps/realHTTPkeyloss/freshrepair/independentOSreaps. Parent10resultartifacts+rawc147036b39395/0c88bc5a/ninebeforeafter==6d/source42currentverified;0skip/cancel/timeout/cleanup,19/19,ownroots0. SentMos4592 explicitdispositionrequired, recommendboundedSTATICrepairproposal notpermanentlimit; NO652fixselected/sourceedit. Clock755UNAPPLIED/all5REDverified/focusedstaticpacketpending. Actualunused4588/hold4589/sole4590machinecontextpreserved; humancontextsentence typoexplicitinsummary. Next4595.
2026-10-25T12:25:05.918909+00:00 | Sage4595-4596 | Clock650focusedpacket8046314af/4058a60a independentlyverified26artifacts+5REDpins/currentbytes.15wholelist0bd38b5d, reasons/driverread; OWNtempscratch exact755+abd applies current6dbase andmatchesall6virtualSHA/bytes/Gitblobs, realproduct/docsUNAPPLIED. SentMos4595 exactapplication/focusedruling request:ONLY4products+2docs; actualpre-runfreeze+SageCLEARbefore15run, commitonlyGREEN. Broadercollateral FINALgraph;noneof15usesnew652helper; markerproductioncallerSOURCEonly; wrongowner/unreadable/currentLinuxbounds/unconfinednotTERMresistance limitsretained. #652measured13/9controls/4finallivenessfails awaitsMos4592EXPLICITdisposition beforeANYfix/permanentlimit. Allcurrentsource6d/ModelKeys815unchanged; no activegate/queue. Magica4596auditACKdelivered, no additionalrun/editCLEAR. Next4597.
2026-10-25T12:26:15.846556+00:00 | Mos1713 disposition #652 CONFIRMEDAVAILABILITYDEFECT measured6d, remediationREQUIREDbeforefinalP2acceptance; no permanenthold/restartresolution/notauthoritygain. Parent4597relayedSTATICruntime/privateinventoryproposal ONLY: perexactidentity positivekeyassoc+strictbothprocessvalidation beforemonotonicprovenance; afterloss allowonlystrictabsence/reaped/samestartzombie, LIVE/unknown/mismatch/readerrorhold. Preserveinitialguards/boot/stopauthority/L3btable/allpubliccontracts, noabsentkeyreadd/restore/knownerasure. ReturnEXACTunapplieddiff/statetable/existing13mapping/newnegativecontrols/boundedfocusedplan beforeANYnewexecution/sourceedit. Clock8044058separateunderMosinspection. Next4598. Singlequeue-next2503pendingnoduplicate.
2026-10-25T12:29:22.883268+00:00 | Mos1714 /Sage4600 | AuthorizeONLYclock755fourproducts+abd2docs, sixpaths; virtualc0732a15independentlymatchedbyMos+Sage. Relayed4600APPLICATIONONLY toMagica, accepted15wholelist0bd38b5d but NOtestuntilparentactualpre-run sixblob/sharedinput/driver/config/list/9baselineinspection and separateCLEAR. CommitonlyfocusedGREEN/mapbeforelateredits; exclude652drafts from650commit/frozeninputs. ModelKeys815/runtime652unchanged;652STATIC1713only/confirmeddefectmustfixbeforeacceptance. No full/newreviews/queue/global/FEDR7/288/landing. Next4601; singlequeue-next72430pendingnoduplicate.
2026-10-25T12:40:15.546966+00:00 | Sage4603-4604 | FINALclockactualpacket3f52ce9b1/c747a85a ALL10artifacts verified,current6candidateSHA/bytes/Gitblobs approvedvirtual. Finalfrozen7281d6416+1184sharedinputhash/Gitblobs allrechecked,15tests included/652helperexcluded,9baselinemappings/currentonly6pathsdelta. Prior9053objectnotavailable so no independentonly10diffclaim, allFINALpinsverified. Driver46c/configd31areadunchanged. Narrowboundedreal--test/devgate scan EMPTY. ActualrunCLEAR4603issued ONLY15/list0bd38b5d (189reference expectedallGREEN), firstunexpectedskip/cancel/timeout/unavailableSTOP, no edits/retries. Realbwraptimestamp/mode/once/temp/noproxy/outputandownership/FD/exit2/release/signalassertionsmustreach; limitsretained. Sourceuncommitted755+abd;ModelKeys815/runtime652unchanged;652STATIC1713only. CommitonlyapplicableGREEN/mapfrozenbeforelateredit. Mos4604stateackdelivered. Next4605.
2026-10-25T12:47:13.660608+00:00 | Sage4605-4609 | FOCUSED4603STOPafter2files:clock5/5GREEN,reader19/18pass1unexpectedFIFO nice16!=19. 24total23pass1fail0skip/cancel/timeout;driver/testchild19. Rawfirstf51bc7071120,reader8a5d1b9e4393 audited. FIFO childrc0/nonblocktimeoutfalse/stop1BEFOREnicepassed;FD/receiptAFTERniceNOTreached. Source6+frozen1184unchanged/currentverified, ownclock/readerroots0. Remaining13filesNOTRUN/no189GREEN/noproductcommit/retry. ToldMagica4605preserveexactevidence, Mos4606boundary. ParentUNAPPLIEDstaticfixtureproposal4607 SHA58d08778 changesONLYprobe importsetPriority andsetPriority(0,19)beforewatcher; finalgetPrioritymeasurement/strict19assert unchanged. Oldhelperd711c0b8->a937f504917bytesOWNtempscratchchecked. Cause16UNPROVEN/nohostreniceclaim;laterdriftstillfails. AwaitMosexactfixture/rerunrulingandMagicaresultmanifest. Magica4608coordinationdeliveredNOactualedit. #652STATIC1713outsidefrozen scope/confirmeddefectunresolved. Next4610.
2026-10-25T12:51:40.585221+00:00 | Mos1715 /Sage4610-4611 | Exactfixture58d08778 acceptedCONDITIONALold4603fullaudit. Parentnowverified66c734f2 ALL10artifacts+2rawf51bc707/8a5d1b9e, all1184+sixpostSHA/bytes/Gitblobs/nineproductmappings==pre;24/23pass1nestednice16failure,0skip/cancel/timeout,ownroots0/hooks0100. Savedparentmanifest/full-audit. Relayed4610APPLICATIONONLY afterworkerreceiptpreserve: helperd711->a937f504917bytes onlysetPriority(0,19)beforewatcher,FINALmeasurement/strict19assertuntouched. No actualexecution yet; NEWV2actualfreeze/currentbaseHEAD/15list/driverconfig/newhelperpinrequiredthenparentreinspect+separateCLEAR SAME15FROMSTART, no readercomposite/oldRED rerun. Keepoldrecordsimmutable,source6clockbytes+ModelKeys815/runtimec5unchanged,sevenpathsremainuncommitteduntilfull15GREEN/map. #652STATIC1713outsidefrozenonly. Cause16UNPROVEN/laterdriftstillfails/nohostpolicyinvestigation. Mos4611conditionauditACKdelivered. Next4612. Queue-next27074singlependingnoduplicate.
2026-10-25T12:57:37.417489+00:00 | Sage4612-4614 | V2actual6a9c79de3/c15260d0 ALL10artifacts+frozende50de49(1184+six)CURRENT SHA/bytes/Gitblobs verified. Old/newinventoryDIRECTcomparison ONLYhelperd711->a937semanticrow+oldgate->v2metadata row;allsixvirtual/controlrowsunchanged. Driveronlycomment/evidencenames/configlimitsunchanged;old66/10artifacts2rawpreserved,exact7uncommittedsource/doc/helperpaths,ninebaselinemappingsverified. Boundednarrowgate/testscanEMPTY,issuedACTUAL4612 SAME15wholeFROMSTART only(189reference),no composite/readeronly/oldRED/full. Commit/mapONLYfull15GREEN;652STATICoutsidefrozen/no product652change. Mos4613stateACKdelivered. Next4615.
2026-10-25T13:05:38.430394+00:00 | Sage4615-4618 | V2focused4612STOPafter3files31/30pass1exclusivecollisionFAIL,0skip/cancel/timeout/cleanup. Clock5/5;reader19/19nowreachedFIFOrealnice19/FD0/receipt;producer7/6pass1 atpreexistingcollisionexistsfalse. Fixeddiag+unlinkCalls0beforeexistpassed;closeCalls0afternotreached/NOdeletionattribution. Parent141e94b8 ALL10artifacts+3raw/post1184+sixcurrentSHA/bytes/Gitblobsverified,roots0,remaining12filesUNRUN,noproductcommit/retry. Rawproducer9d5b6662/2477. ParentEXACTUNAPPLIEDtest-onlyproposal a5484cf9 toMos4616: first-turn.test.mjs d184->d2aacf294639bytes, savedoriginalopenwx/create+writeNUMERICfd+closefinally collision preseed; addcollisionCreatedflag/assert,ALLexisting7/assertions/countersunchanged,NOproduction/timingdelta. OWNtempscratchapplychecked. StaticNode26.8.1matchinginstalledHEADER fs.js2795-2846/getOptionsutils311-330 supportsreentrantpathnamewrite missingencoding; NOactualruntimecalltrace/Nodeversionexecution claim. URLs inproposalJSON. ToldMagica4617holdnoapply/rerunawaitMosruling,preserveV2receipttip. #652STATIC1713outsidefrozen/unresolvedconfirmeddefect. Next4619. queue-next27074resolvedrow7ledger;current331scopecontinues/no pendingqueue/gate.
2026-10-25T13:08:57.501876+00:00 | Mos1716 /Sage4619 | ExactUNAPPLIEDcollisionfixturea5484cf9ACCEPTED afterV2postpreserve/audit alreadycomplete141e94b8. Relayed4619APPLICATIONONLYtestfirst-turn d184->d2aacf294639bytes, savedoriginalexclusiveopen/numericFDwrite/closefinally+setupflag/assert, ALL7cases/existingassertions/counters/fixeddiagretained. Preserveold4612/4603records,staticNodeinferenceNOTexecutedtrace/version/deletionproof. NeedNEWactualV3fullfreeze DIRECTV2 ONLYnewsemanticrowfirstturntest;FIFOhelpera937+sixvirtualsource/docs+ninebaselinesunchanged,15wholeFROMSTART afterparentreinspect/separateCLEAR. No currenttestclear/gate/productcommit;8candidatepathsUNCOMMITTED. #652STATIC1713outsidefrozen/confirmeddefectstillmustfixbeforefinalP2acceptance. Next4620. Singlequeue-next6948pendingnoduplicate.
2026-10-25T13:13:36.331743+00:00 | Sage4620-4622 | V3actual2b4c099b0/f2400b62 ALL11artifacts+7ce729b2ALL1184shared/sixcandidateSHAbytesGitblobsverified. DIRECTV2ONLYfirstturntestd184->d2aacf29semanticrow+V2gate->V3metadata, FIFOa937/sixvirtualproductdocs/ninebaselinesunchanged;driveronlycomment+3evidencenames/configlimitsidentical. Exact8uncommittedpaths/botholdunexpectedrecordsintact/narrowgate-testscanEMPTY. IssuedACTUAL4620 ONE SAME15FROMSTART only189reference,firstunexpectedSTOP/no edits/retries/composite/oldRED/full. AllcollisionCreated/existence/unlink/close/producerFD/actualbwrapLinuxmarker/controlledexitassertionsmustreach;commit/mapONLYcompleteapplicableGREEN beforelateredits/exclude652drafts. ModelKeys815/runtimec5unchanged/652STATIC1713confirmedblocker. Mos4621stateACKdelivered. Next4623. queue-next6948resolvedrow7ledger;active331scope/no pendingqueue.
2026-10-25T13:21:40.454724+00:00 | Sage4623-4625 CLOCK650SCOPEDGREEN | Actual4620 V3whole15FROMSTART189/189/0fail/skip/cancel/timeout. Parentf92b3f16 ALL10artifacts+15rawSHA/bytes/TAPcountsverified15driver/testchild19/finalcomplete. All1190frozenrows(1184shared+6candidate)CURRENT+GitcommittedSHA256/bytes/blob/tree/multiset mapd86735387f to PRODUCTee375c1fba562a0def63743e6515fd0a33f42387 independentlyverified; commitAFTERrun/exact8acceptedpackage-planpaths/no652draft. Receipttip4d4fad7e3sourceidentical. RealbwrapLinuxmarker timestamp/mode/once/temp/noproxyoutput, collisioncreated/existence/unlink0/close0, FIFOreal19/FD0/receipt, actualUNCONFINEDlanding/message/retryexit2/release/ownTERM/nolaterturnallreachedGREEN. Limitswrongowner/unreadable600/confinedfault/forcedTERMresistance/productioncallerE2E/realrotation/nestedpriorityretained. CleanupHONESTnewclockrootsclear/hooksdone, oldprivatecontrolfixture dirs12launcher+2sessionlaunch+15modelproxyretained/inventoried;NOextra cleanup/processlockcensusclaim. Parentclock650-v3-green-independent-check.json. Mos4623resultdelivered;Magica4624prioritizealready-authorized1713STATIC652packet currentbaseee375/4d4. #652CONFIRMEDblocker stillUNRESOLVED/runtimec5andModelKeys815UNCHANGED;original4590diagnostic6dcontextpreserved. NOnew652product/test/Nodecheck/graph/full/freshreview/queue/global/FEDR7/288/landingCLEAR. Task650remainsOPEN despitefocusedGREEN. Noactivegate/queue. Next4626.
2026-10-25T13:42:54.530646+00:00 | Sage4626-4630 #652STATICreview | Initial039/d1bb10artifacts+9ee375products+25testpins/old23tail/a957old13/47behelperverified;tempscratchfb runtimec34497a154200/blob956ffe7e. FoundnewcounterambiguityBEFOREexecution: refresh->readSessions->seat/session401startTimeOf(runnerPID) incrementsanyprocread. Directed4626ONLYNEW2casesRegistry[]afterinitialview+lose BEFOREfault, preserveALL7assertions/old13/helper/fb. StaticfindingNOTobservedtestresult; oldR1UNEXECUTEDpreserved. R2packet50cb32959/44ac69a5ALL14artifacts+9products+25pins/actualfrozenbc3397edALL1190CURRENTsha/bytes/Gitblobsverified. Newtestc1b24468, DIRECTdiffONLYwriteSessions[]setup;driver/configreadwhole/privatecfg/nice/original1s+5s budgets. ExpectedONEnew7/5controlsPASS2exactstrictrecheckRED NOTobserved. SourcefbUNCHANGEDUNAPPLIED/runtimec5+ModelKeys815+clockee375unchanged. SentMos4628 exactcontract+ONEnew7REDrequest beforeANYexecution/application;focusedfuture25=new7+old13+EXACTold23. Needexplicitnullrecordbranch/coldbootlimitruling: priorvalidatedMapcanstrictdeadcheckifrecordnull,controllerSKIPsno-recordunchanged;initialcoldunassociatedholds/noallgenerationclaim. Validatedacqassociated&&atleastoneLIVE AFTERfullsame-instance success;fullydeadusesM1bits. Magica4629holdactualbytes/noextraactions. No activegate/newqueue;next4631.
2026-10-25T13:53:05.506689+00:00 | Mos1717 /Sage4631-4633 | EXACTfb7203contractACCEPTEDconditional NOapplication. ExplicitnullmodelRecord=associationloss forEXACTpriorvalidatedidentity->sameSTRICTbothterminalproofallowed,NONEWprovenance;controller no-recordSKIPunchanged/null-specificcoverageUNVERIFIED. Coldunassociatedbootfailclosed/warmrepairONLY/noallgenerationclaim. ParentFINALcurrent50cb/44ac14artifacts+9unchangedee375products+25pins/bc3397ed1190SHAbytesGitblobsverified;runtimec5/ModelKeys815/fbUNAPPLIED;narrowtestdevgatescanEMPTY. IssuedACTUAL4631ONLYwholeNEWmodel-key-provenance7 pre-fixRED expected5safetyPASS2namedread/ticksREDatstrict-recheckassertion,NOexpectation-evidenceconfusion. Samewhole/privatecfg/19priority/original1s5s/owncleanup,firstunexpectedSTOP/noretryedits/extraold13. Mos4632stateACKdelivered. ReturnverifiedRED+separatelyinspectableactualSTATICfocused25driver/list/config/content+virtualruntimec344candidate BEFOREimplementation/focusedauthority. Clock189/mapd867stable; nofull/graph/mutants/review/queue/global/FEDR7/288/landing. Next4634. Singlequeue-next3939pendingnoduplicate.
2026-10-25T14:17:38.642944+00:00 | Mos1718 /Sage4636-4638 | Prerequisitec1af7/5safetyPASS2exactRED/10artifactsrawf495/1190postpinsverified.033focusedvirtual9artifacts+9products+25pins/1210rowsverified/currentc5separatevirtualc344. Relayed4636APPLICATIONONLYfb runtime1path;actualc34454200/blob956. NEWactualc6c7a5aa0/38720db6 ALL10artifacts+89e32674ALL1212CURRENTpins verified. DIRECTvirtual1210 ONLYruntimec5->c344+2actualmetadata rows,all25tests/helperold13/ninebaselinesunchanged;scratchbytecompare fb=actual. Soleuncommittedproductruntime,configcontrolsidentical/driveronlymetadatanames,033+c1af/4590/clockmappreserved. BoundednarrowtestdevgatescanEMPTY;issuedACTUAL4637ONEwhole25FROMSTARTnew7->old13->exact23/296REFERENCEonly,firstunexpectedSTOP/no edits/retries. Mos4638stateACKdelivered. Commit/mapONLYcompleteGREEN beforelateredits;AFTERGREEN+map ONLYreadonlyfreshgraph/list/fullpacketprep,no full/mutants/review/queue/global/FEDR7/288/landing. NullcoverageUNVERIFIED/coldunassocfailclosed/warmonly/noallgeneration/realrotation. Laststatus22filesfinished/host23running, noaggregateclaimyet. Queue-next3939resolvedrow7ledger/no pendingqueue. Next4639.
- 2026-10-25T14:54:30.601485+00:00 | Sage row331 final builder BEFORE | Verified c210/b445 current16 artifacts,456 committed candidate paths,51 behavior pins,671 selected/graph files and1212 focused pins; lane clear. Mos1719 authorized one builder, actual sage-4643 running on8e54. Standing FED R7 skip remains unverified; no broader acceptance/landing.
- 2026-10-25T15:06:56.091482+00:00 | Sage row331 final builder AFTER/STOP | Probe+163 whole files:1639 tests,1637 pass,1 fail,1 authorized FED R7 skip; no aggregate acceptance.164 raw logs independently verified, remaining121 files/config/mutants/controls unrun. Source8e54 unchanged,ModelKeys815/runtimec344 restored. Separate one-step driver16/child19 recorded without cause attribution. Exact fixture forwarding proposal3aa973dc remains unapplied pending ruling; no assertion/deadline change.
- 2026-10-25T15:23:00.032777+00:00 | Sage row331 fixture AFTER | Exact dispatch forwarding correction passed whole session-clear5/5 with measured19/19, no skip/cancel/timeout. Result42932d7a/raw0b7d1497 and1216 frozen rows independently verified against2da21e13;map1e11f6d4 committed87ee30b1d before later prep. Original stopped builder637 retained; no composite acceptance. Read-only refreshed full packet and unapplied priority proposal await separate ruling.
- 2026-10-25T15:34:29.723336+00:00 | Sage row331 R2 full BEFORE | Verified actual6dc9cf3a/b1013592 all1622 inputs,13 artifacts,nine products,52 behavior and671 graph inputs againstcode2da; exact3e4/5982 priority-guard driver. Cleared one probe/284/config/four-original-mutant-control block from START underMos1721/sage-4657. Old637 stop and priority16 preserved; only namedFEDR7skip permitted unverified. No source/review/landing changes.
- 2026-10-25T15:50:10.065429+00:00 | Sage row331 R2 full AFTER/STOP | Probe+174 files:1756 tests,1754 pass,1 old thread-revoke failure,1 permitted unverifiedFEDR7skip.175 raw logs audited,all19/19,no cancel/timeout/signal.110 files/config/mutants/controls unrun. All1622 frozen inputs and52 behavior/671 graph code pins unchanged;runtimec344/ModelKeys815. Test host mirror lacksrecoverLaunch before runtime; exact fixture proposal being prepared without execution. No composite acceptance.
- 2026-10-25T16:05:33.469862+00:00 | Sage row331 thread fixture AFTER | Exact runtime dispatch forwarder passed thread-revoke3/3,measured19/19,nonskip/no cancel/timeout. Result86975ce3/rawc9a5d06a and1625 frozen/current/committed rows verified;sole fixture commitfffbe05af,map1d867353 committede906cfc8a before later prep. End/claimrelease/no-newlaunch checks reached. Prior stopped full runs retained; no composite acceptance. Read-only full packet refresh pending separate ruling.
- 2026-10-25T16:24:45.965804+00:00 | Sage row331 R3 full BEFORE | Verified f99b10ec/be9bc6e0 all1628 current inputs,13 artifacts,nine products,53 behavior/671 graph againstcodefffbe;exact2965 driver. OldR2driver and all stopped/scoped evidence preserved. Cleared one probe/284/config/four-original-mutant-control block FROMSTART underMos1723/sage-4671. Only namedFEDR7skip allowed unverified;no source/review/landing authority.
- 2026-10-25T16:54:21.093174+00:00 | Sage row331 R3 full AFTER/scoped VERIFIED | Result63d440bf/evidencee5b4a8d1, all14 committed artifacts+294 raw SHA/bytes/TAP/order checked. Whole2842552tests2551pass0fail1 authorizedFEDR7skip(unverified),separateprobe30/config55/4wholecontrols120 pass.4ORIGINALnamed mutants killed1/1/1/3 assertionfailures,all6ERR_ASSERTION,815 restored each/end. ALL294 real19/19,0cancel/timeout/newskip;all1628frozen/53behavior/671graph/nineproducts unchanged.13 private-control scratch retention inventories preserved,no census. FullP2/reviews/global/FEDscript/row288/landing remain open; next review brief is DRAFT only pending ruling.
- 2026-10-25T17:21:57.367080+00:00 | Sage row331 formal review BEFORE | Correctedbrief17972714 preservesoriginal0418. Existing53-sourcebb/codefff/evidencee5b/result63d frozen. Formalround3request31706 posted ownJarvis and independently read back with correctissue1829/author/markers/entiremanifest. IndependentBoydCodex+ONEfreshClaudeQ246(high) started afterprovenance verification; no tests/sourceedits/queueverdict/landing authority.
- 2026-10-25T17:52:23.336296+00:00 | Sage row331 source review AFTER/CHANGES | Both independent reviews identifymissinglauncherbinding blocker. Boydqualifiedlows/consentpreserved,ownJarvisattributedrelay31707 readbackverified;actualBoydcanonicalCHANGESrecord4135 independentlychecked. Existingbuildergreen remains scoped,fullP2unaccepted. ConditionalMos1725 nowauthorizesSTATIC653-656packetpreparation only,653/654first;no sourceapply/test/full/newreview/landing authority.
- 2026-10-25T18:24:29.738793+00:00 | Sage row331 #653 test-first AFTER / #654 coverage BEFORE | Mos1726 one-file sage-4701 reproduced exactly two managed proxy launch failures after successful preflight; three nonproxy/refusal/no-launch controls passed. Result76feb41a, rawc3bc72a3/4035 and all1633 frozen/current/committed inputs independently checked; no source application, post-target proxy binding/watcher checks unreached. Mos1727 actual packet39be7914/freeze445dc825 independently verified with lane returned/clear; issued sage-4703 for one current pending-organization coverage file expecting four passes, outcome pending. Productfff/old53bb and prior reviews/evidence retained; no acceptance/landing claim.
- 2026-10-25T18:31:16.393237+00:00 | Sage row331 #654 coverage AFTER | One whole current-source file passed4/4, zero skip/cancel/timeout; resultb60936e7/rawb5e83990/1293 and all1633 frozen/current/committed rows independently verified. Mapcc651951 to64e0a982 publishedb442 after GREEN and before later edits; sourcefff/nine products/53 manifest unchanged. Covers exercised pending organization-busy branch only, not generation ownership. Separate #653 import-only/focused15 virtual packet20af76b3 inspected and sent for scoped ruling, no product application/run or final acceptance.
- 2026-10-25T18:34:30.320932+00:00 | Sage row331 #653 repair BEFORE | Mos1728 authorizes exact launcher named fs import binding only and matching focused15 driver preparation. Parent rechecked unchanged old53/nine products atb442 and sent4708 exact application/preparation instruction. New applied freeze and independent current-input/lane inspection are required before a distinct test CLEAR; no test run or fixed-behavior claim yet. #655/#656 remain unresolved, historical review/RED/GREEN/maps preserved.
- 2026-10-25T18:39:00.750135+00:00 | Sage row331 #653 focused BEFORE | Applied launcher equals exact approved import-only373d; current driver equalscfd. Before any execution parent caught an omitted consumed-list path in input inventory; metadata-only superseding packet8e6dd390/freeze97e24ceb preserves prior1636 and adds that existing list row. All1637 current inputs/10 artifacts/15 tests/nine products and historical654 map independently verified, no competing Node test/gate; issued actual focused15 CLEAR sage-4712 underMos1728. Outcome pending, no fixed/acceptance claim or additional source authority.
- 2026-10-25T18:57:50.207677+00:00 | Sage row331 #653 focused AFTER / #655-656 static contracts | Verified complete15-file173/173 nonskip, all15 raw logs and1637 tested/current/committed rows mapped93ae todf75 afterGREEN, map firstpublished9ced before38b static preparation. Actual managed-launch5 reaches pre-spawn enable/trustedbinding/idle and first-turn clock/real stall stop/output controls. Product change only missing import. #655 original serialization-only proposal030 rejected byMos1729 for duplicate credential effects; exact shared-validation revision and isolated tests authorized STATIC only. #656 partial-state/durable-intent disposition remains open; no recovery implementation/test or full-P2 acceptance/landing granted.
- 2026-10-25T19:01:13.027004+00:00 | Sage row331 #656 design BEFORE | Mos1730 selects static narrow matching-temp/durable-revocation-intent proposal and isolated test preparation; broader only-temp/differing-generation states get separate nonlaunchable-intent design only. Relayed4720 strict all-key remote/run/file proof, intent-before-temp-removal/retry and truthful atomicity requirements; no product application or execution. #655 shared-validation revision remains independent static work. Testeddf75 source preserved, full acceptance/closure pending.
- 2026-10-25T19:04:29.712397+00:00 | Sage row331 #656 static boundary | Verified4547-byte atomicity note1f2b7864/sourcepins. Existing descriptor/stat checks plus pathname unlink provide no inode-conditional final syscall against arbitrary external sameUID replacement. Returned concrete concurrency-contract choice toMos4722 before recovery code/test authorship; no workaround/experiment applied. #655 static revision and broader656 design remain independent, testeddf75 source unchanged.
- 2026-10-25T19:08:56.725413+00:00 | Sage row331 #656 qualified static design RESUME | Mos1731 accepts cooperating-writer/private-store concurrency for proposal/test authorship, explicitly excludes arbitrary external sameUID replacement after final verification from guarantee. Relayed4724 strict synchronous revalidation/tmp-first intent ordering and complete cooperating-callsite trace requirement; any current ordering bypass returns before proposal acceptance. No atomic compare-unlink claim, product application or runtime test grant. #655 and broader656 design remain separate, source testeddf75 unchanged.
- 2026-10-25T19:25:50.472210+00:00 | Sage row331 #655 revised static review RETURN | Verified c7/ce7 nine artifacts, current product/source/test pins,1637 prior mapped inputs, and scratch-only three-file ef299 proposal. Before execution identified expected-map first-failure mismatch in cases14-16, cleanup launch-log scan omission, and need to carry original captured revision into locked publication rather than fresh revision substitution. Returned4726/4727 for static corrections/contract ruling; no source applied, Node/test/proxy run or acceptance granted. #656 static work remains separate.
2026-10-25T20:03:48.870029+00:00 — Sage row331/#655 correction: previous static A/C objection missed OptionC injected-writer R0 override; withdrew after full source trace/Mos1733. No publication API expansion. Preserved4733 unexpected whole-file fixture errors and all evidence; exact NEWhelper variable correction106 only, audited superseding01ac/1647 inputs and cleared ONE whole rerun sage-4742 underMos1736. No product application. #656 narrow static model-final-order work separate; #657 broader recovery-intent DESIGNONLY ownerSage perMos1737, no executable/path creation authority. FormalR3CHANGES/tasks647-657 remain open.
2026-10-25T20:27:02.650878+00:00 — Sage row331 #655 bounded verification: independently audited intended pre-fix e219 (exact9targetsRED+9controlsPASS), exactef299 applied underMos1738, focused sage-4750 COMPLETE22files300/300PASS0skip/cancel/timeout, all22real19/19. Exact3products committedafterGREEN27f68; all1652testedrows mapped88a92/firstpublication67394 beforelateredits. Separate unexpected068/priorformalnegative retained, not compositefull. #657 DESIGNONLY proposals3ce07/108780 with manifests c13/a6b returnedMos; prospective before-PUT ownership design, no privatepaths/code/tests/experiments. #656narrowstatic remains independent/open, no full/newreviews/queue/global/FED288/landing/closure.
2026-10-25T22:02:57.713692+00:00 — Sage row331 STATIC656/657/658 and first656 measurement: audited complete narrow14678/fd503 virtuals/all1657 inputs, acceptedtestfirstMos1749; exactactual1665/driverae284 inspected and sole4778runtimewhole cleared. Verifiedca07/raw5bca37584:39=32exacttargetRED+7controlsPASS,0skip/cancel/timeout/signal,real19/19,allpostpinsunchanged/source27f68/oldfixtureUNAPPLIED. Nextcompletionfile REQUESTEDonly4781; no automaticrun/application. #657A/source+newtests ONLY ownedunapplieddiffs/unparsed/unexecuted, selectedSELF/eventgrace and helper-onlyproposal static; #658generationconfig-last design returned, Mos1750selectsexplicitprovision-new coexistence STATICnextscope, oldbootstrap/T-I1unchanged. All acceptance/closure gates remain open.
2026-10-25T22:34:26.180461+00:00 — Sage row331 #656 three separate intended-RED phases verified: ca07 runtime39=32R7G,44c2 completion21=19R2G,cb13 remove21=16R5G; all exact first targets/raw/postpins/currentGit, strictreal19,0skip/cancel/timeout/signal. Scopedcontrols only/posttargets unreached, no compositeGREEN. Independently audited STATICfocused33 packet4799129b/1688 current vs3virtual changes; Mos1757 permits ONLY exactfd503+7a1dapplication/204cdrivercreation and NEWactualfreeze preparation, relay4798; actualrunCLEAR pendingindependentinspection. #657 selectedprivateclockproposal f579 under1756 +fixturecompatibilitystatic scope; allowned657diffs unparsed/unapplied/unexecuted, needintegrationrefresh after656. #658 explicitprovision-new coexistence staticwork remainsopen, oldbootstrap/T-I1unchanged. No full/review/queue/global/FED288/landing/closure.
2026-10-25T23:33:24.741369+00:00 — Sage row331 #656 AFTER / #657/#658 static continuation: independently audited actual1694/driver204c packet then sole sage4799 focused33 FROMSTART. All511PASS/33raw203652B/zero skipcancel timeout signal/33real19pairs; new81formerposttargets reached in frozen source. Exact3paths committed AFTERGREEN38ba5762, all1694+16pins mapped69ce57a5 firstpublication30dcef before later receipt4a02. Mos1759 independently accepted APPLICABLEfocused only;656OPEN. Audited read-only interim ed8b/581378:65behavior/788changedblobs/677graphpins, recorded18roots0parsefailures/294selection recomputed from recordededges; allold284+6new+4businesscollateral, grant-scope/lifecycle-settings UNRUN current. NO fullgate/run/re-pin. #657A refreshed to38ba/031383e6 ownedUNAPPLIEDdiff only, incompleteB/legacyhold/case15 retained. Static positive revocation seed/caller packet4999 returned4807 with actualtrustedgeneration/ownedruntimeoriginalsweep queue/failedGETintent design, not executed; Mos1776 selected only extraFIFOawait1e998e74, inventory superseded preservingoriginal4999. Positivehelper/A-B/case7 exactguards stillunaccepted; #658 explicitprovision-new sourceproposal not yet authored. All647–658OPEN/no newfull/config/mutants/review/queue/global/FED288/landing/closure.
2026-10-25T23:41:11.932432+00:00 — Sage row331 #657 STATIC next packet: sent4808 runtime-clockcontrols manifest38c1a325/4808, NEWisolated helper/testdiff6a09c2b2/14524 and9UNOBSERVEDcases; native/default,6invalidvalues-beforeStore, actualruntimeisolation andsamewarm ORIGINALdue/strictidentity/terminal path. OnlyownedDIFFS/data, no actualsource/testinstallation, parser/Node/FS/proxy/test. All1694 mapped current SHAbytesblobs rechecked unchanged against38ba/map69ce. Seedpacket superseding87633310 marksMos1776 FIFOcallerSELECTED, original4999 preserved. Positivehelper/A-B/case7exactguards remainunaccepted; fullBGC/allcooperatingcallers/warmoldfixture and658sourceproposal remain work, no gate/full/review/queue/global/landing/closure. Nextstableoperation4809.
2026-10-25T23:44:53.880497+00:00 — Sage4809 #657 unaccepted-draft correction: source-read found A031383 second descriptor fstat omittedbigint:true while all other identity fields usedBigInt, so stable validfile wouldrefuse strict equality. No runtime reproduction. PreservedALLoldartifacts and4808manifest references; separate r4 combinedf1b5a13a/35866 newmoduled2d783f4/18928 manifestb2baf075/1573 changesONLYsecondfstatoption. ReturnedMos4809; current38ba/1694inputs untouched/noactualsource/helper/testinstallation/parser/Node/FS/proxy experiment. BGC/warmfixtures/658 remainstaticunfinished; no gate/acceptance/closure. Nextoperation4810.
2026-10-26T04:17:47.724968+00:00 — Sage STATIC continuation AFTER owner heartbeat1822: scope recovered without queue/Node invocation because explicit current no-queue/no-runtime ruling supersedes routine cadence. Preserved38ba code and all1694 mapped rows+16 packet pins, rehashed current SHAbytes/Gitblobs. Sent4810–4819 owned-only contract/clock/canonical/publisher/reader/GC/outcome boundaries; Mos1824/1826/1830/1833/1837/1841/1842/1843/1844 selected bounded STATIC directions only. Reader-r3 0edf corrects unresolved helper references, childc365 beforeStore/reconcile fences, host3ba beforeleftover/Registry/root writes, common240d internalreadonlyguard,7 new controls ad69 unobserved; exactRAM dependency reconstruction, packet396f. GCf196 finalnativeintentcheck only, actualreentrantproof invalidation stillunfinished. Actual captured-R0 failed-unpublished-hire enum selected1842, extra publication-outcome boundary17c sources rename/fsync/log/lockrelease/settingsread;1844 writer-ownedtoken nativephases now proposed d767+12 unobserved tests6df2 and separately inspectable prosehold c0d7; actualB consumer/restartpositiveproof stillunimplemented/unselected. Single trackerposts6571293/1294/1296 and6581292/1295 all definitive exactbody/author13/readbackOPEN; an initial read-only comments response-shape mismatch preceded any write and was corrected via items pagination, no duplicatepost. No source/helper/test install, parser/Node/process/test/FS/proxy experiment, full/config/mutants/newreview/queue/global/FED288/landing/repin/taskclosure. Oldmaps/partials immutable; nextoperation4821 after substantive4820 handoff.
2026-10-26T04:47:04.289784+00:00 — Sage4821–4822 STATIC continuation: Mos1845 inspected utilities only; authoritative phase successor77c866 rejects created AFTERpublish unless actualprivateflow proves invocation never occurred.14 new unobserved writer requirements77a2 preserveold12 and demonstrate ignored/misrouted option ambiguity. Scopedpositivepublication question6dd/5bd selected1846 ONLYforfutureownedUNAPPLIED13-field witness, noactualconstructor/reader/GC installation. Tracked6571297/1298 exactbody/author13/OPEN readbacks. Additional required origin/decision coupling returned4325025a/7920 manifeste97a8c60/3251 BEFOREbytes: immutable PER-OWNER bounded64 registration because actualmodel-keys.test47/49/121/161/167 repeatsModelKeys SAMECredentials; no blanketone-managerrestriction/oldtestedit. Proposedopaque actualrequest→nativegenerationticket BEFOREPUT +monotonicpublicationhold onretainedhostcontext, notJSON/ephemeralhelperproof. Independent658 visiblepartialpointer guardf788/3947 centralizedselectedreadonlyrootclassification BEFORENEWexistingpointervalidate shortcut;2newcontrols8afa/1706 UNOBSERVED, controlledpendingnotactualcrashproof, packet41fe. Freshall1694+16SHAbytesGitblobTREE checkedcode38ba,source/indexcandidateunchanged. No source/helper installation/parser/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure. Nextoperation4823 after4822substantivehandoff; actualBcallbacks/factory/joint656epochs/intentlastGC/warm/658fullinterruption/hosttransport remainauthoringwork.
2026-10-26T07:26:33.036846+00:00 — Sage4823–4824 STATIC continuation BEFORE/AFTER: candidate38ba and1694+16 pins remain exactGit/current, source tracked diff empty; no candidate edits/runs.1847 selected per-owner C-native brand/request-to-ticket-beforePUT/monotonic retained-host latch now has actual owned source bodies, actual adapter/ModelKeys intended-writer phase consumer and13-field positive publication writer/reader. Nine exact joint-r2 diffs text-reconstructed but explicitly INCOMPLETE/not installation-ready: actual B factory/native confirmation/typed656 proof-name-epoch join/full GC remain unwired; old511/REDs unaffected. Independent1848 native identity supplement fb22/e28be adds original pointer/root/pending dev/ino/nlink guards, and six new nativeEIO controls b359/8157 remain unobserved, not crash/concurrency/transport proof; later faults/types/oldcopy matrix open.1849 cold recovered-final-absence model-only proof scope recorded6571302, not native656 finished/absence authority and not implemented yet. Warm intent-only progress f425 plus context one-use/reconcile-null and closed-C guards897f/cf24 authored as corrected unaccepted overrides; no observed fix. Exact next interruption window after metadata cleanup before orgDELETE requires new external negative-handoff DESIGN decision b41e3113 before any path/schema/code. Tracker6571299/1302,6581300/1303 definitive entirebody author13 OPEN. No source/helper/test installation, moduleparse/Node/FS/process/proxy/test experiment, new gate/full/config/mutants/review/queue/global/FED288/landing/repin/closure. All647–658 remain OPEN; scoped source/evidence historical maps preserved.
2026-10-26T09:36:48.905968+00:00 — Sage4825–4826 STATIC continuation BEFORE/AFTER: code38ba and1694+16 exactcurrent/Git rehashed09:31, old511 scoped/history unchanged.1854 negative-only design d073/14916 fields+state/callers returnedb583, no marker implementation. Found current4actual656retry/reboot positives vsoriginal-request-only/freshHOLD conflict and returned3e500 before weakening/assertion changes;1855 selected one DESIGN comparison. NewR2comparison3c837/18999 proposes SMALL metadata-only registration+terminal chain, actual publisher/writer sealing and source-present native authorization; supersededunpublished1a2c had over-assumed originalphysicalsource mustsurviveuntilpub, correctedpreservingprovenance. No largearchive recommended/newpath/schema/outcometag/clear branch chosen. Independent actual native controller confirmation now source-authored from actual remove/confirmGET/401/fullview and moduleprivate registry; bothModelKeys.prepare callers pass token; Credentials CONSUMES snapshot/record/epoch beforeTMP andfirstfinal, readonlyactualfinished check neverabsenceauthority, runtime stop-map invalidation, existinglifecycleCrev guard mapping. Exact3diffsa84a/da9d/0d46 textreconstructed; higherBfactory/classifier/typednames/GC stillUNWIRED; nativeFIFO/bookkeeping mustnotbeclaimedreachedafterearlierprovenancehold.1854/55 tracked6571307/1308 definitiveactualauthor13/readbackOPEN. No source/helper/test installation, parser/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/repin/closure. Nextstableoperation4827; currentformats/sealing/succession stillawaitseparateselectionbeforebytes; independentB/658remainopen.
2026-10-26T10:09:33.266521+00:00 — Sage4827 STATIC Mos1856 before/after: preserved current38ba/1694+16/511 and ALL original artifacts. One exact nested schema table now proposes final/tmp/intent native fingerprints and complete independently validated origin/publication digests, explicit decimal native stat encoding and organization/controller observation domains. No durable constructor/reader/path authored pending selection. Bound arithmetic largest variants2383/1118 bytes below8192, not protocol object creation. Writer seal and actual one-use raw publisher source proposals68da375f/4d480f5a direct38ba text-reconstructed ONLY, virtual7f96/9acc; sealed token refuses beforelock, same actual wrapper pending request/close ordering, created-after-invoke UNKNOWN, thenable hold, capturedR0/case15/hook semantics retained. These are publication-only utilities: native all-operation ledger/terminal producer/factory/typed656/GC/result-lease consumer NOT complete. Concrete actual valid-to-revoking C.issue unlink(model.tmp) occurs before future original revoking snapshot/intent ID; no future identity/exemption invented. Contract returns chain/postcleanup distinct result-lease/retirement directions,20 UNOBSERVED reached-boundary requirements. Packet5fa13344/9572 sentMos4827; OPEN657 comment1309 single201 exactbody/author13/readback. Source candidate remains unchanged; no installation/parse/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure. Next4828; existing B/658 independent work remains authorized.
2026-10-26T10:32:05.431575+00:00 — Sage4828 Mos1857 STATIC before/after: current38ba/511 and1694+16 rehashed10:30 exactSHAbytesGitblobTREE; no product/helper/test delta. Corrected literal schema4f50793d removes nonexistent valid field and records1857 selection, leaves exact original formats/history preserved. Newowned UNAPPLIED DATA-only source readera3299bba/16029 virtuale2d3/15682 plus10DATAunit dcb466cb/6083 only inside diffs. Canonical exact type/domains/count-before-allocation/bounded nofollow readonly whole-chain/native reread code, no mkdir/write/unlink or ready/terminal constructors; actual factory/workledger/constructor/retirement still UNWRITTEN. Undelivered067/99ff/22dsource drafts preserved; strict hash/UUID string guard correction source-only no measuredfault.20oldcontrols unchanged plus14native/8reader reached requirements UNOBSERVED; absent module import not intendedRED. Separate ordinaryVALID->REVOKING DESIGNcomparison40165044/14819 identifies TMPunlink then finalreplacement before current strict intent; staging-only insufficient. R1 terminal-only proposal3bb corrected BEFOREdelivery because controller-only has no composite root/validterminal. CandidateA asks originalVALID Bintent +small actual transition witness/newnullableCurrentSources member selection, NO newtransition field/path/code authored/selected. Native write/receipt crash and allotherholds honest, no permanentordinaryvalid limitation. Packetb71063fd/11952 sentMos4828; OPEN657comment1310 single201 author13 entirebody/readback. No JSparse/Node/FS/process/proxy/test/runtimeexperiment/application/gate/full/review/queue/global/FED288/landing/closure. Next4829; nativeBfactory/GC/worklifetime/658independent remain.
2026-10-26T10:59:39.269094+00:00 — Sage4829 STATIC1858 literalrefinement BEFORE/AFTER: schema31c29/13030 exact17witness fields, order4f65/30567, consumers3fb9/8102,26unobservednative controls825b/5691; current38ba/1694+16/511 preserved. Proposedintent/attemptv2 requiredsixmember makesoldfive/v1 incompatibilityexplicit, no nullalias/migration; Wv1 progress/historicaloldVALID/nativecurrentREVOKING distinct. Budget131072/128MiB completepathentriesinclalias bytes beforealloc, witness8192, staticarithmetic3601notserializerproof. ReferenceW->I yieldsW-beforeIonlynativefullproof/noconsumer thenIlast/pub-before-origin/joinedrootlast; no missingfinal/cold/native656prooffromfingerprints. No transitioncode authoredunder1858; OPEN6571311 single201/exactbody/author13/readback; sentMos4829packet80b8/10016. Mos1859 nowselectsschemaversion/caps/nativeproducer/order for ownedUNAPPLIED sourceonly. Continuing4830actualsource, no sourceinstall/parse/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure.
2026-10-26T12:21:16.986782+00:00 — Sage4830-4831 STATIC1859 BEFORE/AFTER: exact17W/v2I+attempt/six/sharedcaps/nativeproducer/WbeforeIselected, products38ba/511/1694+16 unchangedSHAbytesGitblobTREE11:25and12:14. Source-only fourutilitypartsfde9/14077: budget9ccb/r4 resourcecounternoauthority, attempt2/W1decoderreaderb044 typedlimitsintent262144/origin131072/pubW8192; ten+eightDATA tests9908/6f4UNOBSERVED. Sharedbudgetpercompleteactualtypedphase note3e25 forbidshelperreset/unknownwork; actualnativeCbinding/allfamilyrouting unimplemented. Continuednative2sourceadd152/10133 C5bae/MKee609: actualprivatequeue scopes/contextbinding3sites denyqueued/oldB borrowingA, sameR0/owner/privatefailed-newhireseal, oneusenativeclockdecisionbodyrevalidatesafterclock. CSourcePrepMaphasNOregistrationproducer/privatecapturehasNOcallsite, no positiveplaceholder/nativeCwriter/W/terminalproof; fullfactory/ledger/GC stillunwritten. CombinedemitterE2BIGprocesscreationfailedbeforeanyfilewrite, splitperfiletextemissioncompleted; sourceiterationspreservedunexecuted. Oneconcretenewcallerboundary10f6/8010: current38ba adapteronlypendingR0; uninstalledoutcomedraftinjectsA intoallinstanceSettingswriters, sealedA couldrefuselegitimateunrelatedhumanwrites; lease-running/firstwriteheuristicunsafeunderreentrancy. Recommendopaque intendedcommitbinding sixTHINTERNALruntime arg/privateopts/nativeWbinding, target/actor/args identity, preserveunrelatedR0+writerhooks;NOadapterdeltauntilscope. Alreadynolistedfiretransactionnull/noWriter remainsseparateunresolvedno-writeauthority. OPEN6571312/1313 single201/exactbody/author13/readback; sentMos4830/4831substantive. No sourcehelperinstall/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4832; actualCfactory/progress/metadata-key401/GC/result/658independentremain.
2026-10-26T13:14:58.870767+00:00 — Sage4832 STATIC1860 before/after (registered after authoring): baseline38ba/511/map69ce unchanged, all1694+16 SHA/bytes/Gitblob/tree remeasured13:10:37Z and source diffempty. Newowned four direct38ba diff proposals77e8 manifest17854,22artifacts+6dependencies/14sourcepins: Wcc9f virtualfd45/29585; MKr28350 virtual1ed2/50383; runtime5752 virtualb500/57247; businessdffc virtual4df2/31648. Sixth INTERNAL opaque binding passes onlymanagedhire/fire/DELETE, actualmethodchecks before native ticket, native consumptiononce/correlationNOTauthority, unrelatedB originalpendingR0/noglobalAoutcome and lockfence. Rejectwrong/replay beforeAoutcome mutation, createdafterinvoke/ignored UNKNOWN, preserve originalerrors during independentclose/release, case15 remainsbeforepublisher. InitialR1 preserved; source-only R2 prevents accessor/proxy SET falling through to unprepared lifecycle path, no product/test/assertion/helper/deadline change.34controls1aff2 UNOBSERVED requirements only. Native Cprep producer/rewrite/W/workledger/factory/metadata401/joint656/progress/GC/result remain incomplete, cannotinstall utilitygraph. ActualdelistedpresentmodelFIREtransactionnull/noWriter separate question13fd/2297 returnedbefore no-write enum/result/clear/restart bytes; no permanentavailabilitywaiver. OPEN6571314 single201/ENTIREbodyexactauthor13/readback. Substantive T3 handoff4832 delivered Mos. No sourceinstall/applicationparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4833 independentnativeB/658 static remains authorized.
2026-10-26T13:23:26.975486+00:00 — Sage4833 STATIC1861 BEFORE: bounded DESIGNONLY for actual already-delisted/model-present FIRE branch; preserve38ba/1694+16/511 and all4832partial source. Trace original read/fireChecks/revoke/read, actual completeRevoke/C onefinalunlink and original runtime nonmodel/residual cleanup. Propose native branch+current local result association, oneuse closed-work consumer, distinguish writer CREATED/UNKNOWN/no terminal/rename fact; return any1854/56/59 clearing extension before bytes. No source/helper install/parse/Node/FS/process/proxy/test/gate/review/queue/landing authority.
2026-10-26T13:38:59.424908+00:00 — Sage4833 STATIC1861 AFTER: finalR2design f49c/18934 +actualidentity/worktable34e5/10353+caller3c98/6268+30unobservedrequirements1227/14749; manifestddd3/14867 pins9owned+8deps/16Gitcurrent38ba sources. Exact actual settings conditional404/revoke405/readreturn406 (R1line403commentnav corrected/preserved). Proposed nativefactory/branch enter-return/resultsidecar onlyactualmethod, actualCtypedlowerfinish/servicebookkeeping/residualprogress+closedbinding/lease/ALLcapablework/latestepoch/every401/freshWHOLEruns/storage/latches before intendedoneuseconsumer. Rawpublisher remainsSYNC; outerexistingasyncdrainoutsidewriterlock; management/local unknownnotterminalizedbyexception. Cresult factory/workledger/nativeW/metadata401/GC stillunwritten; no positiveplaceholder/localcompletionfromcallback/read/transactionnull. Proposed checked-snapshotR0 afteroriginaladaptercheck and finalR0afterread/reload/drain explicitlyNEWnonlockingpredicates, no ABA/globalimmutability; unrelatedB originalR0/noAtoken untouched. NativewriterCREATEDafterinvoke remainsUNKNOWN/no rename/nonattempt/dummywrite; cold1849/native656/result/no-record distinct. ONEscopequestion b09f/4384: separate SAMEHOST exactnoWriteFIRE eligibleexternalretirement replacesonlywriterresultconjunct1854/56/59, allothers/rootLAST retained. No suchrule/enum/clear/restartcode selected, no positiveDELETE/freshmissingfinal/latchreset/permanenthealthyholdwaiver. NativeC/source/W/ledger/B/GC/658independentcontinue. Full1694+16hashbytesblobTREE38ba13:36, prior4832all28artifact+14sourcesunchanged, scoped511/case15/fouroldretryrebootcontrols preserved. OPEN6571315 single201 ENTIREbody/author13/readback and MosT3substantivereturn4833 delivered. No source/helper installation/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4834.
2026-10-26T13:41:46.493164+00:00 — Sage4834 STATIC1862 BEFORE: prepare owned UNAPPLIED actual settings branch/factory/forwarding and adapter/predicate/closedbinding/local-result consumer source bodies; typed C native completion/closed-work/B/GC dependencies remain mandatory, not callback labels. Preserve38ba/1694+16/511/current old source/4832+4833 packets. No installation/parse/Node/process/FS/proxy/test/gate/review/queue/landing.
2026-10-26T14:12:46.483842+00:00 — Sage4834 STATIC1862 AFTER: selectednoWritebranch+samehostconsumer direction source-drafted5direct38ba diffs/virtual pins8485manifest21601,26owned+8deps/16sources. Wb0b6->31b1/31931; MKr2df0b->6d08/58361; runtime4dea->f7f9/57882; business647d->5310/35054; Cr2948b->dc0c/61666. Native actualfactory config/adapter attachbeforeoperations; onlyactualfireconditional nativeentry, originalrevoke/read return +exactnativeprivateforward; fifthINTERNALrevoke scope. Writer unusedbinding/firebranch separatefromcheckedcommit/outcome, originalR0/noAtoken forunrelatedB. Selectednew snapshotR0 afteroriginaladapter guard and finalR0 afterclosedwork/proofawaits areNONLOCKING; finalproxyconflictavoidsfalsekeptreceipt. NativeC capture actualconfirmation/snapshot/context BEFOREactualunlink/confirmed deletion; finished nativeflag ONLYafterownunlink/bookkeeping; private finished/currentcontext verifier; readonly completedroute no secondfinish. C native declaredservice method/residual observations, unknowninflightnotguessedsettled. Outer native source guards close-first/drain/readonlyprepare/ONEconsumption and nativebeforeafterinspector; ignored/substitutedmethodsuccessnotauthority. R1parts preserved. CRITICALhighernativeB/work/chainauthorityWeakMap ZEROregistrations, no publicsetter; native source/workledger/metadata401/WHOLEruns/storage/holds/latestprogress/typedGC/rootLAST factory UNWRITTEN, higherpositiveconstructorunreachable; no utilityinstallation/healthyavailabilityclaim. NativeCstrictlowercannotrebasedthroughtypedGCbyguess; genuineempty/coldassembledcompatibilitystillopen.30oldrequirements+3newguardsd7ccUNOBSERVED. Concrete currentclientpromise lacksnativeownedreq/res terminalticket; question006ac/6236 asksboundednativebeforeeffectworkgate+readonlyinspector internaloptions/no reverseimport/newendpoint/publicfield/stopauthority, UNKNOWNtransportnotremotehalt. No sixthclientdiffauthored. Full1694+16/past4832/4833 artifacts+sourcerehashed14:04 SHAbytesblobTREE38ba, source diffempty/scoped511/map69ce/names/assertions/deadlines/case15preserved. OPEN6571316 single201 ENTIREbody/author13/readback; substantiveMos4834delivered. No source/helperinstall/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4835independentnativeB/658 authorized; clientcouplingneedsselectionbeforebytes.
2026-10-26T14:19:05.310945+00:00 — Sage4835 STATIC1863 BEFORE: selected actual ManagementClient native workgate/readonly observation plus actual ModelKeys-beforeHTTP ledger; preserve ungated semantics/receipts/timing. Pin Node26.8.1 official docs/source and static localheader inference, no node process. Capacity128, no payload per-unusedgate duplication/no releaseforget-livework, preserve expected401disposal versus UNKNOWNerror. No install/parse/Node/FS/process/proxy/test/gate/review/queue/landing.
2026-10-26 Sage mos1864 course correction BEFORE:657/658 parked OPEN backlog at4835 static packet; no design applied. Source fixes641/642/643, assertions retained, independent Codex review, quiet-host full gate4 then authorized green/reviewed landing. Existing unrelated work preserved.
## 2026-10-23 — Row 288 C2-02 build starts (Bubba, #1793)
Before: agents can read the library; supporting-path and push-credential dependencies are separate unlanded heads. After intended: per-seat supporting writes/deletes with exact notices, human revert and one commit per Console save. Work is on bubba/row288, chained on original 283/285/286 commits; 284 tool base still pending. Plan and acceptance evidence: agents/bubba/work/queue-288/BUILD.md. Untested; no Node/test/build/gate run before Sage CLEAR. Landing waits for every dependency's own gate.
2026-10-25 | Bubba | Row288 #1793 gate after landed284 | Candidate2848d832e:289 whole files rc0 (2604 pass,1 covered FED skip),12 scripts rc0,6 mutants killed/restored controls rc0. Own bare-delete and fixture reds fixed with driver restarts; no pre288 red. Per-run hashes/rc in agents/bubba/work/queue-288/gate-r6-results.tsv. Slot returned Sage bubba-0034; manifest review/landing pending.
2026-10-26 Sage BEFORE Mos1864 source timing repair: isolate193774 row288; distinguish interpreter probe timeout, deterministic owned-socket idle-clock test, async copy child completion, retain assertions; one independent Codex review then quiet fullgate4.657/658 are backlog, not landing blockers.
2026-10-26 Sage SOURCE CHECKS Mos1864:641 injected ETIMEDOUT regression RED thenGREEN; keep1000ms fail-closed probe bound, distinct interpreter-probe-timeout.642 real-socket manual idle clock/readiness preserves assertions, ordinary-timeout mutationRED/restored.643 async owned child-close signal/readiness, all156 original assertions retained; combined39/39 zero anomaly; bus package1035/1035 zero skip. Independent Codex thread mcp:9245555c-5430-42f9-8afc-f77a70fc09ee pending; fullgate4/landing pending. No657/658 applied.
2026-10-26 Sage Codex review/fix Mos1864: independent thread mcp:9245555c-5430-42f9-8afc-f77a70fc09ee found one introduced P2 (detached copy descendants escape external timeout TERM). Fixed via fixture-only active-pool signal handling/native child close; actual regression RED→GREEN. Final affected40/40 zero skip/cancel/fail; all original assertions retained, productionserver unchanged. One review, no extra design gate; fullgate4 now pending quiet-host launch.
2026-10-26 Sage Mos1864/1881 model join AFTER verification: reviewed330/331 product362893d043ff96fdd35f18e326cce683db031471/treea7f7fcd7fc2cc4ba06efad78627f5f04929a0740 has321whole-file native PASS plus actual FEDR7 1/1; originalR2 orchestratorrc1 counter defect preserved separately. Whole bus1349/model-proxy100/webui490 PASS on unchanged product. Final PIN8.0.42, config55, all4P4+4P2 exact named mutant kills and whole restored controls PASS. Counter independent Codex review found2P2, reproduced7RED then23/23fixtures GREEN; failclosed unknown/missing summary and either-format failures. Commit/tree recorded before/end same; all1968 current+committed inputs mapped49c162c99 before later artifacts. Source join fix isolates runner-safe vocabulary from host ProxyPage imports; exact graph expectations retained. Original setup/timeouts/cleanup failures preserved; no657/658 installed/backlog remains. Documented Poe acceptance alias is byte-identical tested helper, not separately executed. Authorized landing next; source frozen.
2026-10-26 Sage LANDING Mos1864/1881: origin/refactor52ba14c5f now contains product362893 plus map/evidence49c162c99 and documented acceptance alias. Canonicalrefactor fast-forwarded by CAS with only136 exact accepted paths restored; unrelated8Rocko staged deletions and all untracked preserved, source/index clean for packages/scripts. Product1968hashes still match before/end freeze. Full source641–643/row288 previously63ec/acd; now330/331 landed same authorized window with applicable gates complete. Actual queue331 done refused rc2: round3 no recorded Boyd/Dewey approval;330 remains Poe in-progress with no formal round. No review impersonation/bypass; metadata closure is separate hard-rule wait. Tasks655/656 comments1336/1337 exact wholebody/author13 GET-verified, remainOPEN;657/658backlog unchanged. Ops660 runner update1334 independently GET-verified; no heavy gate active/no VM selected. No further source or gate work needed for this landing.
2026-10-26T17:51:50Z Dewey POST-LANDING REVIEW Mos1909/Mos1915 (retrospective review-phase receipt, not a build): BEFORE code already landed under1864 at52ba14c5f/product362893d04; historical round3 CHANGES and missing approvals preserved. AFTER independent source/original-task/evidence review saved agents/dewey/work/queue-331/postlanding-mos1909/REVIEW.md; sha256 ab7edcb484a32093e9cb541032def275665f1572aa97bb118d2742f1f29fa97c. Scoped APPROVE;646-648/652-655 FIXCONFIRMED,656 PARTIAL against broader original wording with matching-revoking-tmp/single-final-completion repair confirmed. All1968map inputs match current+committed product;339existing raw log hashes verified; relevant owner execution outcomes inspected with FED skip/dedicated native1/1 and original R2rc1 distinctions preserved. New findings none;657/658 remain backlog. FILE ONLY: no actual verdict comment, queue approval, task closure, source/helper/test changes, Node experiments or new gate.
2026-10-26T17:56:44Z Filbert POST-LANDING REVIEW Mos1909/1915 #1828 row330 (retrospective review receipt): BEFORE product362893d04 already landed underMos1864 at52ba14c5f; canonicalround1 request4137/4138 failed pre-send, no comment/approval. AFTER independent static source/brief/evidence review APPROVE for landed originalP4 repairs/current-generation P2join; saved agents/filbert/work/queue-330/postlanding-mos1909/REVIEW.md sha256 0f93bc883f1db2d2e136323040eaff2ad79aa184fa5ab140c94a0ae906f70ffe. All1968committed mapped blobs/bytes/SHA256 match product/candidate/cited0e1dd0a95; current1966match plus2queue-tracking differences; all43 evidence hashes match. OriginalR2rc1 preserved separately from supplied321whole+FEDR7/native1 and completed package/PIN/config/eightmutant+restore phases. NEW-330-01 retiring-key Console metadata gap is task-ready separate follow-up only, no reopening/newgate. No test/helper/source edit or run, live/secret access, formalpost/queue mutation, commit/push/closure;657/658 BACKLOG unchanged.
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
2026-10-28T22:18:42-05:00 | Codex FIX-A4-001 project19 #710 BEFORE/AFTER | Isolated branch work/q284-web-fetch-ipv6-ssrf at exact base09a847ed; source pine5a7b647 and A4 report39380B/5ee6f798 verified. Focused web test baseline7/7; regression-first exact mapped-IPv6 literal/DNS/redirect run6pass/4fail; canonical-bit implementation then10/10pass. Changed only web source/test plus append-only receipts; no live/internal probe, scratch, dependency/install, heavy/full gate, commit, push, PR or API mutation. Full CI/cross-family/PR/release remain parent-owned.
2026-10-29 | Sage | #710 independent-review follow-up | Claude source approval of 4cf888c04 records LOW NAT64 policy disclosure: canonical classification refuses exact 64:ff9b::/96; the old text prefix also refused some addresses outside that range. Added explicit boundary tests; production source unchanged. Zone-suffixed inputs also fail closed. Other IPv6 transition/special-use ranges remain a separate deployment-dependent follow-up, not resolved here. Prior author no-commit statements describe that earlier session; local commit and Mos PR1834 publication followed. No native/CI/merge claim.
2026-10-28T22:29:01-05:00 | Vikunja-19 FIX-156 legacy worker mounts BEFORE (late phase receipt) | Isolated worktree clean at exact base09a847edaa25b609bac7728ff83f224708a29399, branch work/vikunja-19-156-q284-worker-mounts. Required queue probe refused in linked worktree and was not bypassed. A2 SHA/whole report, I1 direction and legacy task/interactive/probe callers traced. Focused baseline13/13; TDD RED17 total=13 pass/4 intended failures for absent typed mount builder/per-path task argv. Receipt appended after first source pass rather than backdated; no container/native/live/provider/full-gate/API/PR/commit/push operation.
2026-10-28T22:36:00-05:00 | Vikunja-19 FIX-156 legacy worker mounts AFTER/source-verified | Static Compose root/control mounts removed; typed task/interactive/probe builder emits fixed per-file RO task/mission/user/SOUL/skill/control/fork inputs, only selected workspace/session RW, private mode0600 per-container prompt and no root/run-evidence/sibling/broker path. Unsupported/missing inputs refuse before runtime registration. Exact-base parsed Compose characterization fails with /var/lib/mosaic and /var/lib/mosaic/control present; focused RED13pass/4fail then user-file narrowing RED7pass/2fail; final two-file18/18 pass, syntax/diff checks and direct user+mission prompt mode600 check pass. Author self-review found no remaining Critical/Important source issue; no independent review by explicit no-children scope. No native confinement/container/provider/full gate or generic credential read; no commit/push/PR/API/release.
2026-10-28T22:35:03-05:00 | Correction to immediately preceding FIX-156 AFTER receipt | Its 22:36 timestamp was rounded one minute ahead; actual clock checkpoint was 22:35:03-05:00. Substance and evidence are unchanged.
2026-10-28T22:41:42-05:00 | Vikunja-19 FIX-156 atomic-control continuation BEFORE | Parent intake found the per-file `control/processing.json` bind pins the inode that `state.mjs` later replaces by temp-file rename, allowing a post-mount halt/generation change to escape final entrypoint admission. Exact branch/base remain work/vikunja-19-156-q284-worker-mounts at 09a847edaa25b609bac7728ff83f224708a29399; source-only TDD repair will restore a narrow rename-visible read-only control view without the data-root root, evidence, sibling state, socket, native/container/full-gate/API/credential operations, or integration authority.
2026-10-28T22:44:07-05:00 | Vikunja-19 FIX-156 atomic-control continuation AFTER/correction | Source trace confirmed `state.mjs` publishes `.state-<uuid>` with `renameSync` over `processing.json`; a file bind can retain the old inode. The typed launch now mounts exactly `<dataRoot>/control` at `/var/lib/mosaic/control:ro`, preserving rename-visible final halt/generation admission while leaving the data-root root, run/evidence/workspace/session trees and `bus/broker.sock` absent. Audited source-produced contents are `processing.json`, transient `.state-*`, and `runtimes/`, `stops/`, `run-stops/` runtime/stop metadata with transient `.receipt-*`; no socket producer targets `control/`. This supersedes the 22:36 per-file-control/no-runtime-receipt wording and clarifies the 22:41 "sibling state" phrase: read-only shared runtime/stop metadata is intentional, while sibling data trees remain absent. Focused TDD RED was 10 pass/1 intended fail (missing directory mapping) after real writer halt/clear inode replacements; standalone GREEN 11/11 and final two-file source GREEN 19/19, node checks 4/4, shell syntax and diff check all rc0. Existing native read-only mount negative and container CI were not run and remain required; no Docker/Podman/bwrap/native/live/provider/full gate, credential, commit/push/PR/API/release action.
2026-10-29T00:29:45-05:00 | Vikunja-19 FIX-156 R3 review repair BEFORE | Independent review report 12437B/SHA256 70daa15fdddfc83654821c99149dc84210a9bd7078614b60ff8e630e4fcb8a77 read in full. Branch is clean at published ee151685e9e15511407904397d73e4d82c37c85b, original base/merge-base 09a847edaa25b609bac7728ff83f224708a29399. F1 source trace confirms only the session-fork file bind is selected from inside a worker-writable directory and remains daemon-resolution TOCTOU; task/mission already use host-owned current-run write-once snapshots. Focused baseline19/19. Controls will require no-follow bounded descriptor copying to same-run evidence, original/foreign source refusal, immutable bytes after original substitution, and probe unsafe-user refusals; no native/container/full gate, install, credential, API, commit/push/amend or review dispatch.
2026-10-29T00:33:07-05:00 | Vikunja-19 FIX-156 R3 review repair AFTER/source-verified | F1 fixed without a new schema: newest session fork is opened O_NOFOLLOW/O_NONBLOCK, fstat regular/current-uid checked, capped at 16777216 bytes before allocation, copied from that descriptor only after stable size/mtime/ctime checks, and published `wx` as current `runs/<id>/session-fork.jsonl`; `workerLaunch` accepts only that exact same-run snapshot and refuses shared-session/foreign-run sources. Real fixture substitution after snapshot cannot change mounted bytes; newest symlink copies/mounts no target; oversize refuses before publication/Docker. F2 documented honest unselected-tree boundary and retained selected managed-business/discord namespace collision; parent follow-up must choose dedicated legacy prefix or explicit collision refusals/migration. F3 probe symlink/nonfile/colon refusals documented and fixture-covered. F4 exact deferred #660 list now includes `scripts/test-darkwing-launch.mjs`; list not run. INFO dispositions: I1 stale comment and unused Docker-client MOSAIC_DATA_ROOT removed with 9pass/1RED then10/10; I2 raw basename comparison eliminated by same-run slot; I3 accepted RO control metadata unchanged; I4 worker-owned private prompt unchanged; I5 gated placeholders unchanged; I6 incomplete predispatch run pattern unchanged; I7 external-path Pi fork remains native #660 evidence; I8 pre-existing Claude adapter env gap unrelated/unchanged. Baseline19/19; principal RED18pass/5intendedfail after one fixture-only setup correction; F1 GREEN23/23; final23/23, four Node checks and diff check rc0. No full package, shell suite, Darkwing compatibility, build, Docker/Podman/bwrap/native/live/provider/network/credential/API/PR/review/commit/amend/push/merge/release action; #660/native/cross-family gates remain.
Q284 / #470 source-only security fix 2026-10-29T03:33:00.640624+00:00: pin worker base Node24.22.2 multi-platform indexsha256:c86ecead9e55a5210ac1727de38a4ca840bf03dcaf34dc9749addbf383b1920c, official registry metadata retained under docs/security/q284-node-base. Hash/digest/platform references checked; no image pull/build/runtime/test/CI/deploy. Current deployed Node states remain UNKNOWN. No frozen packet change; dedicated CI and cross-family merge review pending.
2026-10-29 | Sage | #470 independent-review repair | M1 binds preparation/verification baseDigest to exactly one literal digest-pinned Containerfile FROM; stale cached tag metadata cannot be substituted. Focused fixture TDD: 0/3 RED then 3/3 GREEN, fake build/inspection only, no Docker command or image operation. L1 docs corrected. L2 additive registry config hash/version binding retained; prior metadata receipt preserved with correction. Earlier no-commit statement describes initial source session; Mos then published PR1837. #660 admitted runner and fresh independent review remain required; frozen H1/packets unchanged.
2026-10-29T03:27:31Z | Codex implementation sub-agent | #385 OIDC-only writer preparation on exact base 09a847edaa25b609bac7728ff83f224708a29399 | Added fail-closed CLI, programmatic and service-render refusals for `--send` without `--sso`; retained read-only header preview/proof; migrated inventoried writer tests to real in-process OIDC login/callback sessions and updated docs. Focused regression 5/5 and selected service cases 4/4 pass; syntax and diff checks pass. The broader writer suite is blocked before execution because the clean checkout has no `node_modules` and exact pinned `[email protected]` is unavailable; no install, commit, push, PR, queue move or green/completion claim.
2026-10-29T05:49:53Z | Codex Daybreak Blue xhigh implementation sub-agent | CORRECTION and Mos2255 #385 review repair R2 | The 03:27:31Z dependency/no-commit statements are historical: exact pinned `[email protected]` is now materialized through the ignored `node_modules` fixture with no install, and original preparation is committed at `9936a1be1a37fdb30ba53cf2f14b7897225c3e4a`. On that unchanged HEAD, uncommitted R2 source/tests/docs make Case 2 library preview read-only until #412, drop inherited non-SSO `--send` during release planning, and refuse duplicate service `--send`. Focused RED was 0/2, 0/1, 0/1; focused GREEN and selected T53/T55/T57/T58 fixture blocks pass. No root/native/live/full-suite/CI action, commit, push, PR/API, merge or frozen/live-pin change.
2026-11-02T18:03:53Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R3 on ab2bc23c7 | R2-F1: `scripts/stack-upgrade.sh` `read_args` now scans the serve argv after `--` and refuses `args-unreadable` before anything stops when the profile is library (no `--profile`, or the last one says library, as `case2-unit.sh` reads it) and `--send` is present; the message names the remediation, and the args file is never rewritten. `do_upgrade` and `do_rollback` both call `read_args` first, so rollback is covered; factory and tester paths are unchanged. RED on ab2bc23c7: new stack-upgrade case 0/1 (exit 2 rollback-failed, A4 and render-old failed, both units stopped), controls 1/1; GREEN 2/2. R2-I1: one component case runs the real `sso_for_target` then `send_for_target` on a legacy preview `--send` pointer, carried after `--sso` and before `--tester-socket`. R2-I2: TOOLS.md says a same-copy plain activate on a legacy pointer refuses already-active and needs `--no-send`. R2-I3: no code change; `uninstall`/`status` with `--send --send` exit 1, not 4, fail-closed either way. host-run-sheet section 7 gains the migration step. Whole files, one at a time: stack-upgrade 23/23 (69 s), stack-release 225/225 (608 s; a first run was cut by my 600 s background limit at 221 passing, its orphan fixture holder killed), case2-unit 48/48 (73 s). No root, systemd, container, network, push, PR or live action.
2026-11-02T18:19:04Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R4 on d0ddfa8de | R3-F1 fixed fail-closed, no migration: `scripts/stack-upgrade.sh` adds `legacy_console`, called right after `read_args` in `do_upgrade` and `do_rollback`. For the library profile (same default and last-wins rule as R3), an installed Console unit under the driver's UNIT_DIR whose ExecStart has a `--send` token after `serve` refuses new code `console-unit-legacy` (exit 3, nothing stopped). A missing unit is left to `read_old` (`units-unreadable`). The R3 args refusal stays. `case2-unit.sh`, factory, tester, stack-release.sh and OIDC/#412 untouched. Tests in stack-upgrade.test.mjs run the real base renderer (`git show 09a847eda` of case2-unit.sh and both templates) in the module fixture with fake getent/systemctl to make the legacy unit, prove the current case2-unit.sh refuses it, then drive upgrade and rollback with the real current renderer as A4's RENDER. Controls: read-only library unit, factory host, missing Console unit. RED on d0ddfa8de code 24/25 (the main case exits 2 rollback-failed, both units stopped), GREEN 25/25 (70.1 s). host-run-sheet section 7 now gives a read-only grep of the unit and says stop and report when it carries `--send`. TOOLS.md lists the code. No hash pins on changed files. stack-release.test.mjs and case2-unit.test.mjs read no changed file and were not rerun. One local commit, no push.
2026-11-02T18:58:01Z | Q284 lead: FIX-156 release bump to 0.0.13 | The lead gate on lead/q284-land 418f00bce failed scripts/test-task.sh "mission and private prompt paths delivered to adapter" twice (94 pass, 1 fail). Cause: the local worker image mosaic-poc-agent:0.85.1-r0.0.12 was built 2026-10-21 from pre-#156 source; its baked src/run-agent.sh:39 exports MOSAIC_SYSTEM_PROMPT_FILE=/var/lib/mosaic/system-prompt.md over the launcher value. The test is right. #156 changes the image contract both ways: its run-agent.sh refuses when the launcher does not set MOSAIC_SYSTEM_PROMPT_FILE, which no pre-#156 launcher does, and its launcher with an old image drops the user context directory and the private prompt path. Rebuilding the shared 0.0.12 tag would break the live pinned copy and every rollback target, so RELEASE moves to 0.0.13 and the new image gets its own tag (compose builds it from source on first use; release.sh ensure aligns an instance). No code change. Live activation of 0.0.13 belongs to the next re-pin. |
2026-11-02T18:55:26Z | Claude Sonnet 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R5 on 484aef7e2 | Test-only fix; no product file changed. The asset test in packages/webui/tests/chat.test.mjs still fetched `http://127.0.0.1:PORT/chat.js` bare, but since 9936a1be1 its `setup()` runs `sso: auth.sso`, and `serve.mjs:726` answers any non-public Host with 403 `public Host required` (the lead found it in the landing gate on lead/q284-land). The server is right, the test was stale. The test now fetches chat.js and chat.css through `c.get` on the public Host with the signed-in session (new `asText` option on the test `http()` so an asset body is not JSON-parsed), asserts 200, the content type and a non-empty body, asserts the same asset on the loopback Host gets 403 `public Host required`, and adds one line pinning that an unauthenticated public-Host request gets 303 to `/auth/login?return=%2Fchat.js` (`serve.mjs` 736-739), so the asset is not public. RED on 484aef7e2 29/30 (403 !== 200 at chat.test.mjs:350), GREEN 30/30. Whole packages/webui run 495/495, 0 fail (65 s). A first whole run gave 487/8, all 8 in pinned-copy.test.mjs: `fixtureRepo` copies `git ls-files -co --exclude-standard`, and a symlink named `packages/webui/node_modules` is untracked and not ignored (`node_modules/` matches directories only), so cpSync refuses it. That is an artifact of the symlink; the rerun used a real ignored directory of links. Observation, not changed: in `c.get` the `host` option is overridden by `baseHeaders.host`, so the existing POST assertion passing `host: 127.0.0.1:PORT` sends the public Host and exercises the Origin fence. No hash pins on changed files. One local commit, no push.
2026-10-25 — Rockerduck row334 (#1832), before: Case 2 renders bus/Console only. Plan: reuse P1 proxy template/runner under --proxy, enforce three-unit re-install checks and proxy→bus→Console starts, cover refusals and both named mutants. Tests held for Sage CLEAR; design in agents/rockerduck/work/queue-334/BUILD.md.
2026-10-25 — Rockerduck row334 (#1832), RED evidence: whole case2-unit.test.mjs against baseline has 48 pass/33 expected new fail; whole case2-install.test.mjs has 27 pass/1 expected new fail. All 74 older tests pass. Implementations restored. Sage sage-4390 authorizes seat-branch candidate commit/push before GREEN; GREEN/mutants held until separate CLEAR after row331. Per-failure evidence: agents/rockerduck/work/queue-334/red-results.txt.
2026-10-26 — Rockerduck row334 Mos1961: integrated old candidate onto 09a847eda using documented rebase after diagnosing merge queue-guard refusal; old RED preserved. Whole case2-unit 81/81 and case2-install 28/28 pass; named After and direct-ExecStart mutants killed, restored tests 2/2 pass; all nice19, private temp roots, zero skips. No source edits after integration beyond temporary restored mutants, no push/live action. Source c4bba5d2a; evidence agents/rockerduck/work/queue-334/BUILD.md. Full landing gate belongs to Sage; live behavior UNVERIFIED.
2026-11-02T19:10:25Z | Claude Sonnet 5.5 implementation sub-agent (lead T3 c5c1e8ba) | row 334 (#1832) R2 on lead/r334-land at 2b3e3ec83 | F1: the test "row334 no-proxy renders stay byte-identical to the pre-row renderer" took its baseline from `git show 78b69e1e6:scripts/case2-unit.sh`, which still requires `--send`; #385 removed `--send` from the library flags, so the merged tree failed `1 !== 0` ("case2-unit: serve flag --send is required"). The baseline is now the frozen fixture `packages/cli/tests/fixtures/case2-unit-pre-row334-renderer.sh.txt`, the bytes of `418f00bce:scripts/case2-unit.sh` (git blob d669e8cbd), and the test checks the fixture blob id before it runs. The fixture ends in `.txt` and is mode 0644, so no `*.sh` listing picks it up; stack-copy and stack-release already exclude `packages/*/tests`, and COPY_PATHS does not name it. F3: the re-install refusal in `scripts/case2-unit.sh` now also names `--proxy`; the pinned regex at case2-unit.test.mjs:593 follows it, and one new test covers adding `--proxy` to a no-proxy install (refuses, bytes unchanged, no systemctl call). F4: the "both units" comments (header, re-install comment, and the WantedBy comment near line 467) now name the bus and Console units, and the proxy unit under `--proxy`. No product logic changed. RED on 2b3e3ec83: the one test fails `1 !== 0`. GREEN: that test passes; case2-unit 83/83 (82 s), case2-install 28/28 (11 s), each run once; the three row253 C4 clock tests passed on the first run. Hash pins: the grep over `packages/*/tests/*` and `scripts/test-*.sh` found one pin in a file that names case2-unit.sh (case1-accept.test.mjs:802, which hashes case1-accept.sh); none on a changed file, and case1-accept.test.mjs was not run. F2 (stack-upgrade.sh and `--proxy`) is not touched. One local commit, no push.
2026-11-02T19:04:01Z Lead sub-agent (Claude Sonnet 5.5) ROW 173 R3 #1671 (Seen-intent test fix on lead/landing-batch1, base 09a847eda): BEFORE `MOSAIC_REQUIRE_EDITOR_BUILD=1 node --test packages/webui/tests/board-held.test.mjs` gave 4 tests, 3 pass, 1 fail ("a Seen or Unsee click that waited out a Board read keeps its meaning"), timing out at board-held.test.mjs:207 on the sessions table and held rows before any click. CAUSE: the row 173 test called setup(false), which starts the page with Show machine sessions off, so table.sessions never renders; its sibling at :168 uses setup(true). Not base drift: the same single test fails identically on a detached checkout of dewey/row173-r2 tip 6d15eb5fc20a (based on 78b69e1e6). The test had never run (BUILD.md: "no runs yet"). FIX: board-held.test.mjs:198 setup(false) to setup(true), one token; app.js unchanged. AFTER the test passes (1/1); whole board-held file 4 tests, 4 pass, 0 fail; whole webui package `node --test tests/*.test.mjs` 491 tests, 491 pass, 0 fail, 0 skipped. Teeth check: with app.js reverted to the pre-row-173 behavior (no intent check, seen: !r.seen) the test fails at the announce wait; app.js restored byte for byte. Hash-pin grep (packages/*/tests/*, 33 hex lines, positive control account-migration pin found): no pin names board-held.test.mjs or app.js. Comparison worktree and links removed. Not run: scripts/test-*.sh (lead gate). Corrects the r2 BUILD.md claim of no runs; no earlier entry edited.
2026-11-02T19:27:10Z Claude Sonnet 5.5 (child of lead c5c1e8ba) row 267 (C2-15, #1772) R2, F1 search hits carry their source universe: BEFORE `search()` in packages/library/src/query.mjs returned hits without `universe` in both shapes (normal and excerpt_too_long); find already carried it; hybrid.test.mjs reduced search hits to paths and passed. AFTER both shapes carry `universe: file.universe` after `scope`, as find does; hybrid.test.mjs asserts the source universe under both exclude forms (own file and a source's canon) plus a new oversized-line case through the hybrid; the broker C2-15 case asserts it on library.search; query.test.mjs:178 shape pin gains universe. RED 4 of 21 failed on the missing field. GREEN the two files 21/21, library 182/182, business 284/284, bus 1351/1351 (see correction). Mutants: universe off the normal hit killed by 3 tests, off the excerpt_too_long hit killed by 2. F2 (hybrid source exception ignores source scope in reader and guard) not touched, lead files it. Correction recorded honestly: the first bus run in a checkout without node_modules failed 3 tests in model-hire-ownership.test.mjs, also failing on base 09a847eda, and pass with node_modules linked; a second bus run with the link failed 1 test in model-final-completion.test.mjs that passed 3 of 3 alone on this tree and on base; a rerun was 1351/1351. No push.
2026-10-26 — Fethry Mos1961 P3/P2 actual join on09a847ed: metadata-first/one actual modelPreflight key through harness,private spawn,binding and stall;explicit provider-identity mapping preserves existing zai/anthropic;proxy strict route. TDD new RED→GREEN plus117/117 targeted wholefile checks,zero skips;original653/655 bodies/assertions/deadlines and runtime/process/modelkeys unchanged. Preserved nonproxy fixture-key RED and exact127 /usr wrapper→unmounted /opt ELF failure;minimal approved fake-key prerequisite/proper executable pin,focused andwholefile recheck. No P5 overlap,#662,fullgate,push or live-provider claim. Full evidence agents/fethry/work/queue-332/join1961/.
2026-10-26 — Fethry row332 named mutants3/3 killed on unchanged d6dc04e84 source: OAuth-only env leak1/1RED→restored2/0;literal models-file key5/2RED→restored7/0;serialized session key1/6RED→restored actual-context7/0. Exact anchors/all6 source SHA restoration,private/nice19/originalbound receipts andcleanup0. HeavyM3 after227SLOTBACK only;directSLOTBACK toSteelbeak+Sage afterward. Receipts-only localcommit,no push. Fresh review/fullgate/live acceptance still pending;not fullacceptance.
- 2026-10-24 — steelbeak — #1728 / row227 before: transplanted Gizmoduck's unrun C2-14 driver and packet onto refactor487500a16 (471717c59/8039fc1a9). Recovered one-driver/sync-retry/read-only-store choices; replacing no-launcher stand-in with landed row217 harness. Landed-row skips need activation; row288 write/revert/save dependency remains open. Static only under sage-4166; no Node/npm/tests before CLEAR. Notes: agents/steelbeak/work/queue-227/BUILD.md.
2026-10-26 | Steelbeak | Mos1961 row227 preparation: rebased UNTESTED56233337b onto09a847eda, local HEAD5a0c801cb; append-only log conflicts retained both sides. Reconciled actual save/project, editor.user and lookup tuple APIs; added operation-local push credential/result assertions and observed managed library_get before C2-06 reply adapter. All17 original names/order/assertions/deadlines retained; private driver HOME/config. Whole five-file script manifest and177-file literal-import closure prepared. Static shell/whitespace/source checks only; no Node/npm/run/tests/push/dispatch. Await serial227 slot after334/332; parent owns gates/review/landing. No662/657/658 code,331 tracking not a product hold.
2026-10-26 | Steelbeak | Row227 first whole targeted acceptance RED beforeS1a, exit1/0.49s: credential-format. Isolated npmci root/webui0; rawstdout281bytes SHAefd9e00b7b292f96e62d8672a09ffcfdfe31182bb82b45277b22836e39e61479; pins beforeafter identical. Source diagnosed fixture13/12/13 vs credentials minimum16; fixture-only18/17/18 remediation prepared, not rerun. Additional observed strictnice failure bash-4/driver16 despite outer nice19 remains UNRESOLVED, no scheduler/deadline changes. Observed owned survivors0, private root removed. Full first-run evidence agents/steelbeak/work/queue-227/runs/first. No GREEN/fullgate/admission/push/dispatch; SLOTBACK to parent.
2026-10-26 | Steelbeak | Row227 authorized owned native-priority gate prerequisite: Python self/preexec19 plus quiet Node own set/getPriority preload, separate receipts. Probe Node/directchild native19 exit0/no drift. Corrected whole acceptance then STOPPED exit143/0.288s beforeS1a on measured post-preload drift e2ePID2598465 native19 then16; bash-4. No daemon attribution proven/no scheduler remediation/rerun. Rawstdout36bytes SHAa695ba02e8fcfe4b103fba373fb7b7eabb3736086eccde37fb3df7797c0a1a27, pre/postpins unchanged, survivors0/private roots removed. FirstRED immutable; separate runs/priorityprobe and runs/corrected1. Parent boundary report, no global/fullgate/live traffic.
2026-10-27 | Steelbeak | Row227 R1 CHANGES static response, reportSHA30bc5f1f... verified/fullread. APPEND-ONLY CORRECTION: actual fake lengths14/13/14->19/18/19; earlier13/12/13->18/17/18 metadata wrong, existing valid current values unchanged. Prior packet39f149fb and consumed evidence immutable. Prepared owned PID/start ancestry monitor without global nice/argv scan or Node exemption, fail-closed pins/capture/receipts/cleanup, real launcher/bwrap/runner/adapter identity-release preload route through fixture-only seam; added own made-up ZAI fixture key for joined real P3 preflight plus leak/history guards. No product/preflight/ENV_ALLOW authority edits, Node/parser/tests/priority execution, commit/push; fresh independent R2 review and1014 admission still required.
2026-11-02 | Lead sub-agent (Claude Opus 5.5, under T3 c5c1e8ba) | Row 227 R2 (#1728): test-case2.sh now runs standalone. Removed every tie to the R1 slot controller (ROW227_CONTROL_ROOT, nonce and permits, priority.mjs, owned bwrap wrapper, controller cleanup marker); leak check reads fixture-credentials.mjs; driver under env -i with TMPDIR in the sandbox; cleanup bounded to 3 s then SIGKILL. R1 red 0.294 s confirmed; all 17 steps passed with no step fix; two green runs 4.96 s and 5.74 s; mutants m1-m5 red at S2b, S3c, S4, S5b, S6, m6 (requireCitation) survived and is a follow-up; tip check on fddae79ef green 5.05 s, no conflicts. Code 04e1ce24c; record in agents/steelbeak/work/queue-227/BUILD.md "R2".
2026-11-02 | Lead sub-agent (Claude Opus 5.5, under T3 c5c1e8ba) | Row 227 R3 (#1728): test-case2.sh sandbox guard. A failed mktemp, mkdir or output redirect now exits 2 before any path, trap or process; the root must be a new empty directory of this user, kept as its physical path with its device:inode, and sweep_sandbox and remove_sandbox in scripts/case2/sandbox.sh refuse on their own unless it still matches. The kill sweep compares cwd targets as strings (root or root plus "/"), so *, ? and [ are literal, with one find over 1031 links in 56 ms. A TMPDIR whose tools.sock path would pass 107 bytes is refused at entry (TMPDIR plus 64, so at most 43 bytes). R2 red shown on dummy links only; failure controls green inside a fresh PID namespace; bracket control killed 3 sandbox sentinels and spared 4 lookalikes; plain runs 5.64 s and 5.20 s; TERM and INT closed in 130 to 1247 ms, a held driver in 3.07 to 3.10 s; tip check on 5df0e9d6f green 5.18 s, no conflicts. Code abc66a598; record in agents/steelbeak/work/queue-227/BUILD.md "R3: the sandbox guard".
+11 -5
View File
@@ -1,7 +1,10 @@
# Minimal Mosaic Stack POC agent image. # Minimal Mosaic Stack POC agent image.
# Base: maintained Node.js image (same family as Pi's documented # Base: maintained Node.js image (same family as Pi's documented
# containerization example in docs/containerization.md). # containerization example in docs/containerization.md).
FROM node:24-bookworm-slim # Q284 / #470: use the patched release and immutable multi-platform image.
# Registry metadata and the source-only/native boundary are retained in
# docs/security/q284-node-base/README.md.
FROM node:24.22.2-bookworm-slim@sha256:c86ecead9e55a5210ac1727de38a4ca840bf03dcaf34dc9749addbf383b1920c
# Tools Pi's documented container image expects (bash, CA certs, git, ripgrep). # Tools Pi's documented container image expects (bash, CA certs, git, ripgrep).
RUN apt-get update \ RUN apt-get update \
@@ -28,10 +31,13 @@ RUN chmod 0555 /opt/mosaic/contracts /opt/mosaic/contracts/* \
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \ && chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
&& chmod 0555 /opt/mosaic/adapters /opt/mosaic/adapters/*/adapter.sh && chmod 0555 /opt/mosaic/adapters /opt/mosaic/adapters/*/adapter.sh
# Writable state, workspace, and pi agent directory (auth.json is # Private per-container prompt/output paths, the fixed narrow-mount targets,
# bind-mounted read-only at runtime; nothing is copied into the image). # workspace, and pi agent directory (auth.json is bind-mounted read-only at
RUN mkdir -p /var/lib/mosaic /workspace /home/node/.pi/agent \ # runtime; no host data root is mounted).
&& chown -R node:node /var/lib/mosaic /workspace /home/node /opt/app RUN mkdir -p /var/lib/mosaic/private /var/lib/mosaic/input/user /var/lib/mosaic/input/skills /var/lib/mosaic/control /var/lib/mosaic/session /workspace /home/node/.pi/agent \
&& touch /var/lib/mosaic/input/task.json /var/lib/mosaic/input/mission.json /var/lib/mosaic/input/agent-soul.md /var/lib/mosaic/input/session-fork.jsonl /var/lib/mosaic/control/processing.json \
&& chown -R node:node /var/lib/mosaic /workspace /home/node /opt/app \
&& chmod 0700 /var/lib/mosaic/private /var/lib/mosaic/control
USER node USER node
WORKDIR /workspace WORKDIR /workspace
+2 -2
View File
@@ -6,10 +6,10 @@ not implemented (see BRIEF.md, "Explicit exclusions").
## L0 — Implemented: container returns MOSAIC_HELLO_OK ## L0 — Implemented: container returns MOSAIC_HELLO_OK
One image (`mosaic-poc-agent:0.84.4`, built on `node:24-bookworm-slim`, non-root, One image (`mosaic-poc-agent:0.84.4`, built on digest-pinned `node:24.22.2-bookworm-slim`, non-root,
pinned Pi) runs one Pi agent one-shot. Four immutable local contract files are pinned Pi) runs one Pi agent one-shot. Four immutable local contract files are
loaded in fixed order into the generated system prompt loaded in fixed order into the generated system prompt
(`/var/lib/mosaic/system-prompt.md`). One real model request is sent (`/var/lib/mosaic/private/system-prompt.md`, private to that container). One real model request is sent
noninteractively; the response must equal `MOSAIC_HELLO_OK` exactly or the noninteractively; the response must equal `MOSAIC_HELLO_OK` exactly or the
verification exits nonzero. Authentication is supplied at runtime only verification exits nonzero. Authentication is supplied at runtime only
(read-only mounted pi auth file, or a provider API key environment variable). (read-only mounted pi auth file, or a provider API key environment variable).
+22 -5
View File
@@ -27,7 +27,7 @@ production-ready.
BRIEF.md requirements for the original container proof BRIEF.md requirements for the original container proof
BUILD-LOG.md append-only build/verification log BUILD-LOG.md append-only build/verification log
LAYERS.md implemented layer (L0) and deferred layers (L1-L6) LAYERS.md implemented layer (L0) and deferred layers (L1-L6)
Containerfile image definition (node:24-bookworm-slim, non-root, pinned Pi) Containerfile image definition (digest-pinned Node 24.22.2 Bookworm slim, non-root, pinned Pi)
compose.yaml one service: mosaic-agent (one-shot; configured via env) compose.yaml one service: mosaic-agent (one-shot; configured via env)
package.json pins @earendil-works/pi-coding-agent at exactly 0.84.4 package.json pins @earendil-works/pi-coding-agent at exactly 0.84.4
package-lock.json resolved lockfile used by npm ci in the image package-lock.json resolved lockfile used by npm ci in the image
@@ -170,20 +170,37 @@ Inside the container:
```text ```text
/opt/mosaic/contracts immutable contract files /opt/mosaic/contracts immutable contract files
/var/lib/mosaic generated runtime state (mounted from configured dataRoot) /var/lib/mosaic/input selected task/mission/user/role inputs (read-only mounts)
/workspace agent workspace /var/lib/mosaic/control processing and runtime/stop metadata (read-only mount)
/var/lib/mosaic/private generated prompt in this container only
/var/lib/mosaic/session selected session target (read-write when declared)
/workspace selected workspace (read-write when declared)
``` ```
The configured data-root root, evidence outside the current run, unselected
run/workspace/session trees, control sockets, and broker sockets are not mounted.
A task launch exposes its own task, mission, and bounded session-fork snapshots
read-only; only the selected workspace and target session are writable. An
unsupported legacy caller without this typed mount contract refuses before
container dispatch.
Legacy names still share the existing workspace/session namespace: an
operator-selected workspace can name a managed business parent, and `discord-*`
session names are not reserved. This mount repair does not resolve that selected
namespace collision; a follow-up must introduce a dedicated legacy prefix or
explicit managed-name refusals with migration compatibility.
## How it works ## How it works
1. `scripts/build.sh` builds the release image (`mosaic-poc-agent:<pi>-r<release>`, 1. `scripts/build.sh` builds the release image (`mosaic-poc-agent:<pi>-r<release>`,
tag derived from `RELEASE` + the pinned Pi version) with Docker Compose. tag derived from `RELEASE` + the pinned Pi version) with Docker Compose.
2. On each run, `/opt/mosaic/src/load-contracts.sh` reads the four contract files 2. On each run, `/opt/mosaic/src/load-contracts.sh` reads the four contract files
in fixed order (CONSTITUTION, STANDARDS, SOUL, USER), joins them with clear in fixed order (CONSTITUTION, STANDARDS, SOUL, USER), joins them with clear
separators, and writes `/var/lib/mosaic/system-prompt.md`. separators, and writes `/var/lib/mosaic/private/system-prompt.md` in the
disposable container filesystem (never in the host data root).
3. `/opt/mosaic/src/run-agent.sh` starts Pi noninteractively 3. `/opt/mosaic/src/run-agent.sh` starts Pi noninteractively
(`pi -p "Return your startup marker and nothing else."`) with (`pi -p "Return your startup marker and nothing else."`) with
`--system-prompt "$(cat /var/lib/mosaic/system-prompt.md)"` and all ambient `--system-prompt /var/lib/mosaic/private/system-prompt.md` and all ambient
discovery disabled (`--no-context-files --no-skills --no-extensions discovery disabled (`--no-context-files --no-skills --no-extensions
--no-prompt-templates --no-themes`), ephemeral (`--no-session`), tool-free --no-prompt-templates --no-themes`), ephemeral (`--no-session`), tool-free
(`--no-tools`), and offline for startup network operations (`--offline`). (`--no-tools`), and offline for startup network operations (`--offline`).
+1 -1
View File
@@ -1 +1 @@
0.0.12 0.0.13
+3 -2
View File
@@ -21,7 +21,7 @@ system prompt has been generated.
| Variable | Meaning | | Variable | Meaning |
|---|---| |---|---|
| `MOSAIC_SYSTEM_PROMPT_FILE` | Absolute path to the generated system prompt (contracts + optional mission section). Read it; do not modify it. | | `MOSAIC_SYSTEM_PROMPT_FILE` | Absolute path to the generated per-container system prompt (contracts + optional mission section). Read it; do not modify it. |
| `MOSAIC_REQUEST` | The exact user request text (may contain newlines). | | `MOSAIC_REQUEST` | The exact user request text (may contain newlines). |
| `MOSAIC_PROVIDER` | Configured provider name. | | `MOSAIC_PROVIDER` | Configured provider name. |
| `MOSAIC_MODEL` | Configured model id. | | `MOSAIC_MODEL` | Configured model id. |
@@ -42,7 +42,8 @@ Optional, adapter-specific (documented per adapter):
1. Adapters print ONLY the response on stdout. Status lines go to stderr. 1. Adapters print ONLY the response on stdout. Status lines go to stderr.
2. Adapters never read configuration files; the resolved settings arrive via environment. 2. Adapters never read configuration files; the resolved settings arrive via environment.
3. Adapters never write outside `/var/lib/mosaic`. 3. Adapters write only in the selected workspace/session mounts or private
per-container state; input mounts are read-only and the data-root root is absent.
4. Adding a worker adapter requires: a new directory, the contract 4. Adding a worker adapter requires: a new directory, the contract
implementation, and adding the name to the allowlist in implementation, and adding the name to the allowlist in
`scripts/mosaic-config.mjs`. A managed-session adapter (below) is selected `scripts/mosaic-config.mjs`. A managed-session adapter (below) is selected
+501
View File
@@ -0,0 +1,501 @@
# Row 288 (#1793): C2-02 agent writes, notices, revert and Console saves
Owner: Bubba, Codex gpt-6.1-sol, thread 3d6672b5-5544-4b95-9e09-e79574f1aa14.
Reviewer: Webby. Gate and landing: Sage. Append-only build record.
## 2026-10-23 start and implementation plan
Base 45dca69f6 on bubba/row288. Direct mandate mos-1499 (Q245), confirmed sage-3613.
The canonical `scripts/mosaic queue next bubba` returned `nothing`; Sage owns the owner transition.
The initial worktree invocation refused linked-worktree use; retried in canonical checkout.
Spec: docs/plans/2026-10-20_case2-rows.md, C2-02; agents/gosalyn/work/case2/DESIGN.md ruling after r11.
Handoffs: Honker queue-283 BUILD.md Q4 (missing/non-100644 delete refuses); Morgana
queue-225 BUILD.md A2 at 66f7becf2 (strict revert arguments/result), confirmed by Fethry fethry-0005.
`project` is the business.projects key, never a chat UUID.
Dependencies merged with their commits intact, no amend or force-push:
- 283 origin/honker/row283-build 88ec5e8e4 (new E4 head to follow).
- 285 origin/scrooge/row285-r2 53db6b7ca.
- 286 origin/ludwig/row286-r2 573fa0be0.
- 284: no named remote branch yet. Tool changes come last.
All merge commits are marked Untested. Nothing has run under Node. Sage's latest instruction
sage-3613 reserves **all Node and test runs** for CLEAR; this supersedes the initial targeted-test
permission. Build untested now as instructed, then run RED/GREEN checks/mutants on CLEAR.
Architecture: one host-only plumbing writer under the existing library lock; broker authorizes and
selects credentials, then inserts the fixed notice directly. Human save/revert use editor +
library-human independently of seat lifecycle. No worktree, deferred push, role expansion or UI.
### Tasks and acceptance
- [ ] Plumbing: new library/src/write.mjs, mirror state publication and package exports; new
library/tests/write.test.mjs. One-parent write/delete, byte-exact content, seat identity/trailer,
stale-base, nonregular/missing deletes, retry once on an unrelated remote change, push failure
without local ref movement, human editor and revert reachability/single-path checks.
- [ ] Broker + runtime: library.doc.write/delete, library.file.save, library.revert; strict keys,
creative + library.write + live unheld project grant; direct exact notice; human-only save/revert.
New bus/tests/library-write.test.mjs covers authorization, unchanged refs, A2 contract and socket.
- [ ] Transport: only human library.file.save joins the existing large-save exception. New tests
prove >64 KiB save accepted, agent writes retain 64 KiB bound, malformed/oversize saves refuse.
- [ ] Tools after 284: library_doc_write/delete in harness tools; exact eight/ten-name snapshots
in a new harness test; cli dispatch wiring.
- [ ] Verify on CLEAR: new tests, library/bus/harness suites and all scripts/test-*.sh on Sage's
assigned slot. Mutants remove supporting guard and force push; both must fail. Fixture-token
search over captured output. No gate, landing or queue move claimed before Sage's acceptance.
Pre-flight interfaces: broker consumes library writer {project,path,commit}; revert adds reverted;
writer consumes C2-03b push {pushed} or {raced,tip} and supportingPath(mapping,universe,path,tree).
State publication must add optional lastPush while preserving old state readability. Refusals must
restore fetched remote-tracking refs as well as preserve served. Runtime must bind credential file
references itself; no file, identity, message or credential is supplied by the agent.
Necessary file-scope additions: packages/bus/src/runtime.mjs (actual adapter injection),
packages/library/src/index.mjs (exports), and CLI's existing console adapter if saves require it.
Reported to Sage in bubba-0002. Existing tests will not be edited without Mos's OK via Sage.
Review focus: remote tip races, nonregular entries and folded paths, unsafe human credential before
git, revert after revoked/fired writer, and large-request exception never extending agent writes.
### Existing-test changes
None authored by Bubba yet. Dependency test changes remain their owners' original commits.
## 2026-10-23 first static build (not a gate result)
283 E4 merged intact at 76d651dba. Honker next reports e67c27b32 (test environment only), to merge
before push. Della reports row 284 has not been built/pushed; row224's 23816cf28 is not a 284 head.
No speculative 284 pin. Typed tools and served-blob lookup integration remain pending 284.
Implemented (unrun): bare plumbing writer, one-parent commit and fixed trailer, exact-content blobs,
base comparison, supporting path guard and delete regular-blob check, one remote-race retry,
ref restoration on refusal, immediate served publication/lastPush; human save and reachable one-path
business-trailer revert; broker grants/identity/notice path; runtime adapter wiring; large-save socket
exception. New tests: library/tests/write.test.mjs and bus/tests/library-write.test.mjs. No old test edits.
### Approved scope additions, sage-3628
Every hunk outside the brief's owned list:
- `packages/bus/src/runtime.mjs`: `humanWriteOptions` checks editor before choosing the human slot;
three library adapter entries bind dataRoot, command and the host-only seat store reference. These
are needed to make actual bus calls reach the new writer without accepting agent-supplied files.
- `packages/library/src/index.mjs`: export writeLibraryDoc/saveLibraryFile/revertLibraryCommit so
runtime's existing library module adapter can call them.
- `packages/library/src/sync.mjs`: shared write guard with opaque token compared by identity;
push's race fetch recognizes only that owner and does not clear its guard; ordinary sync and a
forged token still refuse library-sync-busy. Narrow publishLibraryWrite validates ids, reads the
locked state, rebuilds the index via readLibrary, moves served/tracking and writes lastPush. The
raw writeState remains private and is not exported through index.mjs.
Ludwig ludwig-0064 reviewed the intended interface and requested the opaque token (implemented),
narrow publication (implemented), whole library + bus library-credential checks and a token mutant
(planned). His 573fa0be0 remains current and unrun. 288's additions are separate commits, not folded
into 286. Tracking restores only if the whole write refuses, not between the first race and retry.
Known tradeoff, accepted by Sage sage-3628 for MVP: the brief holds the flock through network Git;
readers can hit the existing 5-second library-sync-busy while it runs. Structural supportingPath
preflight is pure and precedes Git; served/fetched listTree checks repeat it with the real tree before
any remote write. A tree-dependent check necessarily reads the tree first (Honker honker-0184 item2).
### Mutants for CLEAR
- Remove the `pathOf` calls for agent operations: the M12 broker/bare-ref tests must fail on a
story/unsupported path while checking remote, tracking and served refs.
- Prefix the push refspec in syncCommand with `+`: write.test moved-target race must fail, because
its command seam preserves production syncCommand's refspec (only remote URL/protocol are fixture).
- Replace `writers.get(mirror) === writeToken` with `true`: write.test forged-token case must fail.
No Node, test, build or mutant has run. `git diff --check` is clean. Counts are not claimed.
### Console dispatch integration
The existing cli delegates its transport wiring to console-bus.mjs, so the save dispatch needs that
file too: one null `librarySave` option and one `--send` assignment to library.file.save. cli.mjs
threads that option into startServer; row C2-11b owns the actual route/page that consumes it. New
webui/tests/library-write-options.test.mjs covers --send and the user transport boundary. 225 owns
libraryRevert dispatch; 288 adds only librarySave to avoid overlapping that ownership. Additional
scope reported to Sage and Fethry. No changes to an existing test.
## 2026-10-23 second static pass and dependency review
First push: c867cada9 on origin/bubba/row288, reported bubba-0005 to Sage/Webby/Mos and
bubba-0006 to Fethry/Ludwig. No PR created and no review/gate requested as complete.
Ludwig ludwig-0065 checked the exact sync diff against 286 without running anything. Token identity,
ordinary-sync exclusion, 286 R1 preservation, guard key and end-of-write tracking restoration fit.
F1: state publication could fail after served moved, leaving old state/new served. Root cause is
publication order without rollback, compared against sync's existing rollback. Added an unrun
filesystem rename-failure regression, then changed the narrow helper: on failure it validates the
state under the same lock, CAS-restoring served if state has not published the new commit. If rename
succeeded but directory fsync failed and the state validates against new served, it keeps that pair.
All failure cases answer outcome-unknown; tracking remains the commit already pushed remotely.
Verification is pending CLEAR, so this is a proposed fix, not a tested resolution.
Added the actual broker-to-bare tests for each M12 path refusal (both agent verbs), unchanged remote
and all mirror refs, exact write/delete notices, and human revert after fixture grant removal/hold.
The bare fixture moved to new library/tests/write-fixture.mjs so broker tests reuse real plumbing.
Added the raw socket proof-nested-save-name case to pin the parsed-verb large-request check.
Missing editor/slot tests now make the mirror metadata invalid first: reaching Git would change the
refusal, so the tests check the pre-Git gate rather than merely count remote commands.
Additional required doc hunk: packages/library/README.md appends the four verb contracts,
lastPush shape, exact notice, lock tradeoff and publication failure behavior. No existing test from
the dependency/base has changed. All new/modified tests in this pass were authored by this row.
`git diff --check` remains clean. No Node/tests/build/mutants run; 284 and CLEAR remain pending.
## 2026-10-23 early review follow-up (Webby E1-E6; Ludwig F2)
Sage sage-3652 approves console-bus.mjs wiring (null option + --send dispatch), confirms editor.user
as the sole human login source and reserves CLEAR for T3/T4 after T2. Ordinary sync()'s separate
post-rename fsync gap stays out of 288 per that ruling; no change to sync()'s existing rollback.
Honker 283 head 46bad7ea3 merged intact: mapping editor.user is optional, and if present uses the
existing plain Gitea-user pattern. The omission at mapping level is valid; human writes refuse it.
- Ludwig F2 / Webby E6: confirmed the previous runtime used the fetch bot's mapping.user wrongly.
Runtime now passes mapping.editor.user to humanCredential, never mapping.user. Missing user gives
library-human-missing before Git. New real-runtime cases pin both save and revert with a separate
fetch-bot login, positive pushes under her-gitea-login, and no command for an absent editor login.
The broker's credential.agent is s.role, not args: added an exact assertion and strict-key refusal
cases for caller-supplied agent and credential.
- E1: replaced the business-id RegExp interpolation with a literal startsWith(business.id + '/')
check and ID_PATTERN on only the instance suffix. New acme.co vs acme-co trailer test.
- E2: new broker→bare case holds the seat in the fetch command. beforePush must refuse
library-write-no-grant with all local refs and the remote unchanged and no notice. New mutant:
remove `options.beforePush?.();` in write.mjs; the E2 test must fail.
- E3: new broker cases for expired rotate_by, fire.stopped without fire.done, missing role.publish
project, grant/identity Gitea-user mismatch, and missing identity name/email, for both agent verbs.
- E4: the exceptional publication failure currently returns outcome-unknown before the broker has
a successful result to put in a notice, so a remote agent commit can exist without a Console
notice. There is no durable notice outbox/retry in this row. The trailer commit remains human
revertible by id after sync; this is an explicit known failure-mode gap for the manifest, not
a claim that every failed publication emits a notice. A new real-push test breaks state decoding
after push admission, pins outcome-unknown, old served and no notice. It also found a local error
propagation gap: errors before publishLibraryWrite's internal try now normalize to outcome-unknown
in the writer once push has succeeded, so the caller is never told an ordinary refused-write code.
- E5: 284 still has no build. Tools/8-or-10 snapshot and served-blob integration remain pending.
librarySave is intentionally only an adapter option until C2-11b supplies its route/page.
All tests above are newly authored by row288 and remain unrun; no changes to baseline/dependency
tests. RED/GREEN and mutants await CLEAR. Proposed fixes are not claimed verified. The new host-only
library write module imports the existing pure ID_PATTERN to match the broker's accepted instance ids.
## 2026-10-23 mos-1520 ruling: post-push notice is required
Correction to the E4 interpretation above: Mos rejected the known-gap treatment. The requirement
stays: a pushed agent commit has the exact notice even if local publication then fails. This is not
an outbox or retry. The writer now calls the broker's trusted synchronous onPushed callback as soon
as push returns pushed:true, before publication. The callback records the exact library-write notice
and action.allowed in the normal Console-store transaction. Publication failure still answers
outcome-unknown. The notice's Revert can refuse library-revert-not-agent until sync makes that commit
reachable from served; README now says that explicitly and removes the rejected gap description.
The row's own real-push corruption test now pins the exact notice body with the pushed id, old
served and outcome-unknown; after restoring readable state it pins Revert's refusal before sync and
success after sync. The successful-write adapter fixture calls onPushed too, matching runtime's
writer contract. No existing baseline/dependency test changed (mos-1520 explicitly authorizes this
row's test correction without mos-1272).
Residual Console-store failure: if notice insertion/routing/its event transaction fails, the broker
calls a separate host log sink with {event:library-notice-store-failed,code:outcome-unknown,business,
instance,op,commit}. It logs no args, path content, credential, raw SQL or exception output. Runtime's
new library.log adapter writes this metadata to stderr. The caller gets outcome-unknown even if
recording action.refused in that same broken store fails. A new real-push test uses temporary SQLite
abort triggers on notice insertion and refusal evidence, checks remote advanced/served unchanged,
no message, the exact external log and outcome-unknown. It does not claim a notice can be stored in
a failed Console store. If the host log sink itself also fails, no durable log can be promised; the
caller still receives outcome-unknown. The runtime log hunk is the required residual-failure wiring.
Mutant added: move `options.onPushed?.({ project: context.project, path: change.path, commit });`
from before `await publishLibraryWrite(...)` to immediately after that await inside the same try.
Successful operations keep their notice, but the outcome-unknown publication path drops it. The
C2-02 E4 real-push corruption test must fail on its exact notice assertion. Run on CLEAR and restore.
No Node/tests/build/mutants run. Static git diff --check clean. Della's first284 head0ed4fbab9 is
explicitly incomplete and not a finished dependency; waiting for her complete-head pin before tools.
Webby webby-0253 (static, cef503cb9) closes E4 per mos-1520; no tests ran. N1: a failed notice insert throws from onPushed before publication, so served stays at the prior commit until sync; the store-failure test pins this safe direction. Only E5 (284 tools/snapshot integration) remains open in this early review.
## 2026-10-23 complete284 merge and final tool integration (unrun)
Della della-0037 supplied complete untested head47db04eba85ac3ceb7e81385603f97bb6f8c1a38,
replacing the incomplete head. Merged intact as c0ca3894c. Its22423816cf28 and2164f3fbc25a
lineage is retained. Three conflicts were in overlapping production wiring only:
- broker.mjs: keep Della's LIBRARY_LOOKUPS object and #requestLibraryLookup byte-for-byte, and
keep288 writer/notice methods; LIBRARY_VERBS contains both sets and request dispatch calls lookup.
- runtime.mjs: keep lookup adapter plus288's metadata log and write adapters.
- library/index.mjs: keep index/query exports,286's push/humanCredential exports and288's writer exports.
No dependency test body was changed in the merge. These are overlapping consumer integrations,
not rewrites of dependency commits. Every prerequisite still needs its own gate (mos-1351).
Added library_doc_write/library_doc_delete after the five lookups, only for a creative definition
with a within-role library.write grant and library enabled. Closed schemas carry exactly
{universe,path,base,content} and {universe,path,base}; base is string-or-null with 40-lowercase-hex
pattern. No project, business, author, credential, commit or message. tools.action is library.write.
New harness/tests/library-write-tools.test.mjs pins per-role eight/ten names, both schema invariants,
no repo/commit/business/accept, exact required/verb/action, nullable base, and missing library/grant
or noncreative exclusion. This satisfies sage-3678 and mos-1523's replacement coverage condition.
Publication's narrow helper now calls indexFor for the new served commit instead of only readLibrary,
so the284 lookup index is rebuilt before publication. New broker integration uses library.get's
served blob as write/delete base, independently checks served:path, reads the new text/blob immediately,
preserves default-canon null, then sees null after delete. No change to284's query behavior.
### Authorized baseline-test migration, own commit (mos-1523 via sage-3677)
File: packages/harness/tests/library-tools.test.mjs. Numstat: +4/-4, exactly.
The noncreative LOOKUPS assertion at :33 is unchanged. Every existing lookup schema assertion stays.
The four old/new lines are:
```diff
- ? ['web_search', 'web_fetch'] : []), ...LOOKUPS];
+ ? ['web_search', 'web_fetch'] : []), ...LOOKUPS, 'library_doc_write', 'library_doc_delete'];
-test('M3: per-role snapshots contain six names, or eight with the C2-08 web grant', t => {
+test('M3: per-role snapshots contain eight names, or ten with the C2-08 web grant', t => {
- for (const [i, tool] of tools.filter(t => t.name.startsWith('library_')).entries()) {
+ for (const [i, tool] of tools.filter(t => LOOKUPS.includes(t.name)).entries()) {
- assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS]);
+ assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS, 'library_doc_write', 'library_doc_delete']);
```
Additional schema mutant (mos-1523): add `commit: str("caller commit")` to writeBase in tools.mjs,
thereby adding it to either/both write schemas. The new-file schema test must fail both its exact
property set and forbidden-property assertions. Run on CLEAR and restore. No further assertion
change in library-tools.test.mjs is authorized or made.
All code/tests/mutants remain unrun. No Node, build or syntax check before Sage's named CLEAR.
Static diff --check is clean. Scope additions stay listed above, now including indexFor import and
call in the previously approved narrow publication helper. E5 implementation is present; review and
acceptance are pending evidence, not claimed complete.
## 2026-10-23 testing and landing boundary (sage-3682)
Latest complete dependency2845d587a552 (test/docs only over47db04eba) merged intact as f8f79ea2f.
Own tool implementation cd2f50dae and separate mos-1523 migration29455c0c5 are pushed; Webby reads
E5 and Dewey checks the migration. Static manifest-r1 covered21 own paths at f8f79ea2f.
Sage reserves first focused runs/RED-GREEN/mutants for T7, provisionally about22:25Z, unless he
explicitly frees an earlier lane. No Node before his CLEAR. This is a schedule, not CLEAR. Full
library/bus/harness and shell gates still need their own authorized slot; no gate result is claimed.
Before the gate, incorporate landed refactor after283/224/284 land while preserving every
prerequisite. Under the standing add-commits/no-force-push rule, update this published branch by merge
rather than rewriting its pushed history. 288 lands last in the chain; no landing is authorized here.
## 2026-10-23 E5 static closure and N2 wording
Dewey dewey-0948: the mos-1523 migration at29455c0c5 is static CLEAN, exactly+4/-4, with the
noncreative assertion unchanged and new-file schema coverage meeting every condition. Webby
webby-0263: E5 closed on29455c0c5/cd2f50dae (f8f79ea2f;98ca25ab1 only BUILD.md), nothing blocking.
Both ran nothing; Webby did not read the scratch manifest, so no manifest verification is implied.
Webby N2: delete inherited the write base description "or null to create". Delete now overrides only
that description: "The existing file's blob from library_get; a missing file cannot be deleted".
The reviewed nullable-base schema/required keys/verbs remain unchanged. The row's new schema test
pins create wording only on write and existing-file wording without create on delete. No further
assertion change in the baseline library-tools.test.mjs. No Node/tests run; still await Sage CLEAR.
## 2026-10-23 dependency283 follow-up (honker-0195)
Merged origin/honker/row283-build b2a1f4092 intact, fast-forward lineage from46bad7ea3. It changes
supporting.test's helper and Honker's BUILD receipts only; no production source changed. Honker
reports library98/98, business231/231 and14/14 mutants killed on that dependency head. Those are
his dependency receipts, not verification of288's combined branch. No288 Node/tests run; Sage's
CLEAR is still required. The dependency's own gate/landing remains Sage's responsibility.
## 2026-10-23 new candidate after283 landing (sage-3727, honker-0200)
Created bubba/row288-r2 from the preserved published bubba/row2887c53adf10, then rebased with
--rebase-merges --no-update-refs onto93694c5185d0a7f989d2fe78fb620e44599b744e. This supersedes
the earlier merge-only refresh plan for this candidate: Sage explicitly requested a fresh branch,
not a force-push. Both local and remote bubba/row288 remain7c53adf10, unchanged.
Git skipped12 duplicate283 commits already replayed upstream. Range-diff of
45dca69f6..bubba/row288 against93694c518..bubba/row288-r2 (before this receipt) has35 equal
commits,12 dropped,0 modified,0 added. Full output: scratch/bubba-row288/rebase-r2-range-diff.txt
under /mnt/storage. The other prerequisite commits retain their patches; row216/224 identities are
unchanged where Git could retain them. This is not new verification of any prerequisite.
Replayed merges had the same launcher-footer and broker/runtime/index conflicts as before. Reused
the exact previously reviewed combined file bytes, keeping both launcher test bodies and all lookup
and writer paths. Static comparison before this receipt: all21 own manifest paths byte-identical
to7c53adf10; all16 other changed paths exactly match93694c518 upstream. These include newly landed
226 and coordination/docs changes already on that base, not new288 edits. No baseline assertion or
production change was introduced by conflict resolution.
Sage's base93694c518 is an ancestor of the candidate; old283 b2a1f4092 is not. Static diff --check
clean. No Node, test, syntax, build, mutant or gate run. Named CLEAR/T7 still pending;288 lands last.
## 2026-10-24 static preflight before landed284 base (sage-4282)
No Node, npm, test, syntax, mutant, queue command or gate ran. Still on bubba/row288-r2,
b44152ac6 plus this static follow-up; await Sage's landed284 base before a fresh candidate branch.
Do not treat the earlier T7 estimate as CLEAR. Webby remains reviewer.
### Updated C2-02 brief and contract names (webby-0282 N1)
Read C2-02 on origin/refactor 95d4991d20a4ef291c824d37c886eaeaa9be7062; current brief blob 85e6fe2ecfc53ed615b7b61aade88ae0cbb222ef
(the new ruling is identified by Sage as5e8a720b). Statically checked both the candidate and current
refactor versions of all six creative contracts: roles/companion.md, research.md, ideas.md,
proofreader.md, fact-checker.md and continuity.md. Every one names library_doc_write and
library_doc_delete, exactly the two add() names in candidate harness/src/tools.mjs. No role contract
change is needed or made. Exact-name evidence is tool-contract-audit.json in the scratch dir below.
### mos-1584 fixture audit
The new row288 harness tests reach businessDoc through resolvedFor, but their callbacks add only a
creative role; they add no library business project. library:true is the typedTools option, not a
businessDoc project. The broker/runtime/bare-library tests build minimal business objects directly,
not businessDoc. The migrated baseline harness test likewise adds no library business project.
There is therefore no new row288 businessDoc-with-library fixture requiring a chief-reference edit.
The current and future landed-base imported fixtures must be rechecked after the pending rebase;
any validating businessDoc fixture that adds a library project must retain/provide chief gitea.
Shortened only two row288-authored fixture credential values: write-fixture.mjs uses fx288-write,
and the runtime test's two slots use fx288-human. Both are11 characters, below24. This corrects the
25-character runtime value and avoids an edge at the older23-character write value. No assertion
changed, no baseline test edit and no credential file was read. No live credential action occurred.
### mos-1612 whole-file run-list preparation (not run authorization)
Static lexer traversed real import/re-export/require and new-URL module-entry edges, skipping
comments/quoted fixture code; reverse closures carry a chain witness for every selected test.
Used the union of this older candidate and the current refactor source snapshots so newer importers
are visible without prematurely rebasing. It selected270 whole test files. Required whole library,
bus and harness suites add17 distinct files, making a proposed union of287 (not a narrow grep list):
bus115, business2, cli58, harness16, library13, plugins1, processing-control1, seat5, tasks9, webui67.
The brief also names all12 scripts/test-*.sh runners. No file/runner was executed.
packages/cli/tests/case1-accept.test.mjs is explicitly excluded under mos-1592/1612. The11
nonliteral-import files have a manual expression audit; all already occur in the import-selected
whole-file set. Generated programs and runtime plugin discovery are recorded static limitations,
not asserted fully resolved by the lexer. Whole suites and the named script runners retain their
brief-required coverage. Regenerate after landed284 rebase; report exact final sha/list before CLEAR.
Each approved gate later needs own root/webui npm ci, required editor build, short scratch TMPDIR,
whole files and gate skip receipts under the then-current rules. These are plans, not past evidence.
Artifacts: /mnt/storage/scratch/bubba-row288/static-2026-10-24/
- import-run-list.py SHA256 ec18031c87bf6f96b3e794e2e56747bc5e1fe37580de7ce9444c60cd5f18ddc0
- whole-files.txt SHA256 b2d6c11349268c347e51a64fe6bf9e7c4d560238a8fc5b5e10f600f1e6e8a39e
- import-witnesses.json SHA256 01702657d34c4f2c0635f38741d0a5b57cfdda63d5e96897f188d03971afd5d9
- dynamic-import-audit.txt SHA256 42b8721fde783c618e1347f2609ad6e4ae3144f563272f0bbbeb45c34f751018
- brief-required-whole-files.txt SHA256 254828414cd9b1b0a785df5c23b7f2b9ea7564d1f85e648899801e46194d135f
- proposed-whole-files.txt SHA256 bee666dce2c3f2d0bafe7e963fb443ad356b6ae8719ac3cb8ee413a329578035
- brief-script-runners.txt SHA256 02cd25af486c163189977106e055575145bffba688c7836e2a508f5ec91e76d4
- tool-contract-audit.json SHA256 bf07865d796b8b0aed85d84c015430ea03468c5331bcaae9eb80efafe1a182be
- fixture-audit.json SHA256 436a69a6b8548d8426390e867ed4b0f83693a3116d825c26c6f8a3e788f477d6
## 2026-10-25 landed-base transplant (sage-4338), UNTESTED
Named base: 78b69e1e68b2b8a9dc4c02564381a0792c0c7549, including landed284 ce0b6ed41.
New branch bubba/row288-r3-landed; published r2 e7c31a90d is untouched.
The initial --rebase-merges replay tried to reapply already-landed285 and conflicted;
aborted without resolving those conflicts. Transplanted only the twelve Bubba nonmerge
commits, in order, onto the named base using cherry-pick. No dependency commits replayed.
Conflict resolutions (no test conflicts, no assertion changes):
- BUILD-LOG.md and docs/SESSIONS.md: preserve the entire upstream side, append Bubba entries.
- broker.mjs: retain landed LIBRARY_LOOKUPS and lookup dispatch, add writer verbs/methods;
retain the complete landed library.status replyLimits branch after writer/save/revert dispatch.
- server.mjs: retain landed refusal envelope including reason, combine project/library save detection.
- library/index.mjs: retain every landed export, append the writer exports.
- webui cli.mjs and console-bus.mjs: preserve landed libraryRevert and add librarySave alongside it.
- runtime.mjs (notice follow-up): retain landed lookup adapter, add metadata-only log sink.
All other changes merged automatically. No business role/vocabulary file or dependency packet changed.
Baseline test migration remains packages/harness/tests/library-tools.test.mjs +4/-4 (mos-1523).
Only additional own-test edit removes a trailing blank EOF line in write-fixture.mjs.
Line-reference recheck: the sole explicit source-line citation in this append-only packet,
noncreative LOOKUPS :33, is still exactly line33 of library-tools.test.mjs and unchanged.
Historical fired-chief path4308 described an older broker; current fire.stopped/fire.done are
broker.mjs5126/5147 (firing detection863-865). Those historical receipts remain historical.
Old head/brief identifiers and T7 times above are historical, not the present base or CLEAR.
Final import-list audit uses candidate + exact named-base import graphs, eleven changed source
modules as roots, and all touched tests; no text grep selects a test. 272 whole files selected,
plus17 brief-required library/bus/harness files =289 files. Package counts: bus116, business2,
cli59, harness16, library13, plugins1, processing-control1, seat5, tasks9, webui67.
All12 current scripts/test-*.sh runners retained. case1-accept.test.mjs excluded explicitly.
The eleven nonliteral import expression sites were rechecked; whole parent tests already selected.
Generated programs/runtime plugin discovery remain documented static limitations.
Artifacts and chain witnesses: /mnt/storage/scratch/bubba-row288/static-r3/.
No Node, npm, test, syntax check, build, mutant or gate run. Pending Sage CLEAR.
## 2026-10-25 first CLEAR and delete-path RED/GREEN (sage-4396/4398)
Own root npm ci rc0; own webui npm ci rc0; editor build rc0. Fresh TMPDIR from mktemp
under /mnt/storage/scratch/tmp. All Node whole-file runs nice19, timeout600 kill-after10.
Initial own write.test.mjs rc1,10 pass/2 fail: delete and revert-to-absent hit library-git.
Isolated bare Git confirms update-index --force-remove rc128 (requires worktree), while
--index-info rc0. First replacement and two delimiter-investigation reruns still rc1,
10/2: runGit's stdin argument names an input FILE, not input text. No pre-existing test
ran or was edited. Final correction writes a private NUL-delimited removal record in the
already-cleaned staging dir and supplies that file to update-index -z --index-info.
Whole write.test.mjs now rc0,12/12,0 skipped/cancelled. Source-only fix in owned write.mjs.
Logs remain /mnt/storage/scratch/bubba-row288/gate-r3/ (write-fixed through write-fixed4).
Sage4398 authorizes this fix and requires committed new candidate + driver restart from
first whole file. Focused green is not the complete gate; remaining acceptance pending.
## 2026-10-25 new broker-fixture RED/GREEN, driver restart pending
Candidate7932c979a driver first library file rc0,12/12; second own bus library-write rc1,
0/14 (fixture FK and undefined dataRoot). Own fixture lacked gitea_users parent; insert
with valid16-hex nonce, consistent with landed credential tests. First attempted fixture
nonce was invalid and INSERT OR IGNORE hid it; corrected nonce, no product/schema changes.
Every bare.dataRoot reference was undefined: use bare.context.dataRoot. After these fixes,
whole file rc1,13/14, last assertion assumed lines were strings; query returns [line,text].
Corrected this row's new assertion to exact [1,'new served text']; whole file rc0,14/14,
0 skipped/cancelled. Intermediate logs bus-fixture-fixed{,2,3} under gate-r4 retained.
Only owned new bus/tests/library-write.test.mjs changes (+14/-12); no pre288 test changed
or failed. Commit this fixture correction, then restart all289 whole files from the start.
## 2026-10-25 creative typed-tool fixture RED/GREEN
Candidate4fb11e74a restart: library write12/12 rc0; bus write14/14 rc0; own harness
library-write-tools rc1,0/3 before assertions: new creative role fixture omitted the
Gitea credential reference required by landed285. Added the same fixture reference copy
as landed library-tools.test.mjs (no credential file read); no assertion changes. Whole
own harness file now3/3 rc0. Only new owned test+BUILD changed. No pre288 test failed.
Commit and restart driver from first whole file again; gate still not claimed green.
## 2026-10-25 completed candidate gate (sage-4396), SLOT RETURNED
Tested candidate2848d832e (three additive fix commits after requested8a47c462a).
Driver restarted from first whole file after EACH fix. Positive gate-r6: all289 whole
files rc0,2604 pass/0 fail/0 cancelled/1 deliberate FED R7 skip. Full required suites:
library168/168 (13 files), bus1035/1035 (116), harness180/180 (16). Other selected:
business25/25, cli619 pass/1 skip, plugins8/8, processing-control7/7, seat69/69,
tasks95/95, webui398/398. Case1 acceptance excluded. Final import graph regenerated on
2848d832e in static-r6: whole-files.txt byte-identical to static-r3 selection.
All12 scripts rc0: test-auth,conductor,config,discord,extension-package,
federation-acceptance,foundation,land-work,push-check,queue,release,task.
FED R7 dedicated runner covers ordinary-suite skip. Queue wrapper28/0 and node156/156;
canonical-root verify/render check deliberately skipped in this linked worktree.
Root/webui own npm ci and editor build rc0 before runs. All tests nice19, sequential,
whole-file timeout600/kill-after10; scripts timeout1800/kill-after10. Fresh mktemp TMPDIR
/mnt/storage/scratch/tmp/ for each restarted driver; no /tmp test root.
Six mutants killed (each rc1), restored positive whole files each rc0:
- M1 supporting checks removed: broker M12 refusal assertion.
- M2 forced push refspec: unrelated-blob retry/new-parent and guard assertions.
- M3 forged owner token: missing expected rejection in exact-token test.
- M4 beforePush grant recheck removed: held-during-fetch expected rejection.
- M5 notice after publication: E4 exact notice and failed-store assertions.
- M6 caller commit in schema: exact property-set schema assertion.
Source SHA256 restored after every mutant; git status clean afterward.
Captured logs across all four run attempts scanned for both fixture credentials:0 hits.
No pre288 test failed; no pre288 assertion changed beyond approved mos-1523 +4/-4.
Per-run rc and log hashes: gate-r6-results.tsv; counts: gate-r6-summary.json in this
packet. Full logs, mutant diffs, drivers and JSONL receipts under
/mnt/storage/scratch/bubba-row288/gate-r6/. Earlier RED/intermediate logs retained in r3-r5.
Slot-returned report sent to Sage as bubba-0034; no further tests after slot return.
Review notes to carry into request (webby-0296): N1 baseline library-tools.test.mjs73
still says tool names unchanged while the pin gains writer names; retained to honor the
narrow +4/-4 permission. N2 librarySave is dispatch plumbing only; C2-11b owns the route
that consumes it. N3 sync comment omission is cosmetic and unchanged from reviewed r2.
Commit-count correction: r3 initial head8a47c462a had13 commits, twelve transplants plus
receipt (BUILD +36, SESSIONS +2, fixture EOF -1). Current tested head adds three fix commits.
Formal manifest review/gate acceptance and landing remain Sage/Webby stages, not claimed.
@@ -0,0 +1,308 @@
kind name rc restored_rc log_sha256
whole-file packages/library/tests/write.test.mjs 0 e0f6a09b70316beebbf33966b35bfd05b4a12b587744dadc9239bd28de1b976c
whole-file packages/bus/tests/library-write.test.mjs 0 e0e9e609b20ea0564a7611046026cbdfd007832e0eb13507798e958d8d106ef0
whole-file packages/harness/tests/library-write-tools.test.mjs 0 c8a3a493d1d2abce785e94fdda5b1732e8d4a5e6eb19767af1b7e8b5e560cf3b
whole-file packages/webui/tests/library-write-options.test.mjs 0 2491eb6a01a0b4b2127bcb6a87a5dc778d079b7d1ea445509a1dffc49dea9051
whole-file packages/bus/tests/access-revoke.test.mjs 0 a1b317bb687e8c369440f5481b4ef309615afb5a5922fa306980d2024019e544
whole-file packages/bus/tests/account-migration.test.mjs 0 e697b58a1bb9b37c609b441fe786e557c7f0279e7a31eea791483ce4567db318
whole-file packages/bus/tests/address.test.mjs 0 977f755d29a8e75578d0bef48ec40b7045736014b2e53e15a03cdb6dd39696d8
whole-file packages/bus/tests/agents.test.mjs 0 3e8116bad1ab5594e627ba3e9f5403414885959935bcd9e6f75f1af4c625d4b0
whole-file packages/bus/tests/approval-binding.test.mjs 0 d2fbee516b57857f3a6562427d2a08bd7fdb772aacabd33ebd9d2990f01ec7fa
whole-file packages/bus/tests/broker.test.mjs 0 400e7f0616bc7432d8cb2a9efbae3c84d5b44ef59ce7f8fbebd4c802e2a9f44e
whole-file packages/bus/tests/business.test.mjs 0 f42502884a158ed1d190b37b3884e19d44547ececf068f91765b8ad15faffba3
whole-file packages/bus/tests/channel-proof.test.mjs 0 3984a7e2da2a60e60d0309f719a45a3ef04bca767bac34e00a760e19e941d732
whole-file packages/bus/tests/chief-of-staff.test.mjs 0 8dd57acf0101d4c92ada92f4c33f68061d4e2cb430179a8ab99a0b7fc9a19997
whole-file packages/bus/tests/citation-availability.test.mjs 0 d34d84d44b5949024ce6b32708c68e10b00a84600bb03598bf9538b358750455
whole-file packages/bus/tests/citation-guard.test.mjs 0 acab66e65fd41f1fbfd9524f80456553fc033d8bfc18a9bec7a813bd0d4552d8
whole-file packages/bus/tests/citation-runtime.test.mjs 0 ce33310d333c7a0af7451c3a3b610f5178961b80b6b63a839909b67657fd161e
whole-file packages/bus/tests/comment-cursors.test.mjs 0 cd4de90a070faf2bdb776a96a6ba43aa4854f6f5f1b2b7459740bd7bdc0ffb7e
whole-file packages/bus/tests/comment-migration.test.mjs 0 773659855873805b5bd950101d950945213658fde42d8012211e742ba9ddcc09
whole-file packages/bus/tests/console-decide.test.mjs 0 275fc0a24a03f2f27210a65e2bd21ce615ec9b6b400c4e4177ddb97a9e8e85be
whole-file packages/bus/tests/creative.test.mjs 0 eb950d5680ff7e4e09a9c11b1c169d4a740011ea72bb75921d35571ef5373df2
whole-file packages/bus/tests/credential-claim.test.mjs 0 b2d40e4d2a353f4154af4974d5779f7b20c652a8110da3183f95959ae2540941
whole-file packages/bus/tests/credential-status.test.mjs 0 ed367e3d123c9629b7d3d22f6fa60f48c74e71b36982c54ad2b3e8419f515431
whole-file packages/bus/tests/credential-store.test.mjs 0 0fd528ba27757393973cba5b21da573bc681659416962bf7d3a3dff3018414af
whole-file packages/bus/tests/credential-verbs.test.mjs 0 154b123af420abf08c6ab8b7bc6439052e7ab65c772abb0caac5e9b9cd3608e9
whole-file packages/bus/tests/credentials.test.mjs 0 6474b45c076f474a6881d0dddd0cd3b4cd385d52ac4c55ef1a9f8c10e0028277
whole-file packages/bus/tests/csuite-messaging.test.mjs 0 c0229df65240be8ad014d83def48dbd64a952b701f46e40ff01efdebb5644d6a
whole-file packages/bus/tests/daily-quota-runtime.test.mjs 0 62d686aa1852088af569cd3b921194db6873311f2ba04e55b15a93900b1615cd
whole-file packages/bus/tests/decision-close.test.mjs 0 9599744860a4e6e330ce50b8e93c478546edce5545a9171bed068743a266ae5c
whole-file packages/bus/tests/decision-route.test.mjs 0 2b2a9570dab83b1d454f56c1311cb41103a14bcff49e207cbb4ac5d4c73d6f0f
whole-file packages/bus/tests/decisions.test.mjs 0 a753df7d939155adf13c7177926728b2760cf61770117dd1655f29fe2c88a26f
whole-file packages/bus/tests/end-launch.test.mjs 0 ff7a27c35e35be424cbefa799e219ffc073c494214642b4ce56ceed6b359335e
whole-file packages/bus/tests/fire-revokes-grants.test.mjs 0 8e6bee9421480af8a1326d65903f258d5ea0a79df6188bf18301f32a5260547e
whole-file packages/bus/tests/gitea-grant-docker.test.mjs 0 8b639ee86d1a7d2ef267e1d36264f4ce1b5beed2c8ce084c39c0de1d699ca8a0
whole-file packages/bus/tests/gitea-grant.test.mjs 0 8fa39b3e58cfac4ec97f02ff876fde1a40a1894c826306c0b77d45c73586f753
whole-file packages/bus/tests/gitea-migration.test.mjs 0 689fb43a38718f5f5d00ffb3b6d998d5d454854d5e77a936b56d7c4192ee12e9
whole-file packages/bus/tests/grant-enroll.test.mjs 0 a8be59931d37a5c787c2087d29d766d6b701bbe34f8343134148292cd29d345c
whole-file packages/bus/tests/grant-executor.test.mjs 0 0a7f5be29b28140c9f8e7f67c6a897eb455677fba4459952a83982f2b23c87e0
whole-file packages/bus/tests/grant-host.test.mjs 0 54c4ed722116914221e9320fd41723e32aad59284e98d8e177130b0f4c4fe6c4
whole-file packages/bus/tests/grant-migration.test.mjs 0 7cfaa3f24d1dc070d7bdb8de76b08fabcdb6877d3367c59f7601e08f683d658b
whole-file packages/bus/tests/grant-scope-runtime.test.mjs 0 f8bccf5324f1e10282dfb4f4fd0f63c76c8e9481ae6cc0845a1d9028e3d9633e
whole-file packages/bus/tests/grant-scope.test.mjs 0 e30a8ced066ad214a6f70dd4a39c75bacf296032a3201e4605fa3c8df23e0159
whole-file packages/bus/tests/hard-waits.test.mjs 0 78d92a14781286d3ca11989786a8698a2b796ad1db78769fd5b3c7653ad7639e
whole-file packages/bus/tests/host-run.test.mjs 0 51d231611940444d2c2a37fbb7b14267c705c1b5e453b02367d0a6def214dc93
whole-file packages/bus/tests/host-tools.test.mjs 0 3bc5b5413661edd2026bca1721055ec7dce8d115918cc10c8f334e527176d23b
whole-file packages/bus/tests/human.test.mjs 0 5c8f3fd402ae4e130029b3203ed41b3cb45b8781417d31dec1f47ebddd516349
whole-file packages/bus/tests/instances-verb.test.mjs 0 940ca3884930f539272a2c39ca7e1c7fa3e51b3a4ea6fdcfb21719c652152257
whole-file packages/bus/tests/interpreter.test.mjs 0 d0c6190a428005b7750b59e665968657b242b322af05ca7bdd4cd7e815b7f4ab
whole-file packages/bus/tests/land.test.mjs 0 e9ecd1d8011ab6789fc3254bb069e76631b68b20ad65ae844ee12e0dc3b97cb0
whole-file packages/bus/tests/launch-notice.test.mjs 0 750a54d4c40559c7fb5414071bace8056d6bfa71dfdbec4de12c94c90299c3c5
whole-file packages/bus/tests/launcher-released.test.mjs 0 4d59486ca3077a4b2f51141ab79df635feb6b7bca2d6c0cfe5839a6a93715de6
whole-file packages/bus/tests/library-credential.test.mjs 0 db7e2dc4afe23f74c49795e4dcd3d28414435519029a837641cbb35bd3f4fcef
whole-file packages/bus/tests/library-lookups.test.mjs 0 fa18b5d4c829ec35ebbf519c4346a2ac38cff7538d58ea663acbbdd7930a6015
whole-file packages/bus/tests/library-sync.test.mjs 0 ee0ab1ad2549d3e6ae6d8123fa99d697d9be6c629e09131da82f0ab6d58a60e2
whole-file packages/bus/tests/library.test.mjs 0 62b663034a5de8d6d1abfaf3f94327d7aae435e3350874b424eefdb28bca1bd1
whole-file packages/bus/tests/lifecycle-revoke.test.mjs 0 c0810c743b5108773b6cfbc2d108fa09ea274c437433355277ce2b1295fbf692
whole-file packages/bus/tests/lifecycle-verbs.test.mjs 0 926bcfb20ab58a4ecbe85b4f8feb915f72adcdc6d6aee84f814187d0ac998efd
whole-file packages/bus/tests/limit-checks.test.mjs 0 919d745dc570172716b1e06d0ea1e8f16ae7b05dbadba77fe92dbbcc8eb4cba7
whole-file packages/bus/tests/limit-stop.test.mjs 0 2fc1ebee4e4d4862a100ed9ba97ace1e6d3fb3c608abea63b1ff634a04d5649a
whole-file packages/bus/tests/limits-runtime.test.mjs 0 5845176b73f98a499d92096ce0d22a3987ada664a529bdbb26230c2d00b9e65c
whole-file packages/bus/tests/limits.test.mjs 0 333f6757d9d00eda74e7d4641af660c9a0ce3d978e6a8550139d3a461c1d5866
whole-file packages/bus/tests/message-citation.test.mjs 0 38422c1d6faf076c750c3fccb7e927e38fe955cc28778511acccf5704df5b191
whole-file packages/bus/tests/message-filter.test.mjs 0 2ba52728df27756ac19ba65fe0705e7cf7a2a786a3b4df77a4eb4eec8072604c
whole-file packages/bus/tests/messages.test.mjs 0 b87de4ab04682d59a2faa7b3fc64751247454e628e9c1ebd4c07b1df2acbf11c
whole-file packages/bus/tests/messaging.test.mjs 0 831b48a9de594e17e8fc47f16ab8c2d722e8d57068a7d39deeaf4c0fa8d136bb
whole-file packages/bus/tests/model-proxy.test.mjs 0 99c5128733ae5bb16489171513c158ec1e34dfce1d07c60f6bccb0f84ab7afb9
whole-file packages/bus/tests/name-migration.test.mjs 0 bb8f92a17f6a022c7ec63161cccc0bb49a26c2a591fc369375cbebfa93a277a2
whole-file packages/bus/tests/names.test.mjs 0 0fcf60cc8c7dee3e85548c759f03e1792de92b59131bb9fe4282a3b07859366c
whole-file packages/bus/tests/peer-transport.test.mjs 0 3cb547003e50695ec2a25c950819b304f15203302281c00758a12c9b89b60f40
whole-file packages/bus/tests/peercred.test.mjs 0 e75c700a68ba0c1013c8f36178d6554f0321dc331b2198fd5ffc1a684df76c3e
whole-file packages/bus/tests/plugins-verb.test.mjs 0 359fef350befd1d743bcca89a96ebd0757346fd7c0622ba364039ba827620d26
whole-file packages/bus/tests/principal.test.mjs 0 732724e6bb2bb953e7dbbbae5c23cc0a1c33a7b7b202f5cb8b46be9363bcb392
whole-file packages/bus/tests/process.test.mjs 0 9c5883ea2ca858131317fa9be66d2a51a5d86dbe03c515b0544f4db56b2456a1
whole-file packages/bus/tests/processing-runtime.test.mjs 0 bb6b94ac654d069abd6e484031893e649e239d933c135b226d1cb2fbd5a94ca9
whole-file packages/bus/tests/processing-timeout.test.mjs 0 323036aa7f32f7aa324f61595531a29f3d5ef0ae2c24aec029842f2783d6be76
whole-file packages/bus/tests/processing-web.test.mjs 0 dbd1543498fbc8d0625990436ae668b3a382eedeecd098b929c13d2bb61939ff
whole-file packages/bus/tests/processing.test.mjs 0 529ec93e767444970ff03acb1ba719b45033daac239256c9cbd587c39f926a71
whole-file packages/bus/tests/project-await.test.mjs 0 e948d721ef06ce95f909880942f7e7ebd73b2f42563e1faedacc7b403b8ebedf
whole-file packages/bus/tests/project-files.test.mjs 0 3691b04705c17d4ef7218bc15771560aca5586c00ba0fd3fdf2a80f63d8dc659
whole-file packages/bus/tests/project-runtime.test.mjs 0 9d8d6cedeb2044f19e548dda0e32cae1e997b75a6d89072f7367b6e0ce17a44f
whole-file packages/bus/tests/publish.test.mjs 0 87f7a382580432646ca89d1228377719cb177bfdbb4f74ad617f6a70dbfb4b33
whole-file packages/bus/tests/reload.test.mjs 0 25aa45aca6ba24d72e9e5ad66dfc8c049375c8df121dd748dde09af52f16f853
whole-file packages/bus/tests/replies.test.mjs 0 0f05dc2194896540a1488310107e31b7e779cc02c381c201d0c95f69ab39fc51
whole-file packages/bus/tests/requirements.test.mjs 0 29569dc30659dbecf359117cc9a59ff37927c60f5514b8ceb8d3796c2c3e53d1
whole-file packages/bus/tests/review.test.mjs 0 a8daea8602be9429a8044ad636a438c18eee8ec77b6fa272dce606116d01de8c
whole-file packages/bus/tests/revoke-window.test.mjs 0 1435c543c9367204f4ae6d25c2cb97145e762cb18e78ea90a15eb1672a220353
whole-file packages/bus/tests/room-check.test.mjs 0 bbe5ac7abfb7e1b30f6fc8f9a247cd28aca82a8783753434339b790dd9857e1c
whole-file packages/bus/tests/rooms.test.mjs 0 506fad116ab1d9bb2520fe691adc91ca26e64faa96ced35c193cb11da4e07ccb
whole-file packages/bus/tests/routes-verb.test.mjs 0 c09fef3cb022bf7713cde4e1c512feefe67090eff05451fda9f55272140c916e
whole-file packages/bus/tests/schema.test.mjs 0 2a1a668dc408aaebe6f604ec5c3b8858211edc52930e1a552173cecedf806d72
whole-file packages/bus/tests/session-clear.test.mjs 0 1fce03f1d2a41f5ba294e9d406980a1d3251bc9a5dd4a02897413d6be3d9681c
whole-file packages/bus/tests/session-compactions.test.mjs 0 745510273a9eaaf61de4c6453c5dcc70e4a6020c0bcec69673621eefa593dab7
whole-file packages/bus/tests/sessions.test.mjs 0 d6c0337e0981ecb9aae2e912c27145bbd831e196828b2d59029666ceae5f605c
whole-file packages/bus/tests/single-use.test.mjs 0 6f5cf7d47716ce94eccb069f9b7e5625c3587737921231649fc74e8bfd3aad3c
whole-file packages/bus/tests/spec-migration.test.mjs 0 ede4ca62a772261bc868f4dfcb4861c9c3670110ba2afd39cc44183398c2eafd
whole-file packages/bus/tests/spec-review.test.mjs 0 951aa2a54cfe4bf0960dd3d2180874cb8183ff9b0aee7b7251b05df11385e1a5
whole-file packages/bus/tests/spec-socket.test.mjs 0 65735a2557e19b3d63a3ce7198c80fb5059f1974acd0708a89f192857b43b095
whole-file packages/bus/tests/spec.test.mjs 0 488ab443b41b06b6ae4434f5b2ee8904169aa08ab3527f3ae4c3f438e54f9909
whole-file packages/bus/tests/staff-request.test.mjs 0 edeb4ceffae3af33e330e1fac5d74c4fb1861d52ec5ac5005689791ab74da555
whole-file packages/bus/tests/state.test.mjs 0 3b5f916c494563fc7c18f89450e0cecbbdad8e24680b373e897253b9ea6064fe
whole-file packages/bus/tests/store.test.mjs 0 39d0a4033b89eff9b29ea6dcf6e56696a1d20a41e0e14b4bc8efbfae7962ecf4
whole-file packages/bus/tests/task-page.test.mjs 0 6446cfc1a43cb4206b4130f316251d3d9a820f929a6efc59dc74e7cbe1fbd258
whole-file packages/bus/tests/task-read.test.mjs 0 37134ced43ad5ada4291ad5e3474dcf7063892443b06d54a7456cd4cddb9cf2f
whole-file packages/bus/tests/tasks.test.mjs 0 9d91ee510a7447545c2cf93ae6779544a05e01bb70346e595b91a4800fa42d7b
whole-file packages/bus/tests/tester-threads.test.mjs 0 ff843610e02f20c5e1ab19de27b131ae7cbc3fd87b16d85e68336b5e914ffd77
whole-file packages/bus/tests/tester-writes.test.mjs 0 517c41e666d2c59b7ffb6ddb22898ef58b816bb26eaa47e1ce7508087b607df5
whole-file packages/bus/tests/tester.test.mjs 0 19eff6ddb3aca05ad5c006ac15e7860311f56941055850e86b8075cd39eff0d1
whole-file packages/bus/tests/thread-claims.test.mjs 0 ee146e984bb3ae82ad60f90c83035053ff2966ffea91015b6c3c4f93b7e019bd
whole-file packages/bus/tests/thread-migration.test.mjs 0 1dc2ae4e920d40a6fc2b1033f43ac0a2f766bfb86f07a596a983b9c1bccf87d5
whole-file packages/bus/tests/thread-shares.test.mjs 0 3f99a82e9e4a43fa788ebb231c5e712969809fa83b6ca66f04b8cad13f411235
whole-file packages/bus/tests/threads.test.mjs 0 2e5ba2be69a34c71f41a819c7a5e8615fcd085f847f9aa6d16095b9c8d742552
whole-file packages/bus/tests/transport.test.mjs 0 c9d28b9acfc0c2213838df0d960506156ef6fffec24a0cee7336324f105fac0e
whole-file packages/bus/tests/usage-broker.test.mjs 0 26fc080c6ffcb7c64cca39a07f302b59c21d1425ca3c90120eb3d3bb751c49da
whole-file packages/bus/tests/usage-migration.test.mjs 0 cfc65c4233aedb325293170e782ccb83fcfdd85cc4afed1e913e91785fa4b7cf
whole-file packages/bus/tests/usage-runtime.test.mjs 0 faa5fce30cbd7002137acfca3cde68b49b74321fb27b8a190736b35601430866
whole-file packages/bus/tests/usage.test.mjs 0 d36d21e0b3f5c9621b50e8b71ff6d8daa341f5954f3612b7cc93cb6c734215c0
whole-file packages/bus/tests/user-principal.test.mjs 0 1b56d881de2975ec4e3bc27fa15bc495ae0600709457da579337f0c9c98651e5
whole-file packages/bus/tests/viewer.test.mjs 0 942ba4fd96c3bb4c527eb129e69ddb5cb7660915e8458cfee47661d268db0e24
whole-file packages/bus/tests/web.test.mjs 0 048e3ef2840934f95d7e00de6502b19342215cfe5d00d1b8ada7c1bc6e87cfa1
whole-file packages/bus/tests/workflow-roles.test.mjs 0 1bed1351ec3c50ddce65f9b8108f93a5c4061ef5cf36f3d09706d85b13e085ed
whole-file packages/business/tests/case1-business-file.test.mjs 0 4481abbce73eae119fbedc5edf65120fa494931913aac6f0273b04263c251cc9
whole-file packages/business/tests/launch-settings.test.mjs 0 540f5170ddc7e79a8abd9584c4586eade3ecc1f7544489060db99552c75e4685
whole-file packages/cli/tests/access-boot.test.mjs 0 e41e1f1949d3568f8845234d573282c18a185578389d6947140cf540d7f99dc8
whole-file packages/cli/tests/access.test.mjs 0 9e2a813092ad4b60cd89443424eb4142f217265e52ff7b769b7f16d247d5a367
whole-file packages/cli/tests/app.test.mjs 0 5f5244ba0061dc4ffd1565c4abd3168d7cb2e6398625b69c841a54544b9a35a7
whole-file packages/cli/tests/boot-status.test.mjs 0 ca090577e20ea46315cb377668e309571380e2323c867a8b90d0537022e681b7
whole-file packages/cli/tests/case1-hostcheck.test.mjs 0 403e1127da5637904e8fe1c1eed5a7865c5bd5ee1c5d0fe684837a7370c41de4
whole-file packages/cli/tests/case2-install.test.mjs 0 df8edefe13297ced929d09f01eec5c7ecf38c355d9871368cb19f2f392ae057a
whole-file packages/cli/tests/case2-persona-import.test.mjs 0 5dc7a93c03567ec0e85e43bcafe07109881c30b2e83b4c4eab4631a155daece0
whole-file packages/cli/tests/case2-unit.test.mjs 0 39b349dfd3125e74b780ce28e9ec24465a6a8c2bb9e431c819864f4eff1fdb77
whole-file packages/cli/tests/channel-cli.test.mjs 0 9fd9c30aa604f77b7a069912cb987293af36f2f138cce850f8d26946f5ce42cd
whole-file packages/cli/tests/channel-recovery.test.mjs 0 52c6bd980cd54ef22b9e6c78260a1e389e8177526340129ac64fbafa7f2e01ab
whole-file packages/cli/tests/cli.test.mjs 0 59327fd89e3fb8f927210df6a2c62afe4522e59f59129b1967be2a238c498f26
whole-file packages/cli/tests/compactions-launch.test.mjs 0 c9006b3039a6616be1816f5ce85bf68ba4fb54dadf10447e52fc92f7ed57bbe5
whole-file packages/cli/tests/config.test.mjs 0 35e39fb0551e23f5738d0c30d66bd233f2290040885c511e526f0f0468b31cad
whole-file packages/cli/tests/credentials.test.mjs 0 2b55cde2318a034ec4152e712863ac54f07f1b4db752c6282507d7f621bde67d
whole-file packages/cli/tests/federation-acceptance.test.mjs 0 cca971a93a5dfd20e603b45cc2158b58ea0638e8bb7a33e6e0c5e12178ffa3df
whole-file packages/cli/tests/follow.test.mjs 0 26a3ad0dbc124aff48a5f4908e3d8b78cb871e5560c0e389de457f58aea2dfe3
whole-file packages/cli/tests/git-socket.test.mjs 0 10c21c34a79ebd5f89f6ed9182a492e9f42f0512a68f758c0566a763a84abeb9
whole-file packages/cli/tests/grants-scope.test.mjs 0 37967ca8e82a89a0e88ed872fa562b5c094282cc759853b6dc31c292204bef3c
whole-file packages/cli/tests/grants.test.mjs 0 687af745932625ea1d439a8139c760f14b4a327bf9b15c5b5b1cdbc7ea6be09f
whole-file packages/cli/tests/host.test.mjs 0 50010e97e44392f28006bbd4127146b8aa1712ff4a016ca10864923701213dce
whole-file packages/cli/tests/hosts.test.mjs 0 d5d507c3968c45b2aa25067d6bbb1eedd69785c0aa1bb51177c63b6ad64fcb53
whole-file packages/cli/tests/idle-stop-race.test.mjs 0 8e6171855003b0f40921863430dc89cf20f8bbf14a9ce3c115f90486f08232b5
whole-file packages/cli/tests/instances.test.mjs 0 c6b4d59443baa4af029af76a846a8093669a7593490f21408a2c40ad027acccf
whole-file packages/cli/tests/launch-account.test.mjs 0 6cb63446fc8dbb6217e6d925caabb37a28bcf1ea5c27cf8d515d67c7842553b8
whole-file packages/cli/tests/launch-limit-checks.test.mjs 0 fae971d715a90d1dbbeb3c054932a02d253e0a0d036d3b0db4e0c9edcd5ad7ef
whole-file packages/cli/tests/launch-limits.test.mjs 0 d3f4b2c57e776bf6bbcafba6dbd9c4728918b0d81fc606dcd7d2dffefdad4001
whole-file packages/cli/tests/launch-routes.test.mjs 0 e2bec020f96238079908c03537366c64800de0913a83f3a2877606d0266548d6
whole-file packages/cli/tests/launcher.test.mjs 0 beafda99d34a532f3a1d6f96565b7a780e03924939b6c30b01a8169cceaa792a
whole-file packages/cli/tests/lifecycle.test.mjs 0 014a2cea6d3f2a9f21f7fc16dc68b34740b03726612851047b877f8c1194ebe0
whole-file packages/cli/tests/limits-tokens.test.mjs 0 6fdf9e6946dfb579cde42ec500d8cb8473a9d8318f43caecee7561a5e40fdec1
whole-file packages/cli/tests/limits.test.mjs 0 bc2f13959d087ccaf6977c4cf1294e6fcee21f968677ab169580ce79643add18
whole-file packages/cli/tests/mark-read.test.mjs 0 64864c54ab910488d55136b88f351771489cf744ba1c21e5c479121694dd88ab
whole-file packages/cli/tests/model-proxy.test.mjs 0 119a5d02870a4062992efba7f44ee9dfe69ecf8a7076f121aa24a8c7edf24cf0
whole-file packages/cli/tests/names.test.mjs 0 c2160aeb0c68855f59b5d97dc3b6101b7800028df708f5f42430ae5854eb23e2
whole-file packages/cli/tests/notifier.test.mjs 0 18e62f48de18cc4d57916a556adeb3befb13921d5d7b036ef5a7f2bfa460cdc1
whole-file packages/cli/tests/optional-tracker.test.mjs 0 e5adddfee06b2f1cbd2ec50caf84b5acbc58d4ff4ec4c1bc539a4535a3991827
whole-file packages/cli/tests/other-tree.test.mjs 0 2dae57af2b8d508f2792ce37191aebf0cd28ad75f7621d4ab9f8d6daa60b748f
whole-file packages/cli/tests/processing-cli.test.mjs 0 44b2854ba03810cdda3ccf0c6de883f953089d532bfcdc8f4bdd3faffac80fe9
whole-file packages/cli/tests/project-name-repo.test.mjs 0 0468b9ecde6189d1398eef2e7e8043e870aa867a8a9d22b20b2ded26dc1543b5
whole-file packages/cli/tests/project.test.mjs 0 79e648106151ca220d9535b16c416dfdcffffaed41e3c211e4325c151f0775f7
whole-file packages/cli/tests/publish-socket.test.mjs 0 59a02b1fcc284407b06d0d2df8e6e1e5323059daa2e47c690f30a718d1e7c682
whole-file packages/cli/tests/reply-limits.test.mjs 0 554a353d61891c3cbe8da01062025dcb0756ba4f4e7ab3fb8d7b56ceccf64437
whole-file packages/cli/tests/revoke-window.test.mjs 0 743fdb0135e507dea5b968265907e5ac9228284b130feb0057d91e70ad561c02
whole-file packages/cli/tests/session-clear.test.mjs 0 5abbd894dee9cfcb3464a40e5045f9062402d5ffe567972113715cc9e24c6ce3
whole-file packages/cli/tests/session-cli.test.mjs 0 c469aed70c1ae408e176189f23a849f3acf0bfc7dc3ba1132c101a931359a462
whole-file packages/cli/tests/session-launch.test.mjs 0 cde78f9dcee9afa243692fb0493697104425b61589bd7be6c4cbdb0f4bfbd5e5
whole-file packages/cli/tests/stack-copy.test.mjs 0 3b92b3772c060378cd2ec0c1bf7fe6662721721a11d99d83c9debe3e3aa929c2
whole-file packages/cli/tests/stack-instances.test.mjs 0 2839e390f564a6e58cd514ce4061ec0b741ed07b4e2b755a337439737601d97e
whole-file packages/cli/tests/tester-http.test.mjs 0 bd9c598c84dd0be3b9873176c63e418ccc004265153be68e0cbe51c40b1ff91f
whole-file packages/cli/tests/tester-reads.test.mjs 0 50a71ffd9093c4d51d8ad07bc9edbbd76306922f290d28194d656cd78f8528c5
whole-file packages/cli/tests/tester-threads.test.mjs 0 cd3dd0020472c269d61934ddb32d77f6dc297090d63e819288f4038fe9edf096
whole-file packages/cli/tests/tester.test.mjs 0 437498258b4ea5c2f2bfa8fe66114106ac10944911bd40bca944f2078b34e45f
whole-file packages/cli/tests/thread-cli.test.mjs 0 c29897119f279434bec0248c12beb5ce97f6214b8b0bec995061000f047b1600
whole-file packages/cli/tests/thread-launch.test.mjs 0 459ef35e2b4f9cb87151577f252282a716ddbd4985f26e9e26c01b08af13a7f2
whole-file packages/cli/tests/thread-revoke.test.mjs 0 b8a72080a9624ce4bbc1b23b8903be1b74a8a6ced35b0b60f503d92a22d1028c
whole-file packages/cli/tests/trackers-boot.test.mjs 0 f83d72dac4eec7369d62b495745e1fdeeb4ff1ba2e1efb376c9b583da1765a1d
whole-file packages/cli/tests/transport.test.mjs 0 e0ae6c26b5669d4b955deffe941a3c4314be12297e72d6c099de750170688d9c
whole-file packages/cli/tests/usage.test.mjs 0 639ebccda23e0e094d62cb0e7e5c80c403b74b284ac5189fb0d92e63387c92f8
whole-file packages/cli/tests/verbs.test.mjs 0 43eefd242a987efe42d145d7863372a2b0a397031baec12ecd4c9e0644daff12
whole-file packages/harness/tests/bundle.test.mjs 0 75fd5a9a6fa0b46078952ce216348e39ce481f6fc00b89f85da9ff729d5ba100
whole-file packages/harness/tests/citation-runner.test.mjs 0 933021f114882a6c58f4071446a07d49ebc9f99c062ffe1fedc1f13b799db389
whole-file packages/harness/tests/claude-gate.test.mjs 0 f66053597c8209c5175810e33d8b878ad74eb314f4057f5b4b0b1ac625272329
whole-file packages/harness/tests/claude-session.test.mjs 0 9c4d8ffc00efd0da75d143bca1cd33f30f3e762e20086270d941170e80c962ed
whole-file packages/harness/tests/creative.test.mjs 0 3433184ced3427613d645807f0757896baf52d214c3dd6a4a12c3951bbdc50ce
whole-file packages/harness/tests/gate.test.mjs 0 991670779d9cf6f733d0060c6f1a59d122ab8e99f7e0a5f7183c9e974f1b1aaf
whole-file packages/harness/tests/git-tools.test.mjs 0 2837565ec16cd8c4d032311675a1468bc4bc756ee0696d0e57ea35ffd56eea44
whole-file packages/harness/tests/library-tools.test.mjs 0 05a8a5d8e8c4e7b3435d4a9b3f6292816356a99f7156ded2ef7873e1c84f8de7
whole-file packages/harness/tests/mcp-server.test.mjs 0 6ce4c6c39b8a1ed70fbeaca410781a62d69a6412333e03640296048b799a09b9
whole-file packages/harness/tests/pi-session.test.mjs 0 570376f798b43e82bbc1972f1d50d3915e94a8e4ca00e50076ab390df9830d7d
whole-file packages/harness/tests/raise-domain.test.mjs 0 aa6be675614d9324c3ddc01ef40347b235adbccfe6cd73081096ae9e9742d754
whole-file packages/harness/tests/runner.test.mjs 0 d3f8c752897e359e10a8e9d507c10ef3760a5ae37999f6f143cb222c42568437
whole-file packages/harness/tests/skills.test.mjs 0 2f34800387f4d7f8b8d5f6758cd197f77d11034011bf7f4f79f4d74c582e3f0f
whole-file packages/harness/tests/spec-tools.test.mjs 0 29cd1f7094266963a995f636d9575337246a9868d42a48f02231a99251261f47
whole-file packages/harness/tests/tools.test.mjs 0 f27638f1fa38fd2d15a352f6c21f7980688d48d580f5a59dab1520fd7c30b30c
whole-file packages/library/tests/guard.test.mjs 0 6529c2b48c252eeaf9c19487507a03cf46d952e7ffb3a41e640a54590e312df0
whole-file packages/library/tests/index-build.test.mjs 0 4747cb8c842cdc424db727cb3b0e36a6d35f4e9c5c31c1a3bf61314897c2cf6d
whole-file packages/library/tests/links.test.mjs 0 9b89f9275f19035c5f079b6920b248466048626c634153eba2fec165f9f6388f
whole-file packages/library/tests/mapping.test.mjs 0 9110b98f955dd71588357858b913194ccf9e04dca9aa7c4559600cbe9b9e8e71
whole-file packages/library/tests/mirror.test.mjs 0 cc2326da9796dbbbf5b3faa121180a7f00c43816a232a96faece7b58570f1227
whole-file packages/library/tests/query.test.mjs 0 f1209bc132a63cba9a7312cbed7e3098126e05c792356648f1d9ec497a11aa82
whole-file packages/library/tests/reader.test.mjs 0 3e17f34697ae65524cf7908dcc9ca1b24025bbc92989b2ba05f6e75c0f839c3b
whole-file packages/library/tests/render.test.mjs 0 5e68091a309a07e5502b9cc500c7cdfabaa9e246bb77b0c04a0dd86bb9bfcde1
whole-file packages/library/tests/scope.test.mjs 0 f55dec854adcd311d614b66959c5655cb3419d7ae7b06fe1f648b43cdecef32e
whole-file packages/library/tests/supporting.test.mjs 0 2f50bbe9c942360a5becf5bb984ed5aedb12628d4578ea85c6e433ad0ad73130
whole-file packages/library/tests/survey.test.mjs 0 72108eb8a07b990b93ca62c5fa4b55f1f89f3254ca1cf59d3de8ad194dcc3a0d
whole-file packages/library/tests/sync.test.mjs 0 a68c69492149b6e9dc7dbf24fc434ebfd3243b2db2c7654b00107b997e99ead0
whole-file packages/plugins/tests/harness-compactions.test.mjs 0 9eb9f67c06ae17b33198fbcdb443a0c73ca9cc0cd157cae2359a0647d2db3658
whole-file packages/processing-control/tests/task.test.mjs 0 8db6adda6b5d5f7437e9e4cdf961134493409d7227fde02c0b0a76aeb21186f0
whole-file packages/seat/tests/compactions-budget.test.mjs 0 1849994f45bfcccfb4ce18915887c740947a98041aa7bd66590ae7a62fa7078e
whole-file packages/seat/tests/compactions-ledger.test.mjs 0 af689c631c9d62dee11f4400112fd10df82567c1f49d9f0d423b9d19d6f860d7
whole-file packages/seat/tests/compactions.test.mjs 0 cf5e74e1211560ca47a2c13e8002635097f486e2ca06698795bc38263d889f3c
whole-file packages/seat/tests/sandbox.test.mjs 0 c09d89b8e1b22db25578f62cd4a1d3b9f441d652178fb675800efb31de33a577
whole-file packages/seat/tests/session.test.mjs 0 82171646932cddfc68f0e90ca3355f9595d32c5d228c1fdb855c06cb1d9c2feb
whole-file packages/tasks/tests/adapter.test.mjs 0 8843067c21942ae6165a7feaced2382fd9d02d0c62bd30772191393cb5d962b8
whole-file packages/tasks/tests/comment-restart.test.mjs 0 25aa6e953cf19ed3ae368581035b9d883ed924b41d593240e2b4ab5ba39f2982
whole-file packages/tasks/tests/fields.test.mjs 0 e4eafd6b17a46262dddc548263da993bc3a672adca1cadcc698b6d8374f11e2d
whole-file packages/tasks/tests/processing.test.mjs 0 0b89866cc076c43c37534dba926d492d8d334d08a6886325e3d4ac6ddbc88897
whole-file packages/tasks/tests/shapes.test.mjs 0 0b8cc660a07e048d007993d726ae5b8e1f343cb571c18ee0284c3ba0c4b41602
whole-file packages/tasks/tests/startup.test.mjs 0 5b44d779ab4ec86922dd35ce7c78096de02c0a0f2363cc6c2a5ee07816efc2ad
whole-file packages/tasks/tests/sync.test.mjs 0 513ce9f6e64a3fa0179f8cc9b27db671267a43cdc44ab93f38d21982dd2b9631
whole-file packages/tasks/tests/tree.test.mjs 0 d3c8f91f59150259b3226e9306c98efbaf2aa17b5b74cb9b376a103620f8aefe
whole-file packages/tasks/tests/verbs.test.mjs 0 47b075d01ef38a5d0228902a6f9bcfec0b78b1a958cd071e8114139af73bca53
whole-file packages/webui/tests/agents-browser.test.mjs 0 d3ae822399f58d2c4dfd90e054811a60663a66f9d3fbe69a76aa4ce7dc7260d0
whole-file packages/webui/tests/agents.test.mjs 0 be18c8fed41173900617d3b646fac1ce14c07c208e7f24d6567f61f55c5c4dc2
whole-file packages/webui/tests/assistant.test.mjs 0 056e4c2a37b7b395741ed1ba33546031a6e4ca53db843bd877b93bed764e02ad
whole-file packages/webui/tests/board-held.test.mjs 0 01a24d222092ad46c24ea94f684a018b787dfc8d26a0f7d7fda5d9df7192e695
whole-file packages/webui/tests/browser-edge.test.mjs 0 4d10b4fcefbc64cdf12bbfbd9b47f74810b3219f70624c35490cb23d66d3c4a1
whole-file packages/webui/tests/browser.test.mjs 0 d8c31b7cc16d93961d65959fa9653eaba906f81da3a34e19b3da7cc922f840c3
whole-file packages/webui/tests/bus-browser.test.mjs 0 ab1538aaabfdb02c336da61675a0d1d7f367483bc500a380e7f0ece050ab8609
whole-file packages/webui/tests/bus.test.mjs 0 fd7acdf189fef230af80c32c4c972d9bfb1564069d7c4ed649c3a49bb6636e1e
whole-file packages/webui/tests/channel-chat.test.mjs 0 678b8e3c9152662487fee1c52c8abcae95029b0672d5bbe26a824bbdb4a7ee0b
whole-file packages/webui/tests/chat-browser.test.mjs 0 ec29dd03ac7950dfa90e31f72ae74e2112718f1c02ce4dce8055194a328b5f5b
whole-file packages/webui/tests/chat-instances.test.mjs 0 72c88b1eb11397bcff524af72cfe826a276b97b58e33465c6e3334e2746e7783
whole-file packages/webui/tests/chat-replies-browser.test.mjs 0 bea9b1f9333bc913b2f01c29a792ea4b2fdbed3ebc64b42548e06f0bd75c9fc5
whole-file packages/webui/tests/chat-sessions-access.test.mjs 0 f2de41c7d1f6e246a8a13dc33e8662932964facc5b93d8f85ed5fca760c87fd8
whole-file packages/webui/tests/chat.test.mjs 0 4c6564d3565b01d68f7d16937aafddbef2ec3e04744fa9d1544ac0500a386ff7
whole-file packages/webui/tests/conversation.test.mjs 0 1c3f8811256ad82d7771a06878c3e70dc3d6f2beab82366b837780a7873ff6f1
whole-file packages/webui/tests/decide-browser.test.mjs 0 c53e1b962df99686f9739e258b2b86fe6325544ab02509833f9b1176f1303845
whole-file packages/webui/tests/decide-sso.test.mjs 0 f96f8085015a96e11aca2d94bfb9e75318c0c0dfa9659049ec7b7e31ad7bc6de
whole-file packages/webui/tests/decision-http.test.mjs 0 c89b7af200edb82f9986479199f359cf6a06c870f1bcf22b538cdf3b167f1258
whole-file packages/webui/tests/discord.test.mjs 0 1c3e6d64a370adbc6c7cb24391989e9c00d97330d393943402ff5c6a99c5f9fc
whole-file packages/webui/tests/docs-browser.test.mjs 0 f39d989ccdc561175643583b27bc19ee76fa25dec5947baa206b0c38b41c1e2a
whole-file packages/webui/tests/editor-browser.test.mjs 0 c807f81d596b3a2e3d2ea55e560f29e181a0354ce48676c6760844855acb0dd3
whole-file packages/webui/tests/editor.test.mjs 0 6953a85fe791e9087d14c3bf5075de2c4a651e1a502937da3226065c529ffd2b
whole-file packages/webui/tests/granted-user.test.mjs 0 ae3baaa0d2a1ed1ad3e9625a46a8071222dfdef4c2a70ae3ba5bf159b85dec0b
whole-file packages/webui/tests/history-return-flow.test.mjs 0 8f9ceeb41a64ec2849383a78f4997f7383c86a01eb6cf1d16747c2eb6c7448d4
whole-file packages/webui/tests/instances-browser.test.mjs 0 33b9cd4be552f89809e75f72c54f73dbe6459a5c53401a79a4d887e5a658c442
whole-file packages/webui/tests/instances.test.mjs 0 904abfc06358c99b0f646c3e728027cd7bba2b27c98c767c7da95016e531277c
whole-file packages/webui/tests/library-cli.test.mjs 0 dda07bd1b0d65058723c4d5e50f94fefb1ee103c33c8f61c13841cfedfd53f41
whole-file packages/webui/tests/library-routes.test.mjs 0 5cd1f4c6ea99cce38ce59eee085ab31f9aa8bba39cebbaf52b355c4d8fec3098
whole-file packages/webui/tests/library-status.test.mjs 0 0b4fb5a07a3d35fb2237401b460ddd3832a2f6fa357f6fbb06b8463251b77faa
whole-file packages/webui/tests/limits-browser.test.mjs 0 1a55050c92be5b93e447878feafe59e017b205d114413e6de000faf784df1dad
whole-file packages/webui/tests/limits-route.test.mjs 0 b74fe734b0ccbdde716bb52bc15791f80a0b251514a6b01d6ba59164b9639123
whole-file packages/webui/tests/messages.test.mjs 0 19bce52278091c8d37ca48c1f6f72bc400cd9a9b3038ae9f31e35444fdab05b8
whole-file packages/webui/tests/pinned-copy.test.mjs 0 a8c99249fda05c5be773c8d2231e2dd1a3f3b7d10a40a7ec3e6ca6c6cfb4c85a
whole-file packages/webui/tests/preview.test.mjs 0 7f7fbb11dd5915b3351b5086ec9b0f0bed6837a32a2e5902b707fcb54f1bf1c3
whole-file packages/webui/tests/processing-browser.test.mjs 0 ed5970f1e2b1fa393c80db5e5551523e77ad0ee107dfa686a76c5d923b7e2d8f
whole-file packages/webui/tests/processing.test.mjs 0 ac7a3a0ff51bb15c04e228186d771dd75ef515e09156cd080a8bea881e7cdd8d
whole-file packages/webui/tests/project-file.test.mjs 0 8bf04994dec5c6d6670bbae055802759588c27b04010582732cbbf32c2921487
whole-file packages/webui/tests/project-name-repo.test.mjs 0 ca773d7109f132bd099c43003a8269edfa96b2ba3a9e01e3694fa6bd12b9143e
whole-file packages/webui/tests/proof-cli.test.mjs 0 5095f1ec66a3fc153467baef2291073e27aba17fdc2757e0a3cf2a03057a6547
whole-file packages/webui/tests/proof.test.mjs 0 cdb948d261f52232c6e31e25baaf234bd0af3b6d90360a41a6142d2f34a8a797
whole-file packages/webui/tests/reads.test.mjs 0 ef69c9c1dc9a55d526a704297aa4e2802cdca8f0e1fd70ff79efad2114a071a6
whole-file packages/webui/tests/relaunch.test.mjs 0 e9f075560291cb446dabcaeb86c8800b5ea4ca0396c6a999ddbff88b245cefd1
whole-file packages/webui/tests/return-flow.test.mjs 0 bf809ee139c15e9b6b8fe7f6e0f2ce00d0860aa460f145242fc732eafe8da8de
whole-file packages/webui/tests/room-browser.test.mjs 0 23286bf46f341220f9e89cc1d229f46a579edb2eae5d688fc768f99ee343c858
whole-file packages/webui/tests/room-http.test.mjs 0 a921e1991386cb5e184475cf47a012b3020b575968268e9f3c0b396e244a1819
whole-file packages/webui/tests/routes-browser.test.mjs 0 df1283a6e1c5970b404b314b6b76dbf412e5318d76f296ec00164c932166b020
whole-file packages/webui/tests/routes.test.mjs 0 055aa274fa66910a4ff1518fea49fbbbbbc5360dc16e825a460538f312a0781d
whole-file packages/webui/tests/send-browser.test.mjs 0 da1547383522dbfd74a571b5d7625a310ae88f8adddff0c2bd33cb59df3ac137
whole-file packages/webui/tests/send.test.mjs 0 f273e78388935b5fbc18a974f50cb85789436d51c47a4d8dccaf4af4742c2392
whole-file packages/webui/tests/serve.test.mjs 0 1971344643d9cf6b4440d95c9ede42093235883ffab04fc4b614c1b7e7078f22
whole-file packages/webui/tests/settings-form.test.mjs 0 80bd949d1666f2fe1f4caa051e2c34e742bab0e4adbe5584bd534d9bad8bef53
whole-file packages/webui/tests/settings-write.test.mjs 0 7090474fff40910edb93c032feef248adc40ad21666d09c3610cf10279164f99
whole-file packages/webui/tests/shell.test.mjs 0 844287f7797201473f1fb8d97ff2355ff3ff505006723678db78f26d3e5c2a40
whole-file packages/webui/tests/sso-browser.test.mjs 0 1f70c36ce7d054ad435e52d63083c8fe19cd71e70c723518de5e58b69a426a0a
whole-file packages/webui/tests/sso.test.mjs 0 6d7b3061bdc6e22744634ddc5612ff781e5c952a120a346c29eead66a3736438
whole-file packages/webui/tests/tester-browser.test.mjs 0 425c54a84e5bf04ca91d8dc57ee83c14aff14a38159243f10f1c9114dd563967
whole-file packages/webui/tests/tester-cli.test.mjs 0 5eb7296792f16f24d4486f39101007114b3db81c6ab53ab969e925caaffaa7d9
whole-file packages/webui/tests/tester-listener.test.mjs 0 43927869c50a0e223d121e2dea2d10346a053a39fc8157c9fc4813b7c3b17e1f
whole-file packages/webui/tests/tester-socket.test.mjs 0 c05962be7f87084404c53e4f7ed2caffff3d69e98e69a3c9f3c53b150cc804e5
whole-file packages/webui/tests/thread-claims-browser.test.mjs 0 cbb2aeca0de2c64dd4c8d063d3e45140738d8f4064d38effeaec245ed7181b42
whole-file packages/webui/tests/thread-claims.test.mjs 0 164a6c927abd819218be6386e123b234dd9955b122bace699e0a12201797791c
whole-file packages/webui/tests/thread-sharing.test.mjs 0 ad64ab207702483aed6f16d13393e5f3c5a1ab0a0c2dcdf32717e8148a45078c
whole-file packages/webui/tests/usage-browser.test.mjs 0 14be967dcae157cbb0a7b9ea4e0bc67337941d91a11d789baeb3d3c8353ac0e9
whole-file packages/webui/tests/usage.test.mjs 0 4e20eee53c3eb79dc2930ca054977d06da88dba45b706a96ed94abaea6ec3e93
whole-file packages/webui/tests/user-option-swap.test.mjs 0 bd43c257ae31cad2ca6c7a0b3ee49c6e323737d236fb7ff2a2105fd5e59b9767
whole-file packages/webui/tests/views.test.mjs 0 4226ea02d33b9de8f2eaf9f93b0a551cbd9e6100560a8811eed90aa8de76974c
script scripts/test-auth.sh 0 03999aab66446a4192ea9855f5cc1bd406080d0dfa5250b45b30e118556a0d5a
script scripts/test-conductor.sh 0 79b7a689ed96792d42edd1d14796e0293e84e2e339b49476e457ad89e1c4a186
script scripts/test-config.sh 0 2c3c87fb193e82fa17428933eb69cb2b34a589e8338f7a94aaa8256729fdf08f
script scripts/test-discord.sh 0 5c6918b4415e8eabc5df31ac5ad696ec2afdfe3d498d69eae64f228a3807eddb
script scripts/test-extension-package.sh 0 1f672a73e507cc57a204f7d3806ddcb211a0a8fb3ffccefc12bbc41e299f65ac
script scripts/test-federation-acceptance.sh 0 febb0148bc1316bba3189aacf34d7c78f5f5db5d97a35aa4528dfadbec8bfbd0
script scripts/test-foundation.sh 0 3de063333ce60ef1ca1986ecdd8ac30187a2316b7ca8e3ae4b4e6c8bd435caee
script scripts/test-land-work.sh 0 ec90beab6246420982f872a4f45a7173e7a06f4aa263630d6ec4a4865176cde0
script scripts/test-push-check.sh 0 0304c110dc5cf269fd8a4bea9759e5d48895a51c9d411814ce39ca924073da79
script scripts/test-queue.sh 0 f678da9550eb6daa5268465b3a07beefd661e506ed38b8e11bf0a1b4a68cc781
script scripts/test-release.sh 0 ad0f2a6b271275003783d3ffab5520f167ea79e26683710ce92a71600037360c
script scripts/test-task.sh 0 ad511e52af4bc0a843eabbb3efcedd88c89468ccee43be9022e23880d7901f16
mutant M1-supporting 1 0 10581fdab579db4d63322eee3369a1a740266e00a7dcbaa95e7651a7e0447ab8
mutant M2-force-push 1 0 b137e8362ae3e26a090a82e8c41c3e87beeaac43183cdd6db67aba55d5e372c9
mutant M3-forged-token 1 0 bda603c18b7b2bf468a21e139f0cff0c15c22e19c9d41cf8c50f9c3ae0bd128d
mutant M4-grant-before-push 1 0 a642ef8e57a98c1488bb787da241292e6ed5446ca4117940fb0ddb9800c6a105
mutant M5-notice-after-publication 1 0 5645138c2cef5d1999948744783ff3904a78e9cefd7421674386a2d0c5fdc45a
mutant M6-commit-schema 1 0 7201f53cb976b2db1994c4e25f7f6e8b58eea323c060dbddbfa0372464adb686
1 kind name rc restored_rc log_sha256
2 whole-file packages/library/tests/write.test.mjs 0 e0f6a09b70316beebbf33966b35bfd05b4a12b587744dadc9239bd28de1b976c
3 whole-file packages/bus/tests/library-write.test.mjs 0 e0e9e609b20ea0564a7611046026cbdfd007832e0eb13507798e958d8d106ef0
4 whole-file packages/harness/tests/library-write-tools.test.mjs 0 c8a3a493d1d2abce785e94fdda5b1732e8d4a5e6eb19767af1b7e8b5e560cf3b
5 whole-file packages/webui/tests/library-write-options.test.mjs 0 2491eb6a01a0b4b2127bcb6a87a5dc778d079b7d1ea445509a1dffc49dea9051
6 whole-file packages/bus/tests/access-revoke.test.mjs 0 a1b317bb687e8c369440f5481b4ef309615afb5a5922fa306980d2024019e544
7 whole-file packages/bus/tests/account-migration.test.mjs 0 e697b58a1bb9b37c609b441fe786e557c7f0279e7a31eea791483ce4567db318
8 whole-file packages/bus/tests/address.test.mjs 0 977f755d29a8e75578d0bef48ec40b7045736014b2e53e15a03cdb6dd39696d8
9 whole-file packages/bus/tests/agents.test.mjs 0 3e8116bad1ab5594e627ba3e9f5403414885959935bcd9e6f75f1af4c625d4b0
10 whole-file packages/bus/tests/approval-binding.test.mjs 0 d2fbee516b57857f3a6562427d2a08bd7fdb772aacabd33ebd9d2990f01ec7fa
11 whole-file packages/bus/tests/broker.test.mjs 0 400e7f0616bc7432d8cb2a9efbae3c84d5b44ef59ce7f8fbebd4c802e2a9f44e
12 whole-file packages/bus/tests/business.test.mjs 0 f42502884a158ed1d190b37b3884e19d44547ececf068f91765b8ad15faffba3
13 whole-file packages/bus/tests/channel-proof.test.mjs 0 3984a7e2da2a60e60d0309f719a45a3ef04bca767bac34e00a760e19e941d732
14 whole-file packages/bus/tests/chief-of-staff.test.mjs 0 8dd57acf0101d4c92ada92f4c33f68061d4e2cb430179a8ab99a0b7fc9a19997
15 whole-file packages/bus/tests/citation-availability.test.mjs 0 d34d84d44b5949024ce6b32708c68e10b00a84600bb03598bf9538b358750455
16 whole-file packages/bus/tests/citation-guard.test.mjs 0 acab66e65fd41f1fbfd9524f80456553fc033d8bfc18a9bec7a813bd0d4552d8
17 whole-file packages/bus/tests/citation-runtime.test.mjs 0 ce33310d333c7a0af7451c3a3b610f5178961b80b6b63a839909b67657fd161e
18 whole-file packages/bus/tests/comment-cursors.test.mjs 0 cd4de90a070faf2bdb776a96a6ba43aa4854f6f5f1b2b7459740bd7bdc0ffb7e
19 whole-file packages/bus/tests/comment-migration.test.mjs 0 773659855873805b5bd950101d950945213658fde42d8012211e742ba9ddcc09
20 whole-file packages/bus/tests/console-decide.test.mjs 0 275fc0a24a03f2f27210a65e2bd21ce615ec9b6b400c4e4177ddb97a9e8e85be
21 whole-file packages/bus/tests/creative.test.mjs 0 eb950d5680ff7e4e09a9c11b1c169d4a740011ea72bb75921d35571ef5373df2
22 whole-file packages/bus/tests/credential-claim.test.mjs 0 b2d40e4d2a353f4154af4974d5779f7b20c652a8110da3183f95959ae2540941
23 whole-file packages/bus/tests/credential-status.test.mjs 0 ed367e3d123c9629b7d3d22f6fa60f48c74e71b36982c54ad2b3e8419f515431
24 whole-file packages/bus/tests/credential-store.test.mjs 0 0fd528ba27757393973cba5b21da573bc681659416962bf7d3a3dff3018414af
25 whole-file packages/bus/tests/credential-verbs.test.mjs 0 154b123af420abf08c6ab8b7bc6439052e7ab65c772abb0caac5e9b9cd3608e9
26 whole-file packages/bus/tests/credentials.test.mjs 0 6474b45c076f474a6881d0dddd0cd3b4cd385d52ac4c55ef1a9f8c10e0028277
27 whole-file packages/bus/tests/csuite-messaging.test.mjs 0 c0229df65240be8ad014d83def48dbd64a952b701f46e40ff01efdebb5644d6a
28 whole-file packages/bus/tests/daily-quota-runtime.test.mjs 0 62d686aa1852088af569cd3b921194db6873311f2ba04e55b15a93900b1615cd
29 whole-file packages/bus/tests/decision-close.test.mjs 0 9599744860a4e6e330ce50b8e93c478546edce5545a9171bed068743a266ae5c
30 whole-file packages/bus/tests/decision-route.test.mjs 0 2b2a9570dab83b1d454f56c1311cb41103a14bcff49e207cbb4ac5d4c73d6f0f
31 whole-file packages/bus/tests/decisions.test.mjs 0 a753df7d939155adf13c7177926728b2760cf61770117dd1655f29fe2c88a26f
32 whole-file packages/bus/tests/end-launch.test.mjs 0 ff7a27c35e35be424cbefa799e219ffc073c494214642b4ce56ceed6b359335e
33 whole-file packages/bus/tests/fire-revokes-grants.test.mjs 0 8e6bee9421480af8a1326d65903f258d5ea0a79df6188bf18301f32a5260547e
34 whole-file packages/bus/tests/gitea-grant-docker.test.mjs 0 8b639ee86d1a7d2ef267e1d36264f4ce1b5beed2c8ce084c39c0de1d699ca8a0
35 whole-file packages/bus/tests/gitea-grant.test.mjs 0 8fa39b3e58cfac4ec97f02ff876fde1a40a1894c826306c0b77d45c73586f753
36 whole-file packages/bus/tests/gitea-migration.test.mjs 0 689fb43a38718f5f5d00ffb3b6d998d5d454854d5e77a936b56d7c4192ee12e9
37 whole-file packages/bus/tests/grant-enroll.test.mjs 0 a8be59931d37a5c787c2087d29d766d6b701bbe34f8343134148292cd29d345c
38 whole-file packages/bus/tests/grant-executor.test.mjs 0 0a7f5be29b28140c9f8e7f67c6a897eb455677fba4459952a83982f2b23c87e0
39 whole-file packages/bus/tests/grant-host.test.mjs 0 54c4ed722116914221e9320fd41723e32aad59284e98d8e177130b0f4c4fe6c4
40 whole-file packages/bus/tests/grant-migration.test.mjs 0 7cfaa3f24d1dc070d7bdb8de76b08fabcdb6877d3367c59f7601e08f683d658b
41 whole-file packages/bus/tests/grant-scope-runtime.test.mjs 0 f8bccf5324f1e10282dfb4f4fd0f63c76c8e9481ae6cc0845a1d9028e3d9633e
42 whole-file packages/bus/tests/grant-scope.test.mjs 0 e30a8ced066ad214a6f70dd4a39c75bacf296032a3201e4605fa3c8df23e0159
43 whole-file packages/bus/tests/hard-waits.test.mjs 0 78d92a14781286d3ca11989786a8698a2b796ad1db78769fd5b3c7653ad7639e
44 whole-file packages/bus/tests/host-run.test.mjs 0 51d231611940444d2c2a37fbb7b14267c705c1b5e453b02367d0a6def214dc93
45 whole-file packages/bus/tests/host-tools.test.mjs 0 3bc5b5413661edd2026bca1721055ec7dce8d115918cc10c8f334e527176d23b
46 whole-file packages/bus/tests/human.test.mjs 0 5c8f3fd402ae4e130029b3203ed41b3cb45b8781417d31dec1f47ebddd516349
47 whole-file packages/bus/tests/instances-verb.test.mjs 0 940ca3884930f539272a2c39ca7e1c7fa3e51b3a4ea6fdcfb21719c652152257
48 whole-file packages/bus/tests/interpreter.test.mjs 0 d0c6190a428005b7750b59e665968657b242b322af05ca7bdd4cd7e815b7f4ab
49 whole-file packages/bus/tests/land.test.mjs 0 e9ecd1d8011ab6789fc3254bb069e76631b68b20ad65ae844ee12e0dc3b97cb0
50 whole-file packages/bus/tests/launch-notice.test.mjs 0 750a54d4c40559c7fb5414071bace8056d6bfa71dfdbec4de12c94c90299c3c5
51 whole-file packages/bus/tests/launcher-released.test.mjs 0 4d59486ca3077a4b2f51141ab79df635feb6b7bca2d6c0cfe5839a6a93715de6
52 whole-file packages/bus/tests/library-credential.test.mjs 0 db7e2dc4afe23f74c49795e4dcd3d28414435519029a837641cbb35bd3f4fcef
53 whole-file packages/bus/tests/library-lookups.test.mjs 0 fa18b5d4c829ec35ebbf519c4346a2ac38cff7538d58ea663acbbdd7930a6015
54 whole-file packages/bus/tests/library-sync.test.mjs 0 ee0ab1ad2549d3e6ae6d8123fa99d697d9be6c629e09131da82f0ab6d58a60e2
55 whole-file packages/bus/tests/library.test.mjs 0 62b663034a5de8d6d1abfaf3f94327d7aae435e3350874b424eefdb28bca1bd1
56 whole-file packages/bus/tests/lifecycle-revoke.test.mjs 0 c0810c743b5108773b6cfbc2d108fa09ea274c437433355277ce2b1295fbf692
57 whole-file packages/bus/tests/lifecycle-verbs.test.mjs 0 926bcfb20ab58a4ecbe85b4f8feb915f72adcdc6d6aee84f814187d0ac998efd
58 whole-file packages/bus/tests/limit-checks.test.mjs 0 919d745dc570172716b1e06d0ea1e8f16ae7b05dbadba77fe92dbbcc8eb4cba7
59 whole-file packages/bus/tests/limit-stop.test.mjs 0 2fc1ebee4e4d4862a100ed9ba97ace1e6d3fb3c608abea63b1ff634a04d5649a
60 whole-file packages/bus/tests/limits-runtime.test.mjs 0 5845176b73f98a499d92096ce0d22a3987ada664a529bdbb26230c2d00b9e65c
61 whole-file packages/bus/tests/limits.test.mjs 0 333f6757d9d00eda74e7d4641af660c9a0ce3d978e6a8550139d3a461c1d5866
62 whole-file packages/bus/tests/message-citation.test.mjs 0 38422c1d6faf076c750c3fccb7e927e38fe955cc28778511acccf5704df5b191
63 whole-file packages/bus/tests/message-filter.test.mjs 0 2ba52728df27756ac19ba65fe0705e7cf7a2a786a3b4df77a4eb4eec8072604c
64 whole-file packages/bus/tests/messages.test.mjs 0 b87de4ab04682d59a2faa7b3fc64751247454e628e9c1ebd4c07b1df2acbf11c
65 whole-file packages/bus/tests/messaging.test.mjs 0 831b48a9de594e17e8fc47f16ab8c2d722e8d57068a7d39deeaf4c0fa8d136bb
66 whole-file packages/bus/tests/model-proxy.test.mjs 0 99c5128733ae5bb16489171513c158ec1e34dfce1d07c60f6bccb0f84ab7afb9
67 whole-file packages/bus/tests/name-migration.test.mjs 0 bb8f92a17f6a022c7ec63161cccc0bb49a26c2a591fc369375cbebfa93a277a2
68 whole-file packages/bus/tests/names.test.mjs 0 0fcf60cc8c7dee3e85548c759f03e1792de92b59131bb9fe4282a3b07859366c
69 whole-file packages/bus/tests/peer-transport.test.mjs 0 3cb547003e50695ec2a25c950819b304f15203302281c00758a12c9b89b60f40
70 whole-file packages/bus/tests/peercred.test.mjs 0 e75c700a68ba0c1013c8f36178d6554f0321dc331b2198fd5ffc1a684df76c3e
71 whole-file packages/bus/tests/plugins-verb.test.mjs 0 359fef350befd1d743bcca89a96ebd0757346fd7c0622ba364039ba827620d26
72 whole-file packages/bus/tests/principal.test.mjs 0 732724e6bb2bb953e7dbbbae5c23cc0a1c33a7b7b202f5cb8b46be9363bcb392
73 whole-file packages/bus/tests/process.test.mjs 0 9c5883ea2ca858131317fa9be66d2a51a5d86dbe03c515b0544f4db56b2456a1
74 whole-file packages/bus/tests/processing-runtime.test.mjs 0 bb6b94ac654d069abd6e484031893e649e239d933c135b226d1cb2fbd5a94ca9
75 whole-file packages/bus/tests/processing-timeout.test.mjs 0 323036aa7f32f7aa324f61595531a29f3d5ef0ae2c24aec029842f2783d6be76
76 whole-file packages/bus/tests/processing-web.test.mjs 0 dbd1543498fbc8d0625990436ae668b3a382eedeecd098b929c13d2bb61939ff
77 whole-file packages/bus/tests/processing.test.mjs 0 529ec93e767444970ff03acb1ba719b45033daac239256c9cbd587c39f926a71
78 whole-file packages/bus/tests/project-await.test.mjs 0 e948d721ef06ce95f909880942f7e7ebd73b2f42563e1faedacc7b403b8ebedf
79 whole-file packages/bus/tests/project-files.test.mjs 0 3691b04705c17d4ef7218bc15771560aca5586c00ba0fd3fdf2a80f63d8dc659
80 whole-file packages/bus/tests/project-runtime.test.mjs 0 9d8d6cedeb2044f19e548dda0e32cae1e997b75a6d89072f7367b6e0ce17a44f
81 whole-file packages/bus/tests/publish.test.mjs 0 87f7a382580432646ca89d1228377719cb177bfdbb4f74ad617f6a70dbfb4b33
82 whole-file packages/bus/tests/reload.test.mjs 0 25aa45aca6ba24d72e9e5ad66dfc8c049375c8df121dd748dde09af52f16f853
83 whole-file packages/bus/tests/replies.test.mjs 0 0f05dc2194896540a1488310107e31b7e779cc02c381c201d0c95f69ab39fc51
84 whole-file packages/bus/tests/requirements.test.mjs 0 29569dc30659dbecf359117cc9a59ff37927c60f5514b8ceb8d3796c2c3e53d1
85 whole-file packages/bus/tests/review.test.mjs 0 a8daea8602be9429a8044ad636a438c18eee8ec77b6fa272dce606116d01de8c
86 whole-file packages/bus/tests/revoke-window.test.mjs 0 1435c543c9367204f4ae6d25c2cb97145e762cb18e78ea90a15eb1672a220353
87 whole-file packages/bus/tests/room-check.test.mjs 0 bbe5ac7abfb7e1b30f6fc8f9a247cd28aca82a8783753434339b790dd9857e1c
88 whole-file packages/bus/tests/rooms.test.mjs 0 506fad116ab1d9bb2520fe691adc91ca26e64faa96ced35c193cb11da4e07ccb
89 whole-file packages/bus/tests/routes-verb.test.mjs 0 c09fef3cb022bf7713cde4e1c512feefe67090eff05451fda9f55272140c916e
90 whole-file packages/bus/tests/schema.test.mjs 0 2a1a668dc408aaebe6f604ec5c3b8858211edc52930e1a552173cecedf806d72
91 whole-file packages/bus/tests/session-clear.test.mjs 0 1fce03f1d2a41f5ba294e9d406980a1d3251bc9a5dd4a02897413d6be3d9681c
92 whole-file packages/bus/tests/session-compactions.test.mjs 0 745510273a9eaaf61de4c6453c5dcc70e4a6020c0bcec69673621eefa593dab7
93 whole-file packages/bus/tests/sessions.test.mjs 0 d6c0337e0981ecb9aae2e912c27145bbd831e196828b2d59029666ceae5f605c
94 whole-file packages/bus/tests/single-use.test.mjs 0 6f5cf7d47716ce94eccb069f9b7e5625c3587737921231649fc74e8bfd3aad3c
95 whole-file packages/bus/tests/spec-migration.test.mjs 0 ede4ca62a772261bc868f4dfcb4861c9c3670110ba2afd39cc44183398c2eafd
96 whole-file packages/bus/tests/spec-review.test.mjs 0 951aa2a54cfe4bf0960dd3d2180874cb8183ff9b0aee7b7251b05df11385e1a5
97 whole-file packages/bus/tests/spec-socket.test.mjs 0 65735a2557e19b3d63a3ce7198c80fb5059f1974acd0708a89f192857b43b095
98 whole-file packages/bus/tests/spec.test.mjs 0 488ab443b41b06b6ae4434f5b2ee8904169aa08ab3527f3ae4c3f438e54f9909
99 whole-file packages/bus/tests/staff-request.test.mjs 0 edeb4ceffae3af33e330e1fac5d74c4fb1861d52ec5ac5005689791ab74da555
100 whole-file packages/bus/tests/state.test.mjs 0 3b5f916c494563fc7c18f89450e0cecbbdad8e24680b373e897253b9ea6064fe
101 whole-file packages/bus/tests/store.test.mjs 0 39d0a4033b89eff9b29ea6dcf6e56696a1d20a41e0e14b4bc8efbfae7962ecf4
102 whole-file packages/bus/tests/task-page.test.mjs 0 6446cfc1a43cb4206b4130f316251d3d9a820f929a6efc59dc74e7cbe1fbd258
103 whole-file packages/bus/tests/task-read.test.mjs 0 37134ced43ad5ada4291ad5e3474dcf7063892443b06d54a7456cd4cddb9cf2f
104 whole-file packages/bus/tests/tasks.test.mjs 0 9d91ee510a7447545c2cf93ae6779544a05e01bb70346e595b91a4800fa42d7b
105 whole-file packages/bus/tests/tester-threads.test.mjs 0 ff843610e02f20c5e1ab19de27b131ae7cbc3fd87b16d85e68336b5e914ffd77
106 whole-file packages/bus/tests/tester-writes.test.mjs 0 517c41e666d2c59b7ffb6ddb22898ef58b816bb26eaa47e1ce7508087b607df5
107 whole-file packages/bus/tests/tester.test.mjs 0 19eff6ddb3aca05ad5c006ac15e7860311f56941055850e86b8075cd39eff0d1
108 whole-file packages/bus/tests/thread-claims.test.mjs 0 ee146e984bb3ae82ad60f90c83035053ff2966ffea91015b6c3c4f93b7e019bd
109 whole-file packages/bus/tests/thread-migration.test.mjs 0 1dc2ae4e920d40a6fc2b1033f43ac0a2f766bfb86f07a596a983b9c1bccf87d5
110 whole-file packages/bus/tests/thread-shares.test.mjs 0 3f99a82e9e4a43fa788ebb231c5e712969809fa83b6ca66f04b8cad13f411235
111 whole-file packages/bus/tests/threads.test.mjs 0 2e5ba2be69a34c71f41a819c7a5e8615fcd085f847f9aa6d16095b9c8d742552
112 whole-file packages/bus/tests/transport.test.mjs 0 c9d28b9acfc0c2213838df0d960506156ef6fffec24a0cee7336324f105fac0e
113 whole-file packages/bus/tests/usage-broker.test.mjs 0 26fc080c6ffcb7c64cca39a07f302b59c21d1425ca3c90120eb3d3bb751c49da
114 whole-file packages/bus/tests/usage-migration.test.mjs 0 cfc65c4233aedb325293170e782ccb83fcfdd85cc4afed1e913e91785fa4b7cf
115 whole-file packages/bus/tests/usage-runtime.test.mjs 0 faa5fce30cbd7002137acfca3cde68b49b74321fb27b8a190736b35601430866
116 whole-file packages/bus/tests/usage.test.mjs 0 d36d21e0b3f5c9621b50e8b71ff6d8daa341f5954f3612b7cc93cb6c734215c0
117 whole-file packages/bus/tests/user-principal.test.mjs 0 1b56d881de2975ec4e3bc27fa15bc495ae0600709457da579337f0c9c98651e5
118 whole-file packages/bus/tests/viewer.test.mjs 0 942ba4fd96c3bb4c527eb129e69ddb5cb7660915e8458cfee47661d268db0e24
119 whole-file packages/bus/tests/web.test.mjs 0 048e3ef2840934f95d7e00de6502b19342215cfe5d00d1b8ada7c1bc6e87cfa1
120 whole-file packages/bus/tests/workflow-roles.test.mjs 0 1bed1351ec3c50ddce65f9b8108f93a5c4061ef5cf36f3d09706d85b13e085ed
121 whole-file packages/business/tests/case1-business-file.test.mjs 0 4481abbce73eae119fbedc5edf65120fa494931913aac6f0273b04263c251cc9
122 whole-file packages/business/tests/launch-settings.test.mjs 0 540f5170ddc7e79a8abd9584c4586eade3ecc1f7544489060db99552c75e4685
123 whole-file packages/cli/tests/access-boot.test.mjs 0 e41e1f1949d3568f8845234d573282c18a185578389d6947140cf540d7f99dc8
124 whole-file packages/cli/tests/access.test.mjs 0 9e2a813092ad4b60cd89443424eb4142f217265e52ff7b769b7f16d247d5a367
125 whole-file packages/cli/tests/app.test.mjs 0 5f5244ba0061dc4ffd1565c4abd3168d7cb2e6398625b69c841a54544b9a35a7
126 whole-file packages/cli/tests/boot-status.test.mjs 0 ca090577e20ea46315cb377668e309571380e2323c867a8b90d0537022e681b7
127 whole-file packages/cli/tests/case1-hostcheck.test.mjs 0 403e1127da5637904e8fe1c1eed5a7865c5bd5ee1c5d0fe684837a7370c41de4
128 whole-file packages/cli/tests/case2-install.test.mjs 0 df8edefe13297ced929d09f01eec5c7ecf38c355d9871368cb19f2f392ae057a
129 whole-file packages/cli/tests/case2-persona-import.test.mjs 0 5dc7a93c03567ec0e85e43bcafe07109881c30b2e83b4c4eab4631a155daece0
130 whole-file packages/cli/tests/case2-unit.test.mjs 0 39b349dfd3125e74b780ce28e9ec24465a6a8c2bb9e431c819864f4eff1fdb77
131 whole-file packages/cli/tests/channel-cli.test.mjs 0 9fd9c30aa604f77b7a069912cb987293af36f2f138cce850f8d26946f5ce42cd
132 whole-file packages/cli/tests/channel-recovery.test.mjs 0 52c6bd980cd54ef22b9e6c78260a1e389e8177526340129ac64fbafa7f2e01ab
133 whole-file packages/cli/tests/cli.test.mjs 0 59327fd89e3fb8f927210df6a2c62afe4522e59f59129b1967be2a238c498f26
134 whole-file packages/cli/tests/compactions-launch.test.mjs 0 c9006b3039a6616be1816f5ce85bf68ba4fb54dadf10447e52fc92f7ed57bbe5
135 whole-file packages/cli/tests/config.test.mjs 0 35e39fb0551e23f5738d0c30d66bd233f2290040885c511e526f0f0468b31cad
136 whole-file packages/cli/tests/credentials.test.mjs 0 2b55cde2318a034ec4152e712863ac54f07f1b4db752c6282507d7f621bde67d
137 whole-file packages/cli/tests/federation-acceptance.test.mjs 0 cca971a93a5dfd20e603b45cc2158b58ea0638e8bb7a33e6e0c5e12178ffa3df
138 whole-file packages/cli/tests/follow.test.mjs 0 26a3ad0dbc124aff48a5f4908e3d8b78cb871e5560c0e389de457f58aea2dfe3
139 whole-file packages/cli/tests/git-socket.test.mjs 0 10c21c34a79ebd5f89f6ed9182a492e9f42f0512a68f758c0566a763a84abeb9
140 whole-file packages/cli/tests/grants-scope.test.mjs 0 37967ca8e82a89a0e88ed872fa562b5c094282cc759853b6dc31c292204bef3c
141 whole-file packages/cli/tests/grants.test.mjs 0 687af745932625ea1d439a8139c760f14b4a327bf9b15c5b5b1cdbc7ea6be09f
142 whole-file packages/cli/tests/host.test.mjs 0 50010e97e44392f28006bbd4127146b8aa1712ff4a016ca10864923701213dce
143 whole-file packages/cli/tests/hosts.test.mjs 0 d5d507c3968c45b2aa25067d6bbb1eedd69785c0aa1bb51177c63b6ad64fcb53
144 whole-file packages/cli/tests/idle-stop-race.test.mjs 0 8e6171855003b0f40921863430dc89cf20f8bbf14a9ce3c115f90486f08232b5
145 whole-file packages/cli/tests/instances.test.mjs 0 c6b4d59443baa4af029af76a846a8093669a7593490f21408a2c40ad027acccf
146 whole-file packages/cli/tests/launch-account.test.mjs 0 6cb63446fc8dbb6217e6d925caabb37a28bcf1ea5c27cf8d515d67c7842553b8
147 whole-file packages/cli/tests/launch-limit-checks.test.mjs 0 fae971d715a90d1dbbeb3c054932a02d253e0a0d036d3b0db4e0c9edcd5ad7ef
148 whole-file packages/cli/tests/launch-limits.test.mjs 0 d3f4b2c57e776bf6bbcafba6dbd9c4728918b0d81fc606dcd7d2dffefdad4001
149 whole-file packages/cli/tests/launch-routes.test.mjs 0 e2bec020f96238079908c03537366c64800de0913a83f3a2877606d0266548d6
150 whole-file packages/cli/tests/launcher.test.mjs 0 beafda99d34a532f3a1d6f96565b7a780e03924939b6c30b01a8169cceaa792a
151 whole-file packages/cli/tests/lifecycle.test.mjs 0 014a2cea6d3f2a9f21f7fc16dc68b34740b03726612851047b877f8c1194ebe0
152 whole-file packages/cli/tests/limits-tokens.test.mjs 0 6fdf9e6946dfb579cde42ec500d8cb8473a9d8318f43caecee7561a5e40fdec1
153 whole-file packages/cli/tests/limits.test.mjs 0 bc2f13959d087ccaf6977c4cf1294e6fcee21f968677ab169580ce79643add18
154 whole-file packages/cli/tests/mark-read.test.mjs 0 64864c54ab910488d55136b88f351771489cf744ba1c21e5c479121694dd88ab
155 whole-file packages/cli/tests/model-proxy.test.mjs 0 119a5d02870a4062992efba7f44ee9dfe69ecf8a7076f121aa24a8c7edf24cf0
156 whole-file packages/cli/tests/names.test.mjs 0 c2160aeb0c68855f59b5d97dc3b6101b7800028df708f5f42430ae5854eb23e2
157 whole-file packages/cli/tests/notifier.test.mjs 0 18e62f48de18cc4d57916a556adeb3befb13921d5d7b036ef5a7f2bfa460cdc1
158 whole-file packages/cli/tests/optional-tracker.test.mjs 0 e5adddfee06b2f1cbd2ec50caf84b5acbc58d4ff4ec4c1bc539a4535a3991827
159 whole-file packages/cli/tests/other-tree.test.mjs 0 2dae57af2b8d508f2792ce37191aebf0cd28ad75f7621d4ab9f8d6daa60b748f
160 whole-file packages/cli/tests/processing-cli.test.mjs 0 44b2854ba03810cdda3ccf0c6de883f953089d532bfcdc8f4bdd3faffac80fe9
161 whole-file packages/cli/tests/project-name-repo.test.mjs 0 0468b9ecde6189d1398eef2e7e8043e870aa867a8a9d22b20b2ded26dc1543b5
162 whole-file packages/cli/tests/project.test.mjs 0 79e648106151ca220d9535b16c416dfdcffffaed41e3c211e4325c151f0775f7
163 whole-file packages/cli/tests/publish-socket.test.mjs 0 59a02b1fcc284407b06d0d2df8e6e1e5323059daa2e47c690f30a718d1e7c682
164 whole-file packages/cli/tests/reply-limits.test.mjs 0 554a353d61891c3cbe8da01062025dcb0756ba4f4e7ab3fb8d7b56ceccf64437
165 whole-file packages/cli/tests/revoke-window.test.mjs 0 743fdb0135e507dea5b968265907e5ac9228284b130feb0057d91e70ad561c02
166 whole-file packages/cli/tests/session-clear.test.mjs 0 5abbd894dee9cfcb3464a40e5045f9062402d5ffe567972113715cc9e24c6ce3
167 whole-file packages/cli/tests/session-cli.test.mjs 0 c469aed70c1ae408e176189f23a849f3acf0bfc7dc3ba1132c101a931359a462
168 whole-file packages/cli/tests/session-launch.test.mjs 0 cde78f9dcee9afa243692fb0493697104425b61589bd7be6c4cbdb0f4bfbd5e5
169 whole-file packages/cli/tests/stack-copy.test.mjs 0 3b92b3772c060378cd2ec0c1bf7fe6662721721a11d99d83c9debe3e3aa929c2
170 whole-file packages/cli/tests/stack-instances.test.mjs 0 2839e390f564a6e58cd514ce4061ec0b741ed07b4e2b755a337439737601d97e
171 whole-file packages/cli/tests/tester-http.test.mjs 0 bd9c598c84dd0be3b9873176c63e418ccc004265153be68e0cbe51c40b1ff91f
172 whole-file packages/cli/tests/tester-reads.test.mjs 0 50a71ffd9093c4d51d8ad07bc9edbbd76306922f290d28194d656cd78f8528c5
173 whole-file packages/cli/tests/tester-threads.test.mjs 0 cd3dd0020472c269d61934ddb32d77f6dc297090d63e819288f4038fe9edf096
174 whole-file packages/cli/tests/tester.test.mjs 0 437498258b4ea5c2f2bfa8fe66114106ac10944911bd40bca944f2078b34e45f
175 whole-file packages/cli/tests/thread-cli.test.mjs 0 c29897119f279434bec0248c12beb5ce97f6214b8b0bec995061000f047b1600
176 whole-file packages/cli/tests/thread-launch.test.mjs 0 459ef35e2b4f9cb87151577f252282a716ddbd4985f26e9e26c01b08af13a7f2
177 whole-file packages/cli/tests/thread-revoke.test.mjs 0 b8a72080a9624ce4bbc1b23b8903be1b74a8a6ced35b0b60f503d92a22d1028c
178 whole-file packages/cli/tests/trackers-boot.test.mjs 0 f83d72dac4eec7369d62b495745e1fdeeb4ff1ba2e1efb376c9b583da1765a1d
179 whole-file packages/cli/tests/transport.test.mjs 0 e0ae6c26b5669d4b955deffe941a3c4314be12297e72d6c099de750170688d9c
180 whole-file packages/cli/tests/usage.test.mjs 0 639ebccda23e0e094d62cb0e7e5c80c403b74b284ac5189fb0d92e63387c92f8
181 whole-file packages/cli/tests/verbs.test.mjs 0 43eefd242a987efe42d145d7863372a2b0a397031baec12ecd4c9e0644daff12
182 whole-file packages/harness/tests/bundle.test.mjs 0 75fd5a9a6fa0b46078952ce216348e39ce481f6fc00b89f85da9ff729d5ba100
183 whole-file packages/harness/tests/citation-runner.test.mjs 0 933021f114882a6c58f4071446a07d49ebc9f99c062ffe1fedc1f13b799db389
184 whole-file packages/harness/tests/claude-gate.test.mjs 0 f66053597c8209c5175810e33d8b878ad74eb314f4057f5b4b0b1ac625272329
185 whole-file packages/harness/tests/claude-session.test.mjs 0 9c4d8ffc00efd0da75d143bca1cd33f30f3e762e20086270d941170e80c962ed
186 whole-file packages/harness/tests/creative.test.mjs 0 3433184ced3427613d645807f0757896baf52d214c3dd6a4a12c3951bbdc50ce
187 whole-file packages/harness/tests/gate.test.mjs 0 991670779d9cf6f733d0060c6f1a59d122ab8e99f7e0a5f7183c9e974f1b1aaf
188 whole-file packages/harness/tests/git-tools.test.mjs 0 2837565ec16cd8c4d032311675a1468bc4bc756ee0696d0e57ea35ffd56eea44
189 whole-file packages/harness/tests/library-tools.test.mjs 0 05a8a5d8e8c4e7b3435d4a9b3f6292816356a99f7156ded2ef7873e1c84f8de7
190 whole-file packages/harness/tests/mcp-server.test.mjs 0 6ce4c6c39b8a1ed70fbeaca410781a62d69a6412333e03640296048b799a09b9
191 whole-file packages/harness/tests/pi-session.test.mjs 0 570376f798b43e82bbc1972f1d50d3915e94a8e4ca00e50076ab390df9830d7d
192 whole-file packages/harness/tests/raise-domain.test.mjs 0 aa6be675614d9324c3ddc01ef40347b235adbccfe6cd73081096ae9e9742d754
193 whole-file packages/harness/tests/runner.test.mjs 0 d3f8c752897e359e10a8e9d507c10ef3760a5ae37999f6f143cb222c42568437
194 whole-file packages/harness/tests/skills.test.mjs 0 2f34800387f4d7f8b8d5f6758cd197f77d11034011bf7f4f79f4d74c582e3f0f
195 whole-file packages/harness/tests/spec-tools.test.mjs 0 29cd1f7094266963a995f636d9575337246a9868d42a48f02231a99251261f47
196 whole-file packages/harness/tests/tools.test.mjs 0 f27638f1fa38fd2d15a352f6c21f7980688d48d580f5a59dab1520fd7c30b30c
197 whole-file packages/library/tests/guard.test.mjs 0 6529c2b48c252eeaf9c19487507a03cf46d952e7ffb3a41e640a54590e312df0
198 whole-file packages/library/tests/index-build.test.mjs 0 4747cb8c842cdc424db727cb3b0e36a6d35f4e9c5c31c1a3bf61314897c2cf6d
199 whole-file packages/library/tests/links.test.mjs 0 9b89f9275f19035c5f079b6920b248466048626c634153eba2fec165f9f6388f
200 whole-file packages/library/tests/mapping.test.mjs 0 9110b98f955dd71588357858b913194ccf9e04dca9aa7c4559600cbe9b9e8e71
201 whole-file packages/library/tests/mirror.test.mjs 0 cc2326da9796dbbbf5b3faa121180a7f00c43816a232a96faece7b58570f1227
202 whole-file packages/library/tests/query.test.mjs 0 f1209bc132a63cba9a7312cbed7e3098126e05c792356648f1d9ec497a11aa82
203 whole-file packages/library/tests/reader.test.mjs 0 3e17f34697ae65524cf7908dcc9ca1b24025bbc92989b2ba05f6e75c0f839c3b
204 whole-file packages/library/tests/render.test.mjs 0 5e68091a309a07e5502b9cc500c7cdfabaa9e246bb77b0c04a0dd86bb9bfcde1
205 whole-file packages/library/tests/scope.test.mjs 0 f55dec854adcd311d614b66959c5655cb3419d7ae7b06fe1f648b43cdecef32e
206 whole-file packages/library/tests/supporting.test.mjs 0 2f50bbe9c942360a5becf5bb984ed5aedb12628d4578ea85c6e433ad0ad73130
207 whole-file packages/library/tests/survey.test.mjs 0 72108eb8a07b990b93ca62c5fa4b55f1f89f3254ca1cf59d3de8ad194dcc3a0d
208 whole-file packages/library/tests/sync.test.mjs 0 a68c69492149b6e9dc7dbf24fc434ebfd3243b2db2c7654b00107b997e99ead0
209 whole-file packages/plugins/tests/harness-compactions.test.mjs 0 9eb9f67c06ae17b33198fbcdb443a0c73ca9cc0cd157cae2359a0647d2db3658
210 whole-file packages/processing-control/tests/task.test.mjs 0 8db6adda6b5d5f7437e9e4cdf961134493409d7227fde02c0b0a76aeb21186f0
211 whole-file packages/seat/tests/compactions-budget.test.mjs 0 1849994f45bfcccfb4ce18915887c740947a98041aa7bd66590ae7a62fa7078e
212 whole-file packages/seat/tests/compactions-ledger.test.mjs 0 af689c631c9d62dee11f4400112fd10df82567c1f49d9f0d423b9d19d6f860d7
213 whole-file packages/seat/tests/compactions.test.mjs 0 cf5e74e1211560ca47a2c13e8002635097f486e2ca06698795bc38263d889f3c
214 whole-file packages/seat/tests/sandbox.test.mjs 0 c09d89b8e1b22db25578f62cd4a1d3b9f441d652178fb675800efb31de33a577
215 whole-file packages/seat/tests/session.test.mjs 0 82171646932cddfc68f0e90ca3355f9595d32c5d228c1fdb855c06cb1d9c2feb
216 whole-file packages/tasks/tests/adapter.test.mjs 0 8843067c21942ae6165a7feaced2382fd9d02d0c62bd30772191393cb5d962b8
217 whole-file packages/tasks/tests/comment-restart.test.mjs 0 25aa6e953cf19ed3ae368581035b9d883ed924b41d593240e2b4ab5ba39f2982
218 whole-file packages/tasks/tests/fields.test.mjs 0 e4eafd6b17a46262dddc548263da993bc3a672adca1cadcc698b6d8374f11e2d
219 whole-file packages/tasks/tests/processing.test.mjs 0 0b89866cc076c43c37534dba926d492d8d334d08a6886325e3d4ac6ddbc88897
220 whole-file packages/tasks/tests/shapes.test.mjs 0 0b8cc660a07e048d007993d726ae5b8e1f343cb571c18ee0284c3ba0c4b41602
221 whole-file packages/tasks/tests/startup.test.mjs 0 5b44d779ab4ec86922dd35ce7c78096de02c0a0f2363cc6c2a5ee07816efc2ad
222 whole-file packages/tasks/tests/sync.test.mjs 0 513ce9f6e64a3fa0179f8cc9b27db671267a43cdc44ab93f38d21982dd2b9631
223 whole-file packages/tasks/tests/tree.test.mjs 0 d3c8f91f59150259b3226e9306c98efbaf2aa17b5b74cb9b376a103620f8aefe
224 whole-file packages/tasks/tests/verbs.test.mjs 0 47b075d01ef38a5d0228902a6f9bcfec0b78b1a958cd071e8114139af73bca53
225 whole-file packages/webui/tests/agents-browser.test.mjs 0 d3ae822399f58d2c4dfd90e054811a60663a66f9d3fbe69a76aa4ce7dc7260d0
226 whole-file packages/webui/tests/agents.test.mjs 0 be18c8fed41173900617d3b646fac1ce14c07c208e7f24d6567f61f55c5c4dc2
227 whole-file packages/webui/tests/assistant.test.mjs 0 056e4c2a37b7b395741ed1ba33546031a6e4ca53db843bd877b93bed764e02ad
228 whole-file packages/webui/tests/board-held.test.mjs 0 01a24d222092ad46c24ea94f684a018b787dfc8d26a0f7d7fda5d9df7192e695
229 whole-file packages/webui/tests/browser-edge.test.mjs 0 4d10b4fcefbc64cdf12bbfbd9b47f74810b3219f70624c35490cb23d66d3c4a1
230 whole-file packages/webui/tests/browser.test.mjs 0 d8c31b7cc16d93961d65959fa9653eaba906f81da3a34e19b3da7cc922f840c3
231 whole-file packages/webui/tests/bus-browser.test.mjs 0 ab1538aaabfdb02c336da61675a0d1d7f367483bc500a380e7f0ece050ab8609
232 whole-file packages/webui/tests/bus.test.mjs 0 fd7acdf189fef230af80c32c4c972d9bfb1564069d7c4ed649c3a49bb6636e1e
233 whole-file packages/webui/tests/channel-chat.test.mjs 0 678b8e3c9152662487fee1c52c8abcae95029b0672d5bbe26a824bbdb4a7ee0b
234 whole-file packages/webui/tests/chat-browser.test.mjs 0 ec29dd03ac7950dfa90e31f72ae74e2112718f1c02ce4dce8055194a328b5f5b
235 whole-file packages/webui/tests/chat-instances.test.mjs 0 72c88b1eb11397bcff524af72cfe826a276b97b58e33465c6e3334e2746e7783
236 whole-file packages/webui/tests/chat-replies-browser.test.mjs 0 bea9b1f9333bc913b2f01c29a792ea4b2fdbed3ebc64b42548e06f0bd75c9fc5
237 whole-file packages/webui/tests/chat-sessions-access.test.mjs 0 f2de41c7d1f6e246a8a13dc33e8662932964facc5b93d8f85ed5fca760c87fd8
238 whole-file packages/webui/tests/chat.test.mjs 0 4c6564d3565b01d68f7d16937aafddbef2ec3e04744fa9d1544ac0500a386ff7
239 whole-file packages/webui/tests/conversation.test.mjs 0 1c3f8811256ad82d7771a06878c3e70dc3d6f2beab82366b837780a7873ff6f1
240 whole-file packages/webui/tests/decide-browser.test.mjs 0 c53e1b962df99686f9739e258b2b86fe6325544ab02509833f9b1176f1303845
241 whole-file packages/webui/tests/decide-sso.test.mjs 0 f96f8085015a96e11aca2d94bfb9e75318c0c0dfa9659049ec7b7e31ad7bc6de
242 whole-file packages/webui/tests/decision-http.test.mjs 0 c89b7af200edb82f9986479199f359cf6a06c870f1bcf22b538cdf3b167f1258
243 whole-file packages/webui/tests/discord.test.mjs 0 1c3e6d64a370adbc6c7cb24391989e9c00d97330d393943402ff5c6a99c5f9fc
244 whole-file packages/webui/tests/docs-browser.test.mjs 0 f39d989ccdc561175643583b27bc19ee76fa25dec5947baa206b0c38b41c1e2a
245 whole-file packages/webui/tests/editor-browser.test.mjs 0 c807f81d596b3a2e3d2ea55e560f29e181a0354ce48676c6760844855acb0dd3
246 whole-file packages/webui/tests/editor.test.mjs 0 6953a85fe791e9087d14c3bf5075de2c4a651e1a502937da3226065c529ffd2b
247 whole-file packages/webui/tests/granted-user.test.mjs 0 ae3baaa0d2a1ed1ad3e9625a46a8071222dfdef4c2a70ae3ba5bf159b85dec0b
248 whole-file packages/webui/tests/history-return-flow.test.mjs 0 8f9ceeb41a64ec2849383a78f4997f7383c86a01eb6cf1d16747c2eb6c7448d4
249 whole-file packages/webui/tests/instances-browser.test.mjs 0 33b9cd4be552f89809e75f72c54f73dbe6459a5c53401a79a4d887e5a658c442
250 whole-file packages/webui/tests/instances.test.mjs 0 904abfc06358c99b0f646c3e728027cd7bba2b27c98c767c7da95016e531277c
251 whole-file packages/webui/tests/library-cli.test.mjs 0 dda07bd1b0d65058723c4d5e50f94fefb1ee103c33c8f61c13841cfedfd53f41
252 whole-file packages/webui/tests/library-routes.test.mjs 0 5cd1f4c6ea99cce38ce59eee085ab31f9aa8bba39cebbaf52b355c4d8fec3098
253 whole-file packages/webui/tests/library-status.test.mjs 0 0b4fb5a07a3d35fb2237401b460ddd3832a2f6fa357f6fbb06b8463251b77faa
254 whole-file packages/webui/tests/limits-browser.test.mjs 0 1a55050c92be5b93e447878feafe59e017b205d114413e6de000faf784df1dad
255 whole-file packages/webui/tests/limits-route.test.mjs 0 b74fe734b0ccbdde716bb52bc15791f80a0b251514a6b01d6ba59164b9639123
256 whole-file packages/webui/tests/messages.test.mjs 0 19bce52278091c8d37ca48c1f6f72bc400cd9a9b3038ae9f31e35444fdab05b8
257 whole-file packages/webui/tests/pinned-copy.test.mjs 0 a8c99249fda05c5be773c8d2231e2dd1a3f3b7d10a40a7ec3e6ca6c6cfb4c85a
258 whole-file packages/webui/tests/preview.test.mjs 0 7f7fbb11dd5915b3351b5086ec9b0f0bed6837a32a2e5902b707fcb54f1bf1c3
259 whole-file packages/webui/tests/processing-browser.test.mjs 0 ed5970f1e2b1fa393c80db5e5551523e77ad0ee107dfa686a76c5d923b7e2d8f
260 whole-file packages/webui/tests/processing.test.mjs 0 ac7a3a0ff51bb15c04e228186d771dd75ef515e09156cd080a8bea881e7cdd8d
261 whole-file packages/webui/tests/project-file.test.mjs 0 8bf04994dec5c6d6670bbae055802759588c27b04010582732cbbf32c2921487
262 whole-file packages/webui/tests/project-name-repo.test.mjs 0 ca773d7109f132bd099c43003a8269edfa96b2ba3a9e01e3694fa6bd12b9143e
263 whole-file packages/webui/tests/proof-cli.test.mjs 0 5095f1ec66a3fc153467baef2291073e27aba17fdc2757e0a3cf2a03057a6547
264 whole-file packages/webui/tests/proof.test.mjs 0 cdb948d261f52232c6e31e25baaf234bd0af3b6d90360a41a6142d2f34a8a797
265 whole-file packages/webui/tests/reads.test.mjs 0 ef69c9c1dc9a55d526a704297aa4e2802cdca8f0e1fd70ff79efad2114a071a6
266 whole-file packages/webui/tests/relaunch.test.mjs 0 e9f075560291cb446dabcaeb86c8800b5ea4ca0396c6a999ddbff88b245cefd1
267 whole-file packages/webui/tests/return-flow.test.mjs 0 bf809ee139c15e9b6b8fe7f6e0f2ce00d0860aa460f145242fc732eafe8da8de
268 whole-file packages/webui/tests/room-browser.test.mjs 0 23286bf46f341220f9e89cc1d229f46a579edb2eae5d688fc768f99ee343c858
269 whole-file packages/webui/tests/room-http.test.mjs 0 a921e1991386cb5e184475cf47a012b3020b575968268e9f3c0b396e244a1819
270 whole-file packages/webui/tests/routes-browser.test.mjs 0 df1283a6e1c5970b404b314b6b76dbf412e5318d76f296ec00164c932166b020
271 whole-file packages/webui/tests/routes.test.mjs 0 055aa274fa66910a4ff1518fea49fbbbbbc5360dc16e825a460538f312a0781d
272 whole-file packages/webui/tests/send-browser.test.mjs 0 da1547383522dbfd74a571b5d7625a310ae88f8adddff0c2bd33cb59df3ac137
273 whole-file packages/webui/tests/send.test.mjs 0 f273e78388935b5fbc18a974f50cb85789436d51c47a4d8dccaf4af4742c2392
274 whole-file packages/webui/tests/serve.test.mjs 0 1971344643d9cf6b4440d95c9ede42093235883ffab04fc4b614c1b7e7078f22
275 whole-file packages/webui/tests/settings-form.test.mjs 0 80bd949d1666f2fe1f4caa051e2c34e742bab0e4adbe5584bd534d9bad8bef53
276 whole-file packages/webui/tests/settings-write.test.mjs 0 7090474fff40910edb93c032feef248adc40ad21666d09c3610cf10279164f99
277 whole-file packages/webui/tests/shell.test.mjs 0 844287f7797201473f1fb8d97ff2355ff3ff505006723678db78f26d3e5c2a40
278 whole-file packages/webui/tests/sso-browser.test.mjs 0 1f70c36ce7d054ad435e52d63083c8fe19cd71e70c723518de5e58b69a426a0a
279 whole-file packages/webui/tests/sso.test.mjs 0 6d7b3061bdc6e22744634ddc5612ff781e5c952a120a346c29eead66a3736438
280 whole-file packages/webui/tests/tester-browser.test.mjs 0 425c54a84e5bf04ca91d8dc57ee83c14aff14a38159243f10f1c9114dd563967
281 whole-file packages/webui/tests/tester-cli.test.mjs 0 5eb7296792f16f24d4486f39101007114b3db81c6ab53ab969e925caaffaa7d9
282 whole-file packages/webui/tests/tester-listener.test.mjs 0 43927869c50a0e223d121e2dea2d10346a053a39fc8157c9fc4813b7c3b17e1f
283 whole-file packages/webui/tests/tester-socket.test.mjs 0 c05962be7f87084404c53e4f7ed2caffff3d69e98e69a3c9f3c53b150cc804e5
284 whole-file packages/webui/tests/thread-claims-browser.test.mjs 0 cbb2aeca0de2c64dd4c8d063d3e45140738d8f4064d38effeaec245ed7181b42
285 whole-file packages/webui/tests/thread-claims.test.mjs 0 164a6c927abd819218be6386e123b234dd9955b122bace699e0a12201797791c
286 whole-file packages/webui/tests/thread-sharing.test.mjs 0 ad64ab207702483aed6f16d13393e5f3c5a1ab0a0c2dcdf32717e8148a45078c
287 whole-file packages/webui/tests/usage-browser.test.mjs 0 14be967dcae157cbb0a7b9ea4e0bc67337941d91a11d789baeb3d3c8353ac0e9
288 whole-file packages/webui/tests/usage.test.mjs 0 4e20eee53c3eb79dc2930ca054977d06da88dba45b706a96ed94abaea6ec3e93
289 whole-file packages/webui/tests/user-option-swap.test.mjs 0 bd43c257ae31cad2ca6c7a0b3ee49c6e323737d236fb7ff2a2105fd5e59b9767
290 whole-file packages/webui/tests/views.test.mjs 0 4226ea02d33b9de8f2eaf9f93b0a551cbd9e6100560a8811eed90aa8de76974c
291 script scripts/test-auth.sh 0 03999aab66446a4192ea9855f5cc1bd406080d0dfa5250b45b30e118556a0d5a
292 script scripts/test-conductor.sh 0 79b7a689ed96792d42edd1d14796e0293e84e2e339b49476e457ad89e1c4a186
293 script scripts/test-config.sh 0 2c3c87fb193e82fa17428933eb69cb2b34a589e8338f7a94aaa8256729fdf08f
294 script scripts/test-discord.sh 0 5c6918b4415e8eabc5df31ac5ad696ec2afdfe3d498d69eae64f228a3807eddb
295 script scripts/test-extension-package.sh 0 1f672a73e507cc57a204f7d3806ddcb211a0a8fb3ffccefc12bbc41e299f65ac
296 script scripts/test-federation-acceptance.sh 0 febb0148bc1316bba3189aacf34d7c78f5f5db5d97a35aa4528dfadbec8bfbd0
297 script scripts/test-foundation.sh 0 3de063333ce60ef1ca1986ecdd8ac30187a2316b7ca8e3ae4b4e6c8bd435caee
298 script scripts/test-land-work.sh 0 ec90beab6246420982f872a4f45a7173e7a06f4aa263630d6ec4a4865176cde0
299 script scripts/test-push-check.sh 0 0304c110dc5cf269fd8a4bea9759e5d48895a51c9d411814ce39ca924073da79
300 script scripts/test-queue.sh 0 f678da9550eb6daa5268465b3a07beefd661e506ed38b8e11bf0a1b4a68cc781
301 script scripts/test-release.sh 0 ad0f2a6b271275003783d3ffab5520f167ea79e26683710ce92a71600037360c
302 script scripts/test-task.sh 0 ad511e52af4bc0a843eabbb3efcedd88c89468ccee43be9022e23880d7901f16
303 mutant M1-supporting 1 0 10581fdab579db4d63322eee3369a1a740266e00a7dcbaa95e7651a7e0447ab8
304 mutant M2-force-push 1 0 b137e8362ae3e26a090a82e8c41c3e87beeaac43183cdd6db67aba55d5e372c9
305 mutant M3-forged-token 1 0 bda603c18b7b2bf468a21e139f0cff0c15c22e19c9d41cf8c50f9c3ae0bd128d
306 mutant M4-grant-before-push 1 0 a642ef8e57a98c1488bb787da241292e6ed5446ca4117940fb0ddb9800c6a105
307 mutant M5-notice-after-publication 1 0 5645138c2cef5d1999948744783ff3904a78e9cefd7421674386a2d0c5fdc45a
308 mutant M6-commit-schema 1 0 7201f53cb976b2db1994c4e25f7f6e8b58eea323c060dbddbfa0372464adb686
@@ -0,0 +1,102 @@
{
"total": {
"tests": 2605,
"pass": 2604,
"fail": 0,
"cancelled": 0,
"skipped": 1,
"todo": 0
},
"packages": {
"library": {
"files": 13,
"tests": 168,
"pass": 168,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"bus": {
"files": 116,
"tests": 1035,
"pass": 1035,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"harness": {
"files": 16,
"tests": 180,
"pass": 180,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"webui": {
"files": 67,
"tests": 398,
"pass": 398,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"business": {
"files": 2,
"tests": 25,
"pass": 25,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"cli": {
"files": 59,
"tests": 620,
"pass": 619,
"fail": 0,
"cancelled": 0,
"skipped": 1,
"todo": 0
},
"plugins": {
"files": 1,
"tests": 8,
"pass": 8,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"processing-control": {
"files": 1,
"tests": 7,
"pass": 7,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"seat": {
"files": 5,
"tests": 69,
"pass": 69,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
},
"tasks": {
"files": 9,
"tests": 95,
"pass": 95,
"fail": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0
}
}
}
+884
View File
@@ -0,0 +1,884 @@
# Row 137 (#1631): agents land approved merges into the business working repository
Brief: `docs/plans/2026-10-15_q167-rows-r3.md`, section "Agents land approved
merges into the business working repository". I designed against blob
`f5ef29a2` (commit `c07c87fc2`, rev 1532). The row is now pinned to blob
`6805904555dc` (rev 1564). The section differs from `f5ef29a2` in one
paragraph, the read.mjs rule from sage-0505 and sage-0511, which this
candidate already follows (see "Arbiter path and `gated` refusal"
below). Owner Darkwing; reviewers Dewey and Filbert. Base `7a2987cf5` for
rounds 1 and 2; round 3 is rebased onto `63c82f1c4`, row 139's landing.
The design comes first, then "As built", the docs, the test map, and the
checks with the candidate.
## What lands where
A landing moves `refs/heads/main` in the business working repository,
`<dataRoot>/working/<business>/<project>.git`. Nothing writes the project
root, and canonical `refactor` is never a target. `scripts/land-work.sh`
keeps working as it does today.
## The seed (working.mjs)
Today `seed()` fetches the project root's HEAD as `+HEAD:refs/heads/main`,
forced, on every push and review. A landed main would be thrown away on the
next push. The new seed:
1. Fetch the root's HEAD as `+HEAD:refs/heads/root`, forced. A failure
refuses `root-unreadable`, as now.
2. If main doesn't exist, create it at root's tip (`update-ref main <tip> ""`,
which fails if another process created it first).
3. If main exists, isn't root's tip, and is an ancestor of root, fast-forward
it with `update-ref main <tip> <old>` (compare and swap).
4. Otherwise leave main alone. It is never forced.
push, review and land all seed under the repository lock. Working
repositories that exist today need no migration: the first seed after the
change creates `refs/heads/root`, and main is already an ancestor of it.
### The push and fetch behaviour change
The brief asks for this to be named. After the first landing, main and root
diverge until the owner brings main into the root.
- push's unrelated-history check still compares against main. A push whose
commit shares no history with main refuses `unrelated-history`. If the
owner rewrites the root's history, main keeps the old one, and pushes
built on the rewrite refuse until main is reconciled by hand.
- Coders clone from the project root, so a later task's branch doesn't have
earlier landings. Its merge base with main is then the root commit it
started from, and the reviewed diff `MB..C` is the task's own change, as
before. Landing it on a main that has moved on can refuse `base-conflict`
where the two touch the same lines.
- The reviewer's fetch now also has `refs/heads/root` in the repository, so
its `have` negotiation knows the root's commits. What the reviewer gets is
unchanged.
- When the owner merges main into the root, the next seed fast-forwards main
and the two agree again.
## Who may land (broker)
The run that holds an approved `git.merge.protected` decision asks for the
landing. Row 136 lets a later run of the same instance use it.
**Target rule.** The raise's `context.target` must equal the task ref named
by the question's work ref (`vikunja:<project>/<task>` for
`work/vikunja-<project>-<task>`). Then `#consumeAuthority` writes the record
with that task ref as its subject, so the landing sits on the task's trail
and `task-subject-required` can't fire. `refactor` never matches a task ref,
so canonical refactor can't be a target, and land-work's decisions (target
`refactor`) and agent landings (target a task ref) can't be used for each
other.
**Shared checks.** `readLanding` moves from `scripts/land-work/read.mjs` to
`packages/bus/src/landing.mjs` and takes `{ into }`:
- `into: 'refactor'` (land-work): the raise targets `refactor`, and read.mjs
still checks its `--base` is `refactor`.
- `into: 'main'` (agent landing): the raise targets the task ref.
- Anything else refuses `target-branch`.
It runs over a small query adapter (`get`, `all`), so read.mjs passes its
read-only `DatabaseSync` and the broker passes its Store. read.mjs keeps its
CLI and its own schema check.
The human check (`res.by === business.human`, `via === 'cli'`, one human
answer with no role or run) is in the shared `readLanding`. Under b2a2d741c
(sage-0517) land-work's check never changes: canonical `refactor` stays the
lead's landing. Only the host land op's call accepts a decision its arbiter
resolved (REQ-DEC-2). Row 139 landed first, so round 3 adds that with the
`arbiter` option only the broker passes, and the test that an
arbiter-resolved merge decision raised by merge-gate lands through the host
op. See "Round 3".
**New broker methods** (trusted, through the launch socket ops):
- `checkLand(cap, { task_ref, decision })`: the session's agent and task,
`#checkAuthority(s, 'git.merge.protected', { decision, target: task_ref })`,
decision not already consumed, then `readLanding` with `into: 'main'`. The
project is the task's latest push; no push refuses `ref-moved`. A decision
that names another project refuses `work-ref`.
- `recordLand(cap, land)`: reruns the checks inside the transaction (the
verdict is still the latest and approving, nothing supersedes the
decision), then `#consumeAuthority` writes the `action.allowed` with the
landed commit, the old main, the reviewed commit, the verdict and the
patch-id. The decision is spent.
- `recordEvent` reserves `action.allowed` for `git.merge.protected`, as it
already does for `git.push.working`, so no run can write a fake landing.
- `landHeld({ business, role, thread })`: whether that role and thread hold
a resolved, unconsumed merge decision with the approval option. The
launcher asks it at launch.
### REQ-LAND-1 and the gated path (sage-0505)
PRD 1.5 round 2 (row 135) says only a role whose role file grants
`git.merge.protected` as a cross-role action may land, and an approval of a
gated-class merge decision never lands. Row 139 takes `git.merge.protected`
out of GATED_ONLY.
This row takes the current gated path. A test role file can't hold the
grant: `role.mjs` refuses any GATED_ONLY action under `withinRole` or
`crossRole`, and the broker's `GATED` set classifies `git.merge.protected` as
`gated` before it reads the role file. So `checkLand` goes through
`#checkAuthority` with class `gated`, and the tests raise gated decisions.
The refusal of class `gated` belongs in `checkLand` and `recordLand`, right
after the authority check returns. The brief (c07c87fc2) says whichever of
rows 137 and 139 lands second carries it with its test, and Sage checks
that at each landing. Row 139 landed first as `63c82f1c4`, so round 3 adds
the refusal, the arbiter path and both tests, and `landHeld` asks for a
cross-role decision so the launcher binds the op only for a role that could
land. The paragraphs above describe the rounds 1 and 2 base; "Round 3" has
what changed.
## The land op (git socket)
The socket takes a third op, `land`, with `{ cap, task_ref, decision }`.
The launcher binds the git socket for a run whose role and thread hold a
merge decision (`landHeld`), as well as for the push and verdict roles it
binds today. The bundle shows a `land_work` tool only then. The broker
rechecks everything at request time, so binding grants nothing by itself.
A decision resolved while a run is going can only be landed from the next
run, because the bundle is fixed at launch.
### Asynchronous outcome (a choice, flagged for Sage)
A full gate takes longer than every timeout between the agent and the host:
the tool call's 60 s default (`callTool`), the runner's 900 s turn and the
git client's 300 s socket timeout. The op can't wait for it.
So `land` answers as soon as the gate has started:
`{ landing: "started", base, reviewed, patch_id }`. Every check that can
refuse before the gate answers synchronously as a refusal, as push does.
The host finishes in the background. The outcome is two records:
- the `action.allowed` (landed) or `action.refused` (`gate-failed`,
`base-moved`, `host-closing`, ...) on the task's trail, and
- a RESULT message from the bus (`_bus`, run `bus`, as `#notice` sends) to
the role in the decision's thread, saying what landed or why not. RESULT
makes the runner take a turn and send no automatic reply.
That message is a broker change beyond "the authority check for the new op
only". The alternative is a run that polls the trail, which needs a read op
agents don't have. I took the message. If Sage wants the narrower scope, the
fallback is the records alone and the role learns the outcome from its next
launch.
The git socket runs one landing at a time. A second request while one is
running refuses `land-busy`. Two full gates at once would also fight over
Docker.
If the host closes during a gate, the gate's process group is killed and the
landing is refused `host-closing`; nothing moves. If the host dies outright,
nothing is recorded and the decision is still unspent, so the run can ask
again.
### The steps
In order, matching land-work's refusal order and codes:
1. Broker `checkLand`: `decision-not-found`, `not-a-merge`, `not-resolved`,
`not-human`, `not-merge-option`, `work-ref`, `target-branch`,
`superseded`, `no-verdict`, `not-approved`, plus `decision-consumed`.
2. Under the repository lock: seed; the work ref's tip must be the
verdict's commit (`ref-moved`); OLD is main; `MB = merge-base(OLD, C)`,
none refuses `base-conflict`; the reviewed patch is `MB..C` in land-work's
fixed diff format, empty refuses `base-conflict`; its patch-id is taken.
3. Root file: an added top-level file, an added top-level directory OLD
doesn't have, or anything under `src/` or `v1/` refuses `root-file`.
4. The squash, in a temporary index on OLD's tree: the patch is applied
with `apply --cached`; failure refuses `base-conflict`; the patch-id of
`OLD..tree` must equal the reviewed one (`patch-drift`). The commit is
made with `commit-tree`, no ref, author and committer "Mosaic bus host"
`<[email protected]>`, and land-work's message with
`Applied-under: git socket land (bus host)`. The commit is fixed before
the gate, so nothing the gate does can change what lands.
5. Gate check: the project root is a mosaic-stack checkout (below) with a
`node_modules`; otherwise `gate-missing`. This is the last synchronous
refusal; the op answers "started" here.
6. The gate, outside the lock, in a detached worktree of the new commit
with the root's `node_modules` linked. A failing step refuses
`gate-failed` with the step and its log.
7. Under the lock: `update-ref main NEW OLD`; failure refuses `base-moved`.
Then `recordLand`. If recording throws, main goes back with
`update-ref main OLD NEW`; if that fails too, the refusal is
`rollback-failed` and names both commits.
The worktree, its `node_modules` link and the Docker network
`<name>_default` are removed on every path. Logs stay under
`<dataRoot>/bus-host/land/<id>/`.
### The exact mosaic-stack check
`git -C <root> merge-base --is-ancestor c2365ae5190aee751bfbd0a3d47105a706adb5e7 HEAD`.
c2365ae5 is the new foundation's root commit ("chore: baseline container POC
and atomic foundation plan", 2026-09-02, tag `poc-container-hello-v0`). The
repository has three root commits (c2365ae5, e7f338e3, ecde7443); a project
without c2365ae5 in its history isn't this one. The root must also have a
`node_modules` directory, which the gate links.
### The gate
One definition, in `packages/seat/src/landing.mjs`, used by the host and by
land-work.sh: every `packages/<p>/tests/*.test.mjs` suite except queue's
(`scripts/test-queue.sh` runs those), then every `scripts/test-*.sh`, each
step logged to `<step>.log` and summarised in `gate.log` with land-work's
line format, ending `GATE_PASSED`. land-work.sh calls it through node and
keeps its own worktree, refusal messages and Docker cleanup. The root-file
rule moves to the same module.
The gate runs reviewed, agent-authored code on the host, outside a sandbox,
with the host's environment. land-work.sh does the same today under the
conductor. Here a human-resolved decision and an approving review are what
authorize it.
## Harness
- `land_work` tool, verb `working.land`, in `tools.mjs`, shown when the
launcher says the session may land.
- `landWork()` client in `git-tools.mjs`.
- runner local handler for `working.land` over the session's git socket.
## Out of scope
Routing and GATED_ONLY (row 139), the merge-gate role (row 149), any push
to a remote, force-push or history rewrite.
## As built: where the candidate differs from the design above
- **The squash is made in a worktree, not a temporary index.** prepareLand
adds a detached worktree of the bare repository at main under
`bus-host/land/<id>/<id>` and applies the reviewed patch there with
`git apply --index`. The applied diff (`--cached` against OLD) must have
the reviewed patch-id. `write-tree`, `commit-tree` with OLD as the one
parent, then `reset --soft` to the squash, so the gate runs in the tree
that lands. The worktree goes on every refusal and at the end
(`dropLand`, which removes the `node_modules` symlink first).
- **Patches are written by git.** Both diffs go through
`git diff --output=<file>` with fixed prefixes, no textconv and no
external diff, and patch-id reads the file. A file that isn't UTF-8
keeps its patch-id.
- **Order.** The root-file check runs before the worktree is added, so a
root-file refusal never touches the object store beyond reading.
gate-missing comes after prepareLand, so the squash exists when the
host answers `started`.
- **The `started` answer carries `commit`**, the squash, besides `base`,
`reviewed` and `patch_id`. An agent can say what will land.
- **Tickets.** checkLand returns a ticket the host passes to recordLand
and landRefused. A ticket outlives the run that asked, since the gate
may end after the run did. An unknown ticket refuses `land-unknown`.
recordLand checks authority with `#authorityFor` (the holder check is
left out for that reason) and reruns the landing checks in the
transaction; it writes the `action.allowed` itself rather than through
`#consumeAuthority`, which would ask for the claim again.
- **`no-subject`.** land-work refuses a landing with no subject and no
`--subject`. An agent has no `--subject`, so checkLand refuses a merge
option with no first line `no-subject`.
- **`decision-consumed`** is checked in checkLand and again in recordLand.
- **The gate's environment.** The host runs the gate with `gateEnv`: PATH,
HOME, USER, LOGNAME, SHELL, LANG, LC_ALL, TZ, TERM, TMPDIR,
XDG_RUNTIME_DIR and DOCKER_HOST only. This replaces "with the host's
environment" in the gate section. land-work.sh keeps the conductor's.
- **isMosaicStack is async** and runs git through `runGit` with only the
environment's PATH, hooks at /dev/null and fsmonitor off.
- **The gate is injectable.** `createGitSocket({gate})` takes `LAND_GATE`'s
shape, `{classify, run, dropNetwork}`, so the socket tests run a fake
gate. A test checks that `LAND_GATE` holds the real `isMosaicStack` and
`runGate`, and the refusals test runs the real classifier on a fixture
project for gate-missing.
- **Harness.** `land_work` has no clone requirement and sits between
`push_working` and `request_review`. The prompt line (round 3 wording):
"Landing: once your merge decision is approved, land_work it with the task. The
reply only says the landing started; the gate's outcome comes later as a
RESULT from the bus. Don't land again while one is running." The
launcher asks `landHeld` with the run's role instance and thread and
binds the git socket when it answers true.
- **The runner's `working.land` route has no test of its own.** Neither do
`working.push` and `working.fetch`. `landWork` is tested in
git-tools.test.mjs against a fake host socket, and the launcher test
checks the bundle and `session.json`.
- **Arbiter path and `gated` refusal** (sage-0511, sage-0517, sage-0565):
rounds 1 and 2 left both out, since row 139 hadn't landed, and both
callers of `readLanding` required a human/cli resolution. Row 139 landed
first, so round 3 adds them (see "Round 3"). land-work's check in
`scripts/land-work/read.mjs` is unchanged in effect in every round.
- **The raise is found by its body, not its subject.** read.mjs looked
for the decision.raise `action.allowed` with `subject` equal to the
decision id. The broker files a raise under its task ref when it has
one (`a.task_ref ?? target-if-task-ref ?? id`), so every decision raised
for a task, which is every one the host op lands, came back
decision-not-found. The first gate run caught it (six land.test
failures). `readLanding` now matches the business, the kind, the
operation and `body.decision`, as the broker's own raise lookups do.
For land-work this changes one thing: a refactor decision raised with a
`task_ref` used to refuse decision-not-found and now reaches the checks
after it, where a `task_ref` that disagrees with the question refuses
work-ref. That branch existed in read.mjs but no real raise could reach
it; the fixture in test-land-work.sh files every raise under the
decision id, so its cases are unchanged. The human-only check is
untouched. `recordEvent` refuses an `action.allowed` whose action is
`git.merge.protected`, so an adapter can't add a second raise that
passes.
- **landing.mjs is a runner file.** The broker imports it, so it joins
`RUNNER_FILES` in packages/seat/src/sandbox.mjs, and the bus import
closure test (project-runtime.test.mjs, row 138) lists the new import
and checks that landing.mjs imports nothing.
- **thread-launch.test.mjs's host answers landHeld.** Its in-process host
lists the launch ops it serves, and every launch now asks `landHeld`, so
five of its tests failed with "invalid-host-request" until the op was
added beside `threadIdle`.
## Docs
Only the landing paragraphs the brief names:
- `packages/seat/README.md`: push step 2 and the review paragraph now
describe the root seed; "No other ref moves" names the seed's refs; a new
"Landing on main (#1631)" subsection covers prepareLand, finishLand,
dropLand and `src/landing.mjs`; the sandbox bind list adds `landHeld`.
- `packages/cli/README.md`, "Git socket": the bind rule, a `land` row in
the op table, `checkLand` in the check order, a landing paragraph (steps,
land-busy, landRefused, the RESULT outcome, logs, `LAND_GATE`), and
close() stopping a gate.
- `packages/bus/README.md`: the four row 137 ops and the ticket.
- `packages/harness/README.md`: the `land_work` paragraph, runner step 3,
the git socket bind rule.
- `docs/TOOLS.md`: one paragraph after land-work's on the shared modules.
Each passes `tools/unslop-hook/unslop-check.js`.
## Tests, against the brief's list
| Brief | Test |
|---|---|
| A reseed moves root and leaves a landed main | working.test "a reseed moves root but leaves a landed main, and main forwards once root contains it" |
| main fast-forwards to root when it's an ancestor, stays put when it isn't | the same test, and "after a landing, a push built on the root still lands and main stays where the landing put it" |
| push's unrelated-history check against main | working.test "a branch with no history in common with main refuses unrelated-history", where main and root are the same commit, and (round 2) "once the root shares no history with a landed main, a push is checked against main, not the root", where they share nothing: a push built on main lands and one built on the root refuses |
| A mosaic-stack checkout runs the gate | landing.test "isMosaicStack: ... node_modules; nothing else" (true on a child of the root commit) and the runGate tests; git-socket.test "land: the squash runs the gate in its own worktree, then main moves and the broker records it" with a classifier that says yes |
| Another project refuses gate-missing | git-socket.test "land: refusals before the gate ..." with the real `isMosaicStack` on the fixture project |
| Each land-work refusal code | On the shared module: `scripts/test-land-work.sh` runs every `readLanding` code through land-work (`into: 'refactor'`), unchanged from row 116. On the host side: land.test "checkLand refuses on the decision and the review" (the broker's decision-not-found, decision-not-approved, decision-mismatch, no-verdict, ref-moved), "checkLand refuses with land-work's codes past the authority check..." (work-ref twice, target-branch, superseded, not-approved, and a `refactor` decision refused decision-mismatch), "no-subject", and decision-consumed in the first test; working.test ref-moved, base-conflict, root-file, base-moved, rollback-failed, and (round 2) patch-drift, with a git first on the PATH that adds a line to what `apply --index` staged, as test-land-work.sh does; git-socket.test gate-missing, gate-failed, land-busy, host-closing, unknown-project and a broker refusal at record |
On the host side, `#checkAuthority` runs first, so `not-a-merge`,
`not-resolved` and `not-merge-option` reach the role as the broker's
`decision-mismatch` or `decision-not-approved`. In rounds 1 and 2,
`not-human` couldn't happen there, since only the human resolved a gated
decision. In round 3 it still can't reach checkLand: a gated decision
refuses `not-authorized` first, and the broker resolves a cross-role one
only through its route, the arbiter or the human. The round 3 test checks
`not-human` on `readLanding` directly instead (see "Round 3").
Also new: landing.test (rootHits, gateEnv, gateSteps, runGate pass, fail
and abort, the CLI), land.test (ticket, landRefused, landHeld, the
reserved event), the launcher test for `landHeld` binding, and the
harness tests for the tool, the prompt line and `landWork`.
`scripts/test-land-work.sh` is unchanged and runs land-work through the
shared gate and root-file CLI.
## Candidate
`r1/build.patch` against BASE `7a2987cf5`
(sha256 `49d5048f6bb53e1b546a6b2dbdec14ef4a9bfe5087f20e218018a62481266611`).
`r1/candidate-manifest.sha256` lists the 31 files: 27 changed and 4 new.
The new ones are packages/bus/src/landing.mjs, packages/bus/tests/land.test.mjs,
packages/seat/src/landing.mjs and packages/seat/tests/landing.test.mjs.
I applied the patch to a fresh worktree at BASE, `sha256sum -c` passed on
every line, and I removed that worktree. Canonical HEAD was `b71268b8e` at
18:56Z. `git diff 7a2987cf5 b71268b8e` on the 27 changed paths is empty, and
none of the 4 new paths exists at HEAD.
## Checks
The slot was mine from 18:37Z (sage-0519) until 18:55:30Z. `r1/gate.sh`
runs `node --test tests/*.test.mjs` in every package with a tests/
directory except queue (test-queue.sh runs that suite), then every
`scripts/test-*.sh`. The suites run one after another, each teed to its own
log, and the script stops at the first failure. TMPDIR was
`~/darkwing-scratch/r137/tmp`. cli's launcher.test ran on its own under the
session's inherited TMPDIR, because the bwrap runner fails "did not start"
under an override. DOCKER_HOST was unset, Docker 29.7.2 was up, and
COMPOSE_PROJECT_NAME was `darkwing-r137`. An EXIT trap removes
`darkwing-r137_default` only when it has 0 containers.
Round 5, the candidate, ran from 18:49:43 to 18:55:25 UTC and ended
GATE_PASSED (`r1/gate-run.log`, step logs in `r1/gate/`):
| Step | Pass | Fail |
|---|---|---|
| bus | 302 | 0 |
| business | 109 | 0 |
| cli (all but launcher) | 202 | 0 |
| cli launcher.test, inherited TMPDIR | 19 | 0 |
| control-board | 124 | 0 |
| conversation | 182 | 0 |
| discord | 183 | 0 |
| harness | 108 | 0 |
| ledger | 86 | 0 |
| mosaic | 69 | 0 |
| plugins | 28 | 0 |
| project | 30 | 0 |
| runs | 43 | 0 |
| seat | 148 | 0 |
| tasks | 97 | 0 |
| webui | 113 | 0 |
| test-auth | 15 | 0 |
| test-conductor | 17 | 0 |
| test-config | 24 | 0 |
| test-discord | 78 | 0 |
| test-extension-package | 18 | 0 |
| test-foundation | 44 | 0 |
| test-land-work | 84 | 0 |
| test-queue | 156 node, 28 suite | 0 |
| test-release | 14 | 0 |
| test-task | 98 | 0 |
The trap printed "network darkwing-r137_default removed". Afterwards no
Docker network created today remained, no container carried the
darkwing-r137 project label, and no node or docker process of mine had a
cwd under my r137 scratch.
Rounds 1 to 4 each stopped on a fault in the candidate or its tests. None
was load or timing (sage-0527). Each fix was rerun singly before the next
round. The round summaries, the failing step logs and the reruns I logged
are in `r1/earlier/`. The git-socket rerun in round 2 has no saved log;
round 5 covers it.
1. Round 1, bus, 295 pass, 7 fail. Six land.test tests refused
decision-not-found, the raise lookup described in "As built". The
project-runtime import closure test didn't list the broker's new import.
After both fixes, land.test and project-runtime.test passed 11 of 11.
2. Round 2, cli, 196 pass, 6 fail. git-socket.test expected a newline
after the Applied-under line, which `w.git` trims, so the test now
anchors that line at the end of the message. Five thread-launch tests
failed because the test host lacked `landHeld`. A rerun under the
inherited TMPDIR failed the same five (`r2-thread-launch-inherited-tmpdir.log`),
which ruled out TMPDIR. With the op added, the file passed 8 of 8.
This round also changed gate.sh: its launcher line used `env -u TMPDIR`,
and it now passes the inherited TMPDIR.
3. Round 3, cli launcher.test, 18 pass, 1 fail. The `landHeld` test's
wrapper used `Object.assign` on a host whose `op` is a read-only
inherited property and threw a TypeError. It now uses `Object.create`.
19 of 19 passed, 0 skipped.
4. Round 4, seat, 146 pass, 2 fail. Two runGate tests named their "must
not run" script test-three.sh, which sorts before test-two.sh, so it
ran first. It is now test-z.sh, with a comment saying why. landing.test
passed 8 of 8.
Researcher's row 148 gate ran from /mnt/storage/scratch/researcher/q148
during my slot (sage-0527). I didn't look inside that directory. Each
failure above traces to a line in the candidate or its tests, so I
changed code rather than rerunning for a flake.
Not run: mutants. Builder rounds may be targeted (decision 136), and the
reviewers have the gate above.
## Round 2 (Filbert's comment 28782, sage-0541)
Filbert asked for two tests the brief requires. Both are in
packages/seat/tests/working.test.mjs, the only file that changed.
- B1, "a landing whose applied diff isn't the reviewed one refuses
patch-drift and leaves no worktree". A `git` first on the PATH runs the
real git, then adds a line to the README that `apply --index` staged, as
scripts/test-land-work.sh does for land-work. prepareLand refuses
`patch-drift`, main stays put and no worktree is left. The same landing
with the real git then prepares.
- B2, "once the root shares no history with a landed main, a push is
checked against main, not the root". After a landing, the owner starts
the root over on an orphan branch. The seed moves root to it and leaves
main. A push built on main lands, and a push built on the new root
refuses `unrelated-history`.
Also fixed: the stale "Row 139 isn't built yet" in "Arbiter path and
`gated` refusal left out". The test table above names both tests.
### Candidate, round 2
`r2/build.patch` against BASE `7a2987cf5`
(sha256 `383fc8329ef340f804de68f981146593bf06e597481991fa9889649e29cb8691`).
`r2/candidate-manifest.sha256` (sha256
`3311b46a61e525a1897190bbce05de15a850843d00fce4497ef3d4828434c09f`) lists
the same 31 paths as r1. Only the working.test.mjs line differs. I applied
the patch to a fresh worktree at BASE: `sha256sum -c` passed on every line
and `git diff --cached --check` was clean (31 files, +2043 -255). Canonical
HEAD was `96fd8593e`, and `git diff 7a2987cf5 96fd8593e` on the 31 paths is
empty.
### Checks, round 2
The slot was mine from 19:18Z (sage-0547). This round was targeted
(decision 136). `r2/round.sh` ran each file singly with TMPDIR
`~/darkwing-scratch/r137/tmp` and no Docker, then probed each check the way
Filbert did. A probe edits working.mjs in place, runs working.test, and
restores the file. The script then checks working.mjs's sha256 against the
one it started with, and it must fail on exactly the new test. Output is in
`r2/gate-run.log`, step logs in `r2/gate/`.
| Step | Pass | Fail |
|---|---|---|
| seat working.test, candidate | 26 | 0 |
| cli git-socket.test, candidate | 23 | 0 |
| probe B1: line 348 `if (false) refuse("patch-drift", ...)` | 25 | 1 |
| probe B2: line 224 merge-base against `refs/heads/root` | 25 | 1 |
| seat, whole suite, restored candidate | 150 | 0 |
- Probe B1 failed only "a landing whose applied diff isn't the reviewed one
refuses patch-drift and leaves no worktree", with "Missing expected
rejection".
- Probe B2 failed only "once the root shares no history with a landed main,
a push is checked against main, not the root". The push built on main
refused `unrelated-history`.
After each probe working.mjs was back at
`0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463`, its
manifest hash. Afterwards `sha256sum -c` on the r2 manifest passed in my
worktree, no `.orig` file was left, and no node process of mine was
running.
Not run in this round: the other package suites, the scripts/test-*.sh and
mutants. Round 2 changes one test file. The r1 gate above covers the other
30 paths, which are unchanged.
## Round 3 (sage-0565): rebased onto row 139, with both carry items
Row 139 landed first as `63c82f1c4`, so this row carries the two items the
brief gives the second lander (brief blob `6805904555dc`). The r2 patch
applied to `63c82f1c4` without a conflict. B1 and B2 are unchanged.
### What row 139 changed under this row
In broker.mjs, `GATED` is now the hard-wait set, and vocabulary.mjs's
`GATED_ONLY` matches it. `git.merge.protected` isn't in it. A role file
may grant a merge cross-role, and a business that grants a hard wait at
either class refuses `invalid-authority` (REQ-WAIT-2). So a hard wait is
never a cross-role decision. decision.raise routes:
- cross-role to `arbiters[domain]`, or to the human when the arbiter is
the raiser's own role;
- gated and cited to the arbiter;
- gated and uncited, or any hard wait, to the human.
An agent's resolution writes `via: 'broker'` with its run as `by`. A
human-routed decision resolved by an agent refuses `human-required`.
### (a) REQ-LAND-1: a gated merge decision never lands
`#landFacts` starts with `if (cls === 'gated') fail('not-authorized')`.
checkLand passes the class `#checkAuthority` returned, and recordLand
passes the one from `#authorityFor`, so both run the same line. The class
can't change between the two: `#authorityFor` requires the decision's class
to be the one the role holds. The refusal comes before
`decision-consumed` and `readLanding`, so who resolved a gated decision
doesn't matter.
### (b) REQ-DEC-2: the host op accepts an arbiter-resolved merge
`readLanding` takes `{ into, arbiter = false }`. It accepts a resolution
when one of these holds:
- the human resolved it through the CLI with one human answer, the check
rounds 1 and 2 already had; or
- `arbiter` is true, the decision is `cross-role`, its `route_to` isn't
`human`, the resolution came `via: 'broker'`, and there is no human
answer.
Only the broker's `#landFacts` passes `arbiter: true`. read.mjs is
unchanged, so land-work passes nothing and stays human-only (item 4). The
route check holds because the broker lets only a run of the `route_to` role
resolve an agent-routed decision.
### Item 5: no hard wait through the arbiter path
A hard wait can't reach the arbiter path, for three reasons:
1. `readLanding` refuses `not-a-merge` for any action but
`git.merge.protected`, which isn't a hard wait.
2. The arbiter path takes only `cross-role`, and REQ-WAIT-2 keeps a hard
wait out of that class.
3. A gated decision refuses `not-authorized` before `readLanding` runs.
### landHeld and the prompt
`landHeld` now skips any decision that isn't `cross-role`, so the launcher
binds the land op only for a role that could land. The bundle's prompt
line no longer says the human approved the merge. It reads "Landing: once
your merge decision is approved, land_work it with the task." The harness
bundle test and the cli launcher test assert it.
### Tests (packages/bus/tests/land.test.mjs)
The world gains a `merge-gate` role granted `git.merge.protected`
cross-role, with pm as the technical and delivery arbiter. The landing
tests now use it instead of a coder raising a gated decision.
- **(b)**, "REQ-DEC-2: a merge-gate raise its arbiter resolved lands
through the host op: ...". The raise routes `cross-role` to pm, and pm
resolves it (`by: 'pm-run'`, `via: 'broker'`). `readLanding` without
`arbiter` refuses `not-human` on it. checkLand answers the facts with
`by: 'pm-run'`, and recordLand writes the merge event with class
`cross-role` and spends the decision once.
- **(a)**, "REQ-LAND-1: a gated merge decision refuses not-authorized,
cited and approved by the arbiter or uncited and approved by the human".
On row 139's spec fixture, the coder pushes, gets an approving review and
raises a merge citing `spec/north-star.md` at the fixture commit. The
raise routes `gated` to pm, and pm approves. checkLand refuses
`not-authorized`, `readLanding` with `arbiter: true` refuses `not-human`,
and landHeld is false. Then, uncited: the raise routes `gated` to the
human, the human approves, and checkLand still refuses `not-authorized`.
Nothing merges.
- New: "a cross-role merge that routes to the human, because merge-gate is
its own arbiter, lands on the human's CLI answer". pm's resolve refuses
`human-required`; the human's lands with `by` set to the human.
- landHeld's test adds a coder's gated decision approved by the human,
for which landHeld is false.
`not-human` still can't reach checkLand (see the test table above). A
comment above the land-work codes test says so.
### Docs, round 3
- `packages/bus/README.md`: land-work accepts only a human CLI resolution;
the broker's `arbiter: true` also accepts a cross-role decision its
arbiter resolved; `not-authorized` for gated (REQ-LAND-1); checkLand and
landHeld name `cross-role`.
- `packages/cli/README.md`: a role granted the merge cross-role lands once
its arbiter or the human approved the decision.
- `packages/cli/tests/git-socket.test.mjs`: one comment. Its broker is a
stand-in, and no logic changed.
### Candidate, round 3
`r3/build.patch` against BASE `63c82f1c4`
(sha256 `52c1f1d6564d9e5e12b5708cbf2f12675dee0582b5fc42ece2fcc203fb5b2a7a`).
`r3/candidate-manifest.sha256` (sha256
`0fae2b6fa41f1cbcf2117b637a2f7a89cb2af209bf32647f0afc1612a9a34e16`) lists
the same 31 paths as r2. Round 3 changed 9 of them: the bus and cli
READMEs, broker.mjs, landing.mjs, land.test.mjs, git-socket.test.mjs,
launcher.test.mjs, bundle.mjs and bundle.test.mjs. I applied the patch to a
fresh worktree at BASE. `sha256sum -c` passed on every line, and
`git diff --cached --check` was clean (31 files, +2115 -255). I removed
that worktree. Canonical HEAD was `c492f4aaa`, and
`git diff 63c82f1c4 c492f4aaa` on the 31 paths is empty.
### Checks, round 3
The slot was mine from 19:43:51Z to 19:46:02Z (sage-0569). Before the
start, /proc showed no `node --test` process outside my own cwd. This
round was targeted (decision 136). `r3/round.sh` ran every test file the
candidate touches, plus row 139's hard-waits.test, each on its own with
TMPDIR `~/darkwing-scratch/r137/tmp` and no Docker. cli launcher.test and
thread-launch.test ran under the inherited TMPDIR. Then came
scripts/test-land-work.sh and one kill per check. A kill edits one source
file in place, runs one test file, which must fail on the named test, and
restores the file. The script checks each restored file against its
starting sha256. Last came the whole bus and seat suites. Output is in
`r3/gate-run.log`, step logs in `r3/gate/`. It ran from 19:43:51 to
19:45:35 UTC and ended ROUND_PASSED.
| Step | Pass | Fail |
|---|---|---|
| bus land.test | 10 | 0 |
| bus hard-waits.test (row 139) | 12 | 0 |
| bus project-runtime.test | 3 | 0 |
| seat landing.test | 8 | 0 |
| seat working.test | 26 | 0 |
| harness bundle.test | 22 | 0 |
| harness git-tools.test | 5 | 0 |
| harness tools.test | 19 | 0 |
| cli git-socket.test | 23 | 0 |
| cli launcher.test, inherited TMPDIR | 19 | 0 |
| cli thread-launch.test, inherited TMPDIR | 8 | 0 |
| scripts/test-land-work.sh | 86 | 0 |
| bus, whole suite, restored candidate | 316 | 0 |
| seat, whole suite, restored candidate | 150 | 0 |
0 skipped in each.
| Kill | Edit | Must fail | Failing |
|---|---|---|---|
| B1 | working.mjs:348 `if (false) refuse("patch-drift", ...)` | the patch-drift test, exactly 1 | 1 |
| B2 | working.mjs:224 merge-base against `refs/heads/root` | the root-history test, exactly 1 | 1 |
| (a) gated refusal | broker.mjs:815 `if (false) fail('not-authorized')` | REQ-LAND-1, exactly 1 | 1 |
| (b) arbiter path | landing.mjs:112 `arbitrated = false && ...` | REQ-DEC-2, one or more | 6 |
| item 5, cross-role only | landing.mjs:112 drops `d.class === 'cross-role'` | REQ-LAND-1, exactly 1 | 1 |
| land-work stays human-only | landing.mjs:91 `arbiter = true` | REQ-DEC-2, exactly 1 | 1 |
| landHeld cross-role | broker.mjs:924 drops `d.class !== 'cross-role'` | the landHeld test, one or more | 2 |
- Kill (b) fails all 6 land.test tests that land or check an
arbiter-resolved merge.
- The item 5 kill fails only REQ-LAND-1. With the gated refusal in place,
the `readLanding` call with `arbiter: true` on the arbiter-resolved gated
decision is the only check that sees it.
- The arbiter-default kill fails REQ-DEC-2 on its `readLanding` call
without `arbiter`, which must refuse `not-human`.
- The landHeld kill fails the landHeld test and REQ-LAND-1, since both
assert landHeld is false for a gated decision.
Afterwards no node or chromium process of mine had a cwd under
`~/darkwing-scratch`. No `.orig` file was left, and every killed file was
back at its starting sha256. The r137 TMPDIR held 847 entries from round
1's full gate (newest 18:53Z) and none from this run. I removed them.
Not run in this round: the other package suites, the other
scripts/test-*.sh, Docker and mutants. Some untouched test files also read
a source round 3 changed, and they didn't run on this base:
- broker.mjs: packages/cli/tests/helpers.mjs (and so the cli tests that
build a broker through it), cli tester.test and harness runner.test;
- launcher.mjs, which asks landHeld: cli launch-limits.test;
- bundle.mjs: harness claude-gate, claude-session, mcp-server and
pi-session tests.
All of them passed in the r1 full gate on `7a2987cf5`, before the gated
refusal, the arbiter path and landHeld's filter. The reviewers' gates and
Sage's gate at the landing target run them on `63c82f1c4`.
## Round 4 (sage-0585): B1, the class refusal and the landing.mjs comment
Dewey asked for changes on round 3 (#1631 comment 28801, rev 1595), and
Filbert approved it (comment 28804, manifest `0fae2b6f`). sage-0585 fixed
round 4 as three items. Everything else in round 3 is unchanged. Base is
still `63c82f1c4`.
### Item 1, Dewey B1: the squash names the real channel
Round 3's `landMessage` wrote "Resolved <choice> by <by> via the CLI" for
every landing. For an arbiter's landing that put "by pm-run via the CLI"
into main's history, which is false. Now:
- `readLanding` returns `via: res.via`, and `#landFacts` passes it into
checkLand's facts. The broker's ticket answer gains `via`.
- git-socket.mjs maps it: `cli` writes "via the CLI", and `broker` writes
"as its arbiter, via the broker". readLanding accepts no other value. If
one ever got through, the line would print `via <value>`. It never falls
back to the CLI.
- land-work's read.mjs prints every key, so it now prints a `via` line too.
land-work.sh reads keys by name and still writes "via the CLI" itself,
which holds, since it accepts only a human CLI resolution.
### Item 2, Filbert note 1 and Dewey N1: every class but cross-role refuses
`#landFacts` now starts with `if (cls !== 'cross-role') fail('not-authorized')`,
ahead of the spent check and the human check in readLanding. Round 3
refused only `gated`. A role granted `git.merge.protected` within-role
resolves its own raise (`via: 'broker'`), so its landing got past that
line and refused `not-human` in readLanding instead. It now refuses
`not-authorized`, like a gated one. role.mjs is unchanged: whether it
should refuse a within-role merge grant at load is a follow-up for row 149
(sage-0585).
The comment above land.test's land-work codes test now matches the code.
checkLand never gives `not-human`: #landFacts refuses every class but
cross-role first, and the broker resolves a cross-role decision only
through the human's CLI answer or its arbiter's decision.resolve.
### Item 3, Dewey N2: the comment at landing.mjs:112
The arbiter path's line now has a comment above it. A cross-role decision
routed to an agent closes only through decision.resolve, which takes it
from the routed role alone (`s.role === route_to`, else `not-resolver`), so
`res.by` there is the arbiter's run.
### Tests, round 4
- land.test, REQ-DEC-2: checkLand's facts gain `via: 'broker'`.
- land.test, the human-routed cross-role landing: checkLand answers
`by: 'jason'`, `via: 'cli'`.
- land.test, new: "REQ-LAND-1: a within-role merge grant refuses
not-authorized at the land". The world's merge-gate holds the grant
within-role, so its raise with `choice: 'yes'` closes in the call
(`within-role`, routed to itself, `via: 'broker'`). checkLand refuses
`not-authorized`, landHeld is false, and nothing merges or refuses on
the trail. `setup` takes a `roles` override for it.
- git-socket.test, the first land test: the stand-in's facts gain
`via: "cli"`, and the squash's message must hold "Resolved yes by jason
via the CLI at 2026-10-16T00:00:00.000Z."
- git-socket.test, new: "land: an arbiter-resolved landing's squash says
the arbiter resolved it through the broker". The stand-in answers
`by: "pm-run", via: "broker"`. The message must hold "Resolved yes by
pm-run as its arbiter, via the broker at ..." and no "via the CLI".
### Docs, round 4
- `packages/bus/README.md`: not-authorized for every class but
`cross-role`, gated and within-role named; checkLand's answer carries
the resolution's `via`.
- `packages/cli/README.md`: the squash's Resolved line names the channel
from the ticket's `via`.
### Interdiff, round 3 to round 4
`r4/interdiff.patch` (sha256
`dcc4672cf6f6ad01cf068725969bfb724d52460528df1adeb405c75a13856af3`), 7
files, +65 -20:
| File | Change |
|---|---|
| packages/bus/src/broker.mjs | the class refusal and its comment; `via` in the facts |
| packages/bus/src/landing.mjs | `via` in readLanding's return; the N2 comment |
| packages/cli/src/git-socket.mjs | `RESOLVED_VIA` and the Resolved line |
| packages/bus/tests/land.test.mjs | `via` in two tests, the within-role test, the comment, `setup`'s `roles` |
| packages/cli/tests/git-socket.test.mjs | `via: "cli"` in the stand-in, the CLI assertion, the arbiter test |
| packages/bus/README.md | the refusal's classes, `via` in the answer |
| packages/cli/README.md | the Resolved line |
### Candidate, round 4
`r4/build.patch` against BASE `63c82f1c4`
(sha256 `0cabe175b095dd632e6ee6e166efad19089a1c87ffba6198a32c6849a1a80965`).
`r4/candidate-manifest.sha256` (sha256
`548ee477baca2a172d2585dd3074979f299b83db4484d1ec89674bb3142a9928`) lists
the same 31 paths as r3, and differs from it on the 7 above. I applied the
patch to a fresh worktree at BASE. `sha256sum -c` passed on every line,
and `git diff --cached --check` was clean (31 files, +2160 -255). I
removed that worktree. Canonical HEAD was `4ebef2284`, and
`git diff 63c82f1c4 4ebef2284` on the 31 paths is empty.
### Checks, round 4
`r4/round.sh` is round 3's script with three kills added and kill (a)
moved to the new line:
| Kill | Edit | Must fail |
|---|---|---|
| (a) class refusal | broker.mjs:815 `if (false) fail('not-authorized')` | the within-role test, one or more |
| item 2, gated only | broker.mjs:815 back to round 3's `cls === 'gated'` | the within-role test, exactly 1 |
| B1, CLI text | git-socket.mjs:259 hard-codes "via the CLI" | the arbiter squash test, exactly 1 |
The other six kills are round 3's.
I ran it on Sage's go (sage-0592) from 2026-10-16T20:38:29Z to
20:40:26Z, in `~/darkwing-scratch/r137/wt4` at BASE with the patch
applied. Log: `r4/gate-run.log`, per-step logs under `r4/gate/`.
ROUND_PASSED.
| Step | Result |
|---|---|
| bus land, hard-waits, project-runtime | 11, 12, 3 pass, 0 fail |
| seat landing, working | 8, 26 pass, 0 fail |
| harness bundle, git-tools, tools | 22, 5, 19 pass, 0 fail |
| cli git-socket | 24 pass, 0 fail |
| cli launcher, thread-launch (inherited TMPDIR) | 19, 8 pass, 0 fail |
| scripts/test-land-work.sh | 86 passed, 0 failed |
| whole bus suite | 317 pass, 0 fail |
| whole seat suite | 150 pass, 0 fail |
All nine kills killed:
| Kill | Failing |
|---|---|
| b1-patch-drift | 1 |
| b2-against-root | 1 |
| (a) class refusal | 2 |
| item 2, gated only | 1 |
| B1, CLI text | 1 |
| b-arbiter-path | 6 |
| 5-cross-role-only | 1 |
| arbiter-default | 1 |
| held-cross-role | 3 |
Each named test was among the failures. After the run the sweep found
none of my processes left, no `.orig` file remained, and `sha256sum -c`
on the manifest still passed. This is a targeted builder round
(decisions 136/137). The whole cli and harness suites and the other
`scripts/test-*.sh` are the landing gate's.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,31 @@
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
128aae5d0d6c3d2b11c474508d75b412d24b2b3fff3079822b4fe6de96b53dce packages/bus/README.md
380f01f7d97485ff62acec37692b4b4354615fe1be486d18fbf85c82277819ec packages/bus/src/broker.mjs
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
62b641b44b2939c6eec86856b47de967d501e36d6cf437b993c844d8007353c1 packages/cli/README.md
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
03a4903b14ea72781a337e1782cba41918f35849b25e223110ed4d283864cee4 packages/cli/tests/git-socket.test.mjs
97c613a0e59d39fa715d32144741bd996a6392862353f0bf204029d707789d50 packages/cli/tests/launcher.test.mjs
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
a47aecd10338ffa77df4f1993b90ab60dd91cf33651eb5e7ac23f53f73d73d98 packages/harness/README.md
b97b5df64d6ea56183b2d672bbe95321ecfab5171f11e1ba643b6778b70b9fb6 packages/harness/src/bundle.mjs
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
81966394d5d875e3e62d231df4e5442849ff7dde40bebe6f52d8d9a7b3b6d99f packages/harness/tests/bundle.test.mjs
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
df8ea48a034cd1c08ee153fb3ce0f3fcfb13c5f23be949ff6240f07dd6f88a03 packages/seat/tests/working.test.mjs
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
c09885c94d45a48345c132e7e7bf2233ca6787ca23771a35393e6dc635d784d6 packages/bus/src/landing.mjs
7ed287a6035cb2ca9d9df09054403df868820a32cdc714ff6b15aa36f8474e1b packages/bus/tests/land.test.mjs
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
@@ -0,0 +1,3 @@
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:37:45
pkg-bus rc=1 18:37:45-18:37:57 ℹ pass 295 ℹ fail 7 ℹ skipped 0 | }
STOP pkg-bus
@@ -0,0 +1,5 @@
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:39:15
pkg-bus rc=0 18:39:15-18:39:28 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12251.983083
pkg-business rc=0 18:39:28-18:39:29 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1896.460233
pkg-cli rc=1 18:39:29-18:41:01 ℹ pass 196 ℹ fail 6 ℹ skipped 0 | at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
STOP pkg-cli
@@ -0,0 +1,6 @@
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:44:15
pkg-bus rc=0 18:44:15-18:44:27 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12369.638742
pkg-business rc=0 18:44:27-18:44:29 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1945.948742
pkg-cli rc=0 18:44:29-18:44:50 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 20213.873392
pkg-cli-launcher rc=1 18:44:50-18:45:04 ℹ pass 18 ℹ fail 1 ℹ skipped 0 | at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
STOP pkg-cli-launcher
@@ -0,0 +1,16 @@
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:45:35
pkg-bus rc=0 18:45:35-18:45:46 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 11199.134901
pkg-business rc=0 18:45:46-18:45:48 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2012.878753
pkg-cli rc=0 18:45:48-18:46:10 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 21560.33243
pkg-cli-launcher rc=0 18:46:10-18:46:24 ℹ pass 19 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 14833.180301
pkg-control-board rc=0 18:46:24-18:46:25 ℹ pass 124 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 649.958587
pkg-conversation rc=0 18:46:25-18:47:15 ℹ pass 182 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 50020.343616
pkg-discord rc=0 18:47:15-18:47:18 ℹ pass 183 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2640.132988
pkg-harness rc=0 18:47:18-18:47:30 ℹ pass 108 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12190.433259
pkg-ledger rc=0 18:47:30-18:47:52 ℹ pass 86 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 22075.885877
pkg-mosaic rc=0 18:47:52-18:47:54 ℹ pass 69 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2051.574471
pkg-plugins rc=0 18:47:54-18:47:54 ℹ pass 28 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 226.191842
pkg-project rc=0 18:47:54-18:47:56 ℹ pass 30 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1014.159815
pkg-runs rc=0 18:47:56-18:47:56 ℹ pass 43 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 715.157202
pkg-seat rc=1 18:47:56-18:48:02 ℹ pass 146 ℹ fail 2 ℹ skipped 0 | }
STOP pkg-seat
@@ -0,0 +1,19 @@
✔ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (176.764884ms)
✔ checkLand refuses on the decision and the review (256.209119ms)
✔ a merge option with no first line refuses no-subject, as land-work does (114.469937ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (267.381445ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (112.362045ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (117.330249ms)
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (112.674263ms)
✔ no run may write the action.allowed for git.merge.protected itself (73.676483ms)
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.553045ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (165.234989ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (168.752393ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1293.733361
@@ -0,0 +1,477 @@
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (143.490511ms)
✔ agents: working counts what the holder received and has not read; routed alone is not working (203.729324ms)
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (329.878819ms)
✔ agents: working wins over waiting, and Input needed still shows (174.656985ms)
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (226.743618ms)
✔ agents: state reads only its own business, even for a run name both use (187.355626ms)
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (220.521088ms)
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (210.533074ms)
✔ agents: stranded is oldest first and capped at 50 for a role (933.932351ms)
✔ agents: stranded is per role and per business (332.277738ms)
✔ agents: a message routed to a held role and not yet received is not stranded (132.446455ms)
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (268.774469ms)
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (190.84645ms)
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (276.051807ms)
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (252.287125ms)
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (287.269023ms)
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (333.275539ms)
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (174.848766ms)
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (248.358118ms)
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (273.430369ms)
✔ launch events require a human CLI capability; generic emit cannot forge authority events (184.963236ms)
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (213.113276ms)
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (274.371208ms)
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (163.175791ms)
✔ task action subjects and linked decision trail are complete and ordered (207.906022ms)
✔ launch binding is durable and reconnecting requires the identical trusted record (132.022789ms)
✔ business isolation includes inherited object names and cross-business message references (210.722577ms)
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (316.076823ms)
✔ task projection uses schema current view, skipping earlier and equal-start polls (169.38238ms)
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (230.009469ms)
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (144.671024ms)
✔ both arbiters require human resolution when their cross-role route is themselves (266.265371ms)
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (210.633909ms)
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.433026ms)
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (246.705659ms)
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (326.657944ms)
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (254.749039ms)
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (267.417052ms)
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (275.088751ms)
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (278.518569ms)
✔ REQ-COS-1: the chief of staff cannot end its own run or the assistant's through role.end (288.807851ms)
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (256.38867ms)
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (337.87114ms)
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (297.056572ms)
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (412.259472ms)
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (651.307937ms)
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1176.18563ms)
✔ comment cursors isolate businesses, move only forward and remain append-only (118.136245ms)
✔ only trusted sync writes validated cursors; events and cursor share rollback (112.497162ms)
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (847.817256ms)
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1585.825719ms)
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (881.800721ms)
✔ migration refuses mismatched source metadata without changing schema or evidence (949.603435ms)
✔ offline command migrates only the supplied fixture root and reports usage errors (1149.112246ms)
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (101.306493ms)
✔ credentials refuses a role session and any argument (168.160521ms)
✔ credentials reads the status on each request, and a broker without one lists none (211.038963ms)
✔ the broker process answers credentials without a token, path or variable in its output, log or store (228.472124ms)
✔ only validated broker references load; returned data and exceptions cannot expose a known token (4.00558ms)
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (4.41877ms)
✔ expiry refuses use and env references never become client data (0.696483ms)
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.495284ms)
✔ opaque tokens shorter than 16 characters refuse before use (0.278469ms)
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (2.391418ms)
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (465.587113ms)
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (460.704203ms)
✔ chief-executive-officer: another C-suite role isn't on the lists either (435.90759ms)
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (478.233563ms)
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (485.519025ms)
✔ chief-financial-officer: another C-suite role isn't on the lists either (411.650058ms)
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (506.221186ms)
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (567.462014ms)
✔ chief-information-officer: another C-suite role isn't on the lists either (486.529759ms)
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (641.273402ms)
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (573.338972ms)
✔ chief-information-security-officer: another C-suite role isn't on the lists either (432.537028ms)
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (474.387193ms)
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (435.069446ms)
✔ chief-marketing-officer: another C-suite role isn't on the lists either (409.258351ms)
✔ a human resolve sends the raising role one message from the human, and its request is the answer (234.873073ms)
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (234.474783ms)
✔ a human withdraw sends one message with the note (244.483269ms)
✔ a human seen before the close leaves the request on the close's answer, not the seen (311.203051ms)
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (290.108897ms)
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (304.966897ms)
✔ a raising role nobody holds at the close gets the message on the next claim (284.228955ms)
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (245.78354ms)
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (293.642849ms)
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (289.555346ms)
✔ a route the raiser hears from is allowed, checked from the route to the raiser (354.090367ms)
✔ a refused supersede withdraws nothing (315.316466ms)
✔ the assistant's within-role and gated raises still work (304.521825ms)
✔ roles lists open decisions routed to a role, and never the human inbox (218.668476ms)
✔ recent lists closed decisions of every route, newest close first, with how each closed (285.8522ms)
✔ recent gives the closing event as closed when the decision was seen first (305.918506ms)
✔ recent stops at RECENT rows (836.83975ms)
✔ every row is what trail already gives the same session for that id (291.013109ms)
✔ a role session can't list decisions, so it can't read another role's open decisions (418.893184ms)
✔ decisions is a read: one business, strict arguments, nothing written (417.549319ms)
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (125.873816ms)
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (139.425984ms)
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (142.701541ms)
✔ endLaunch leaves a claim another run took alone (178.418176ms)
✔ refuse records action.refused against the caller with the code only (152.136743ms)
✔ launches off refuses role.launch with launch-revoked until launches on (197.700524ms)
✔ broker process: launch ops authorize role.launch, record refusals and end runs (358.768553ms)
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.891171ms)
✔ process reader gets own kernel identity without exposing environment values (0.562783ms)
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.896502ms)
✔ real pid 1 remains inspectable when its environment is protected (0.337478ms)
✖ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (251.698675ms)
✖ checkLand refuses on the decision and the review (271.998353ms)
✖ a merge option with no first line refuses no-subject, as land-work does (249.96045ms)
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (261.880846ms)
✖ a ticket outlives the run that asked, and recordLand checks the task again (239.557719ms)
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (261.776469ms)
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (257.462367ms)
✔ no run may write the action.allowed for git.merge.protected itself (180.797745ms)
✔ a message to a stopped role sends launch.by one notice, and the result says so (212.68727ms)
✔ a message to a role outside launch.instances says so in its result and in the notice (156.001011ms)
✔ a message to a running role sends no notice and its result is unchanged (141.407436ms)
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (250.120155ms)
✔ a run launched but not yet claimed counts as no holder (131.584568ms)
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (291.571469ms)
✔ a business with no launch block tells nobody and says there is no launcher (131.057905ms)
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (343.765708ms)
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (202.772346ms)
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (276.296566ms)
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (433.397652ms)
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (203.818503ms)
✔ missing and foreign-business citations refuse and roll back message and grant (193.03303ms)
✔ cross-role sends still need a matching resolved decision and consume it once (246.348276ms)
✔ messages pages all human messages newest first without writes; read state is history (2736.956684ms)
✔ messages refuses role callers, invalid paging and cursors outside this human feed (350.489486ms)
✔ views messages passes only its paging arguments through (0.330354ms)
✔ messages isolates businesses even with a valid foreign cursor (201.826917ms)
✔ the assistant sends to the user and to the chief of staff only (335.633359ms)
✔ an assistant send to any other role, or to the tester, is refused and logged (376.02215ms)
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (376.867904ms)
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (322.789916ms)
✔ a sender-side list alone refuses a send to a role that has no list (345.143558ms)
✔ a target-side list alone refuses a send from a role that has no list (356.297553ms)
✔ the sender list is checked before the target list (364.169697ms)
✔ roles without the field behave exactly as before (534.290305ms)
✔ a business with no role definitions at all is unlimited (417.614533ms)
✔ a malformed messaging field refuses at boot (120.573164ms)
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (524.027342ms)
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (470.5462ms)
✔ review requests and verdicts between roles without the field are unchanged (357.705211ms)
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (219.722597ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (521.783388ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (440.001994ms)
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (241.113797ms)
✔ startup token refusal returns safe code without value or partial listening broker (81.958897ms)
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (236.181575ms)
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (275.039792ms)
✔ trusted host registers later launches; socket clients never have a registration verb (228.440239ms)
✔ runtime excludes declared project roots even when host supplies no repoRoots (77.496756ms)
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (197.910674ms)
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (162.815337ms)
✔ D2: spec.read refuses without content if its role is released during the read (164.702208ms)
✔ D3: spec.read secret check refuses flagged content without content (147.159495ms)
✔ D3: spec.read secret check refuses flagged subject without content (137.947353ms)
✖ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (2.074077ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (232.796731ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (220.860931ms)
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (237.042825ms)
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (205.705566ms)
✔ a message with no reply gives an empty list (175.75095ms)
✔ replies come oldest first and stop at REPLIES (775.050895ms)
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (399.607373ms)
✔ strict arguments; a role session gets human-required (387.639921ms)
✔ views passes replies through as one call with the id (0.267351ms)
✔ requirements returns the committed list to a holding role session, and no one else (226.570569ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (148.561691ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (206.770021ms)
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (255.905917ms)
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (252.025607ms)
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (276.91177ms)
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (430.414621ms)
✔ reviewFetch answers only the addressed reviewer, for the request it cites (328.835711ms)
✔ review.verdict answers one request once, to the role that asked (364.529318ms)
✔ task.close on a pushed task needs an approve verdict for the latest push (470.555475ms)
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (382.899139ms)
✔ v3b prototype refusals, views and append-only mutations (1646.850984ms)
✔ gated approval authorizes once, survives store reopen, and fresh approval works (281.624204ms)
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (206.458712ms)
✔ two scheduled callers have exactly one grant and one consumed refusal (158.814102ms)
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (361.047459ms)
✔ class drift gated to cross-role refuses before consumption (301.578832ms)
✔ class drift cross-role to gated refuses before consumption (274.956218ms)
✔ class drift gated to within-role refuses before consumption (293.475013ms)
✔ class drift cross-role to within-role refuses before consumption (298.074973ms)
✔ class drift within-role to gated refuses before consumption (322.993141ms)
✔ class drift within-role to cross-role refuses before consumption (291.933089ms)
✔ message.send consumes approval and prevents a later send or authorize (273.588487ms)
✔ role.revoke consumes approval and prevents a later revoke or authorize (304.31343ms)
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1517.517785ms)
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (280.96622ms)
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (218.74477ms)
✔ two real socket writes to one repository yield one commit and one project-busy refusal (330.036646ms)
✔ client disconnect during await tolerates late reply (193.94252ms)
✔ client disconnect during await tolerates late refusal (188.722535ms)
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (446.561423ms)
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (325.788404ms)
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (394.908448ms)
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (302.06813ms)
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (291.923846ms)
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (257.045507ms)
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (358.525504ms)
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (230.116836ms)
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (486.221833ms)
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (479.789283ms)
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (548.521633ms)
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (282.377581ms)
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (663.935827ms)
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (457.088912ms)
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (234.495545ms)
✔ a business that never switched launches reads allowed with no time and no event (176.574662ms)
✔ launches revoked and then restored read allowed, with the restore time and event id (239.118619ms)
✔ a task closed on the tracker leaves the open list, and total counts the open ones (158.376647ms)
✔ a tombstone is not open (160.736199ms)
✔ the open list stops at the cap and says so; total still counts every open task (148.509209ms)
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (200.77214ms)
✔ a human session reads the same state, with the same cap (179.792362ms)
✔ reading state writes nothing: every table keeps its row count (187.955769ms)
✔ creates private WAL store and excludes a second writer until explicit close (182.3317ms)
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (198.594739ms)
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (225.938935ms)
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (221.318894ms)
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (124.673247ms)
✔ async transactions refuse before invoking their function (117.021873ms)
✔ the session default fits under the reply cap and pages to the end with next (383.492014ms)
✔ the short form: no description, assignees by role, every listed key (307.144225ms)
✔ each filter, alone and together, and total counts every match (465.120843ms)
✔ task_ref reads one task in full, as the whole board has it (397.038186ms)
✔ no arguments is the read the Console and mosaic make, unchanged (278.752867ms)
✔ an unknown argument or a bad value refuses invalid-request (1016.259495ms)
✔ tasks rows carry priority and requirement for every session that reads tasks (387.143416ms)
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (413.43234ms)
✔ an empty business and one with snapshots but no task.created read cleanly (174.507851ms)
✔ recordTask keeps sync reads and a role write apart (239.284441ms)
✔ read_at must be one canonical UTC format, so the projection compares strings safely (132.004003ms)
✔ a bad entry refuses the whole record (121.105267ms)
✔ taskView reads the projection for one business (191.396833ms)
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (361.891756ms)
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (441.789101ms)
✔ without an adapter the server refuses every task verb (234.67147ms)
✔ the runtime refuses an invalid adapter and closes a valid one (257.321858ms)
✔ the process loads the S3 adapter from plain-data trackers (352.673986ms)
✔ the tester binds only when the business sets bus.tester to exactly true (1063.802589ms)
✔ a business may not name a role tester, so the tester address is never a role (280.267126ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (607.792776ms)
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (238.527938ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (266.218743ms)
✔ the tester reads the human views a reader reads (186.010192ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.392009ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.396415ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.236377ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (114.743952ms)
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (976.344086ms)
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1309.130998ms)
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (880.350161ms)
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (856.018418ms)
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (452.002637ms)
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1316.367475ms)
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (345.100581ms)
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3609.36047ms)
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (100.908296ms)
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (158.341625ms)
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (168.688742ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (164.772802ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (146.689436ms)
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (132.197711ms)
✔ REQ-USER-2: the human verbs refuse another owner's thread (160.4486ms)
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (128.377522ms)
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (150.953193ms)
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (547.448518ms)
✔ socket capability stamps launch identity; shared views use wire, no SQL client (255.351931ms)
✔ two wire claims serialize; a lost reply never automatically retries (251.263242ms)
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (143.08084ms)
✔ client preserves UTF-8 when a response divides a multibyte character (12.692636ms)
✔ committed mutation followed by dropped reply reports unknown and is never retried (168.034534ms)
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (253.051245ms)
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (212.723667ms)
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (233.431633ms)
✔ a broker with no web service refuses a granted role (168.3812ms)
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (225.068426ms)
✔ a session that is not the role holder is refused (160.720599ms)
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (404.553886ms)
✔ web.search with no search source configured is a refused result, not an error (151.34125ms)
✔ a search source that fails with its own refusal, or that throws, is handled (182.50646ms)
✔ a slow search source ends in a refusal at the deadline (196.484324ms)
✔ a secret in the arguments is refused before anything is trailed or fetched (136.476069ms)
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (246.239771ms)
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.304299ms)
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (209.536361ms)
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (153.95907ms)
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (456.651467ms)
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (176.285303ms)
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (202.452522ms)
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (169.182866ms)
ℹ tests 302
ℹ suites 0
ℹ pass 295
ℹ fail 7
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 12151.056693
✖ failing tests:
test at tests/land.test.mjs:87:1
✖ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (251.698675ms)
Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:90:17)
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)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
code: 'decision-not-found'
}
test at tests/land.test.mjs:137:1
✖ checkLand refuses on the decision and the review (271.998353ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-verdict/. Input:
'Error: decision-not-found'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at check (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:139:36)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:23
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:10),
expected: /no-verdict/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:168:1
✖ a merge option with no first line refuses no-subject, as land-work does (249.96045ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-subject/. Input:
'Error: decision-not-found'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:27
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:10)
at Test.runInAsyncScope (node:async_hooks:226:14),
expected: /no-subject/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:185:1
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (261.880846ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /work-ref/. Input:
'Error: decision-not-found'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:195:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:187:34
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:195:10)
at Test.runInAsyncScope (node:async_hooks:226:14),
expected: /work-ref/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:218:1
✖ a ticket outlives the run that asked, and recordLand checks the task again (239.557719ms)
Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:221:26)
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)
at Test.postRun (node:internal/test_runner/test:1542:19) {
code: 'decision-not-found'
}
test at tests/land.test.mjs:235:1
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (261.776469ms)
Error: decision-not-found
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:238:21)
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)
at Test.postRun (node:internal/test_runner/test:1542:19) {
code: 'decision-not-found'
}
test at tests/project-runtime.test.mjs:12:1
✖ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (2.074077ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
[
"import { randomUUID, randomBytes } from 'node:crypto';",
"import { loadRequirements } from '../../tasks/src/requirements.mjs';",
+ "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';"
]
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/project-runtime.test.mjs:14:10)
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)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [ "import { randomUUID, randomBytes } from 'node:crypto';", "import { loadRequirements } from '../../tasks/src/requirements.mjs';", "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';" ],
expected: [ "import { randomUUID, randomBytes } from 'node:crypto';", "import { loadRequirements } from '../../tasks/src/requirements.mjs';" ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,16 @@
✔ 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 (5355.268474ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1491.150316ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4369.024927ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2805.354208ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (50.252057ms)
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (150.180822ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (178.824534ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (45.955149ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14537.475334
@@ -0,0 +1,280 @@
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1586.54654ms)
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (85.154678ms)
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (241.09577ms)
✔ NO_COLOR: no escape codes, except reverse video on the selected row (311.198065ms)
✔ 1-9 shows the decide flow's own lines and question; only y resolves (202.245549ms)
✔ the app shows the same decide text as mosaic decide (111.612001ms)
✔ any key but y or Y at the question answers No; nothing is sent (2965.181872ms)
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (484.467652ms)
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1681.765701ms)
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (136.021747ms)
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (138.620791ms)
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (891.976905ms)
✔ quitting at the question answers No and sends nothing, armed or not (205.885793ms)
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (193.390657ms)
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (141.573484ms)
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (1003.140373ms)
✔ at every size the decide box shows each line y depends on, or says it is hidden (8769.924433ms)
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (154.957595ms)
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (161.821857ms)
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (82.034227ms)
✔ keys: views, moving, trail of a selection, the command line, help and quit (260.527119ms)
✔ one option: the status line says Press 1, not 1-1 (98.222316ms)
✔ no business: the app says so and :business picks one (50.30584ms)
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.808598ms)
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (172.042218ms)
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.464708ms)
✔ decide with --note still asks; a No sends nothing (68.612248ms)
✔ the app's business comes from a live bus host only (0.953571ms)
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.67894ms)
✔ draw is pure: same state, same frame (0.713452ms)
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (5.037102ms)
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (867.148087ms)
✔ a missing file is recorded too, and a valid file clears the status on the next start (491.247325ms)
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (241.566981ms)
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (145.79187ms)
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (122.887234ms)
✔ decide prints a declining choice as declining (210.407708ms)
✔ an unknown outcome is reported once and never resent (183.588922ms)
✔ a decision closed before the answer arrives exits 2 and points at its trail (133.895776ms)
✔ a prefix that matches two open decisions exits 2 and resolves neither (115.014525ms)
✔ without --business a command uses the live host's business, and a stale host.json is not a host (177.865231ms)
✔ every human command refuses inside an agent run before it touches the bus (101.555991ms)
✔ usage errors exit 4; no business and no host is a usage error (96.217485ms)
✔ agents and tasks print through the broker (101.223497ms)
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (3.83694ms)
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (71.180132ms)
✔ trackers come from the tracker.* variables of the one project that names a tracker project (116.307676ms)
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (50.667744ms)
✔ two projects that each name a tracker project refuse, since the boot shape holds one (42.096612ms)
✔ a business without tracker.baseUrl gets no trackers entry (38.095144ms)
✔ an unknown business and a broken system config refuse with exit 3 (82.951068ms)
✔ follow prints an unsolicited message after plain talk returned (293.530529ms)
✔ talk --follow continues after reply and prints a later unsolicited message (200.981749ms)
✔ inbox lists all unread human messages under decisions, does not deliver or read them (2836.214856ms)
✔ follow refuses agent context and bad arguments (791.286088ms)
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (488.069176ms)
✔ plain talk leaves the process SIGINT handlers unchanged (380.438616ms)
✔ empty views say so (1.084811ms)
✔ the trail keeps the broker's order and names a decision's task without its rows (1.332596ms)
✔ tasks print the tracker fields the snapshot carries (0.246354ms)
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (971.292957ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (834.085703ms)
✔ the size cap refuses a push before any byte (435.670784ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (658.671094ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (1421.403537ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1182.864034ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (440.342446ms)
✔ a review of a project the business no longer has refuses unknown-project (608.242609ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (309.593048ms)
✔ close() answers host-closing to a connection still sending its request line (351.120084ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (897.782249ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (818.554008ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (745.729918ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.491929ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (584.219189ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (44.066289ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.837235ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (515.458198ms)
✖ land: the squash runs the gate in its own worktree, then main moves and the broker records it (405.51588ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (425.891445ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (393.989817ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (389.474689ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (368.681583ms)
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1041.793769ms)
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (296.619584ms)
✔ a second host for the same data root refuses with exit 3 while the first runs (219.812506ms)
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (750.841709ms)
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (2.787137ms)
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (1.35886ms)
✔ a live host's lock stays, however old the file is (0.719969ms)
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (997.571568ms)
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (204.431841ms)
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (45.72049ms)
✔ a broker fork that throws leaves no host.lock and no host.json (28.699467ms)
✔ a broker send that throws leaves no host.lock and no host.json (29.31541ms)
✔ a broker that misses its boot wait leaves no host.lock and no host.json (48.839654ms)
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (670.652778ms)
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (547.854572ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (384.788051ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (201.956185ms)
✔ a host.json that can't be written stops both children and leaves no host.lock (296.389569ms)
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (29.775815ms)
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (180.582127ms)
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (336.938125ms)
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (401.251593ms)
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (291.839473ms)
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1246.70776ms)
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (462.02535ms)
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (199.203098ms)
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (270.260742ms)
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (243.483793ms)
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (173.551652ms)
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (208.323474ms)
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (163.750364ms)
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (235.634201ms)
✔ watchChildren reports a child that died before it was called, and one that dies later (25.005153ms)
✔ bus stop refuses to signal a live pid that is not a bus host (202.610935ms)
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (312.746842ms)
✔ bus start refuses with exit 3 without a notifier config (118.252934ms)
✔ bus start runs until bus stop; status reports it while it runs (806.388256ms)
✔ bus-service.sh renders the unit and installs it into a given directory (62.869069ms)
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (75.434352ms)
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (16.064265ms)
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (10.570917ms)
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (47.714601ms)
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (47.18683ms)
✔ limits view/set use the human bus transport and pass only the explicit patch (1.965794ms)
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (247.458073ms)
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (2.750049ms)
✔ zoned uses the IANA zone across DST (28.565406ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (236.010176ms)
✔ two blocking decisions get two DMs with different nonces (144.382429ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.300151ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (125.390755ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (204.217673ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (192.586092ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (132.48634ms)
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (226.611067ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (233.992363ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (118.320469ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (94.655551ms)
✔ an inbox read failure is logged and the next poll retries (1.409802ms)
✔ no Discord id reaches the journal or the log (113.249298ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (71.286517ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (54.509437ms)
✔ the journal: a whole file that is one torn line truncates to empty (29.435327ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (2.300847ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (2.827955ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.526814ms)
✔ the journal: a symlinked directory refuses and says it is a link (0.597224ms)
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.585617ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.467884ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.519466ms)
✔ digest content stays within Discord's 2000 characters (0.368765ms)
✔ runLoop never overlaps ticks and stops after the one in flight (110.36339ms)
✔ a human command refused with human-required prints the other-tree line and exits 3 (4.006243ms)
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.585394ms)
✔ other exit-3 refusals print no other-tree line (2.246136ms)
✔ the line names no path (0.15946ms)
✔ project init/check use declared business repo and never contact the bus (182.263126ms)
✔ project commands validate args and refuse undeclared projects and agent init (35.65919ms)
✔ project dispatcher reaches the human CLI (117.090338ms)
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (758.840692ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (499.524781ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (594.108914ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (303.569235ms)
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4415.630353ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (526.939803ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (202.019081ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (220.617525ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (191.803318ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (192.633764ms)
✔ inherited service.d override refuses without changing the unit (213.873028ms)
✔ inherited drop-in unreadable directory or file refuses before writing (205.226014ms)
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (224.693752ms)
✔ talk --tester refuses text without the [mos test] prefix before any call (114.418366ms)
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (129.233542ms)
✔ decide, stop and launches take no --tester (189.784694ms)
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.406072ms)
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.656394ms)
✔ talk --tester to a stopped role says nobody is told to launch it (174.753155ms)
✖ 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 (20289.307699ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (264.278986ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30132.369423ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20166.195003ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (123.779554ms)
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20203.107203ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (257.451435ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (104.2624ms)
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (523.56421ms)
✔ the transport writes {business, verb, args} to the child and reads its JSON (51.20011ms)
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2188.017122ms)
✔ busExit and refuseInsideAgent (0.635562ms)
✔ talk sends a REQUEST, prints and reads only the reply to it, and leaves other messages unread (366.400166ms)
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1159.768427ms)
✔ a late reply the Console has listed stays unread for mosaic inbox, and the next talk skips it (2346.666044ms)
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (944.888744ms)
✔ talk to a role launch.by can't launch says it isn't in the launch block (144.870441ms)
✔ talk to a stopped role prints the waiting line once, skips a non-reply and prints the reply (236.244028ms)
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (109.627425ms)
✔ launches off and on go to the broker and change the business's launch state (101.990085ms)
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (119.454281ms)
ℹ tests 202
ℹ suites 0
ℹ pass 196
ℹ fail 6
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 91785.656988
✖ failing tests:
test at tests/git-socket.test.mjs:681:1
✖ land: the squash runs the gate in its own worktree, then main moves and the broker records it (405.51588ms)
AssertionError [ERR_ASSERTION]: Applied-under: git socket land (bus host)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/git-socket.test.mjs:704:201)
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: false,
expected: true,
operator: '==',
diff: 'simple'
}
test at tests/thread-launch.test.mjs:157: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 (20289.307699ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async ask (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:143:17)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:169:17)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
test at tests/thread-launch.test.mjs:205:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (264.278986ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'launch-failed'
- 'capacity-full'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:216: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: 'launch-failed',
expected: 'capacity-full',
operator: 'strictEqual',
diff: 'simple'
}
test at tests/thread-launch.test.mjs:230:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30132.369423ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:240: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 tests/thread-launch.test.mjs:247:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20166.195003ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:268: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 tests/thread-launch.test.mjs:305:1
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20203.107203ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:319:15)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
@@ -0,0 +1,70 @@
✖ 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 (20089.359097ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (213.225675ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30097.204022ms)
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20111.345033ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (64.830451ms)
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20124.549297ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (188.933703ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (65.066059ms)
ℹ tests 8
ℹ suites 0
ℹ pass 3
ℹ fail 5
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 91061.303114
✖ failing tests:
test at tests/thread-launch.test.mjs:157: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 (20089.359097ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async ask (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:143:17)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:169:17)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
test at tests/thread-launch.test.mjs:205:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (213.225675ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'launch-failed'
- 'capacity-full'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:216: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: 'launch-failed',
expected: 'capacity-full',
operator: 'strictEqual',
diff: 'simple'
}
test at tests/thread-launch.test.mjs:230:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30097.204022ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:240: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 tests/thread-launch.test.mjs:247:1
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20111.345033ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:268: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 tests/thread-launch.test.mjs:305:1
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20124.549297ms)
Error: timed out waiting
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:319:15)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
@@ -0,0 +1,27 @@
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1202.307722ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (431.292479ms)
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (879.568947ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3595.780022ms)
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (362.623568ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (142.570763ms)
✔ a runner that stops at once ends its launch with the runner's reason (209.45992ms)
✔ a Claude Code launch with no session credential refuses before it starts (113.602047ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (195.268534ms)
✔ a runner killed from the host ends its launch as killed, not failed (260.755627ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (119.116659ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1017.539544ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (668.125675ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3653.685549ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (124.518299ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (123.525994ms)
✔ a launch client that never closes its side doesn't hold the host's close (127.649735ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1268.041829ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.577645ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14588.082229
@@ -0,0 +1,40 @@
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1221.688504ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (431.583027ms)
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (883.815567ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3596.266654ms)
✖ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (107.851503ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (138.328266ms)
✔ a runner that stops at once ends its launch with the runner's reason (208.047689ms)
✔ a Claude Code launch with no session credential refuses before it starts (114.70623ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (222.613902ms)
✔ a runner killed from the host ends its launch as killed, not failed (325.826349ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (124.477897ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1142.29206ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (674.537386ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3614.297677ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (113.518859ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (113.663326ms)
✔ a launch client that never closes its side doesn't hold the host's close (119.225169ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1234.844201ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.595537ms)
ℹ tests 19
ℹ suites 0
ℹ pass 18
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14488.29819
✖ failing tests:
test at tests/launcher.test.mjs:391:1
✖ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (107.851503ms)
TypeError: Cannot assign to read only property 'op' of object '#<Object>'
at Object.assign (<anonymous>)
at wrap (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:393:57)
at setup (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:92:13)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:397:15)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
@@ -0,0 +1,16 @@
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.424583ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.150863ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (35.25504ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.27315ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (141.957345ms)
✔ runGate: the first failing step stops the gate and names its log (213.391947ms)
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.113586ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (529.928359ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1132.663811
@@ -0,0 +1,199 @@
✔ a first launch clones the root at its branch, with the root's path as origin (33.780741ms)
✔ the clone is not at its place until git clone has finished (23.824884ms)
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (68.084632ms)
✔ a clone ahead of the root keeps its commits and counts as current (44.68769ms)
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
✔ a modified file (48.03528ms)
✔ an untracked file (46.359055ms)
✔ a staged file (43.079086ms)
✔ another branch (42.915501ms)
✔ a detached HEAD (49.981539ms)
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (231.50517ms)
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (49.275804ms)
▶ a clone kept before the branch check, or for a failed status, gets no fetch
✔ not-a-clone (30.129059ms)
✔ hooks-present (29.626879ms)
✔ submodule (38.181524ms)
✔ config-changed (32.597796ms)
✔ root-unreadable (31.817972ms)
✔ root-detached (35.217986ms)
✔ status-failed, on the root's branch and clean (37.881384ms)
✔ status-failed, dirty (36.624416ms)
✔ a clone kept before the branch check, or for a failed status, gets no fetch (273.378164ms)
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (37.661727ms)
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (50.16932ms)
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (78.93048ms)
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
✔ user.name (26.868432ms)
✔ user.email (27.934343ms)
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (55.265042ms)
✔ a commit git can't read after the fast-forward is null (48.984355ms)
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (21.541438ms)
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
✔ core.fsmonitor (35.603151ms)
✔ core.hooksPath (34.737046ms)
✔ a hook file (33.232331ms)
✔ include.path (36.30016ms)
✔ includeIf (35.232282ms)
✔ a filter driver (32.900995ms)
✔ origin moved (33.949975ms)
✔ a second origin url (34.74862ms)
✔ the origin url twice, both the root (34.966195ms)
✔ an ext:: origin (37.636707ms)
✔ a branch tracking another remote (32.251826ms)
✔ a branch merging a tag (33.575779ms)
✔ a fetch line onto local branches (34.315906ms)
✔ no origin (38.652341ms)
✔ a config file over the size cap (36.21229ms)
✔ config a symlink to /dev/zero (34.640648ms)
✔ the clone a symlink to the bait (31.285268ms)
✔ the clone a file (32.583438ms)
✔ the clone a plain directory (33.026692ms)
✔ .git a gitdir: file (31.237799ms)
✔ .git a symlink (30.421966ms)
✔ .git/logs a symlink (31.363094ms)
✔ .git/refs/heads a symlink (32.354658ms)
✔ .git/objects a symlink (33.31079ms)
✔ a reflog hard-linked to a file outside (32.521602ms)
✔ HEAD a fifo (31.320266ms)
✔ a commondir file (33.454178ms)
✔ an alternates file (31.914408ms)
✔ a gitlink staged, no .gitmodules (45.229707ms)
✔ a gitlink and .gitmodules staged (45.616457ms)
✔ a gitlink to a repository with its own gitlink (52.44187ms)
✔ a gitlink and .gitmodules committed (47.801858ms)
✔ a gitlink and submodule.active in config (46.540826ms)
✔ a .git/modules with no gitlink (33.556382ms)
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1219.218153ms)
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
✔ missing (9.940027ms)
✔ not a repository (9.805732ms)
✔ a plain directory inside another repository (15.698224ms)
✔ unreadable (11.842842ms)
✔ on no branch (11.847933ms)
✔ missing an object (18.513393ms)
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (78.431515ms)
✔ a clone whose root is on no branch, or gone, is kept and named (28.240299ms)
✔ no credential or forge remote of the root reaches a clone (48.117801ms)
✔ every project in the business file gets its own clone at its own branch (35.215117ms)
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.254587ms)
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1015.975689ms)
✔ a timeout signals git's process group, so a process git started dies with it (512.959495ms)
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (513.521346ms)
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.547572ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.162313ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.068869ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.387808ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (157.717577ms)
✖ runGate: the first failing step stops the gate and names its log (147.364142ms)
✖ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.168203ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (550.085413ms)
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.985402ms)
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.851839ms)
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.279942ms)
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.84569ms)
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.691092ms)
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.199414ms)
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1707.874339ms)
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2469.427669ms)
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (263.65085ms)
✔ resolveSeat: by name under --repo resolves the repo layout (1.252956ms)
✔ resolveSeat: by path resolves the fleet layout (0.315026ms)
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.741634ms)
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.647829ms)
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.896433ms)
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.354151ms)
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.185631ms)
✔ CLI launch: registers, execs the fake launch script, and passes args through (29.540712ms)
✔ CLI launch: --harness lands in the record (28.689824ms)
✔ CLI launch: the launch script's own exit code passes through (26.996727ms)
✔ CLI launch: relaunching a seat rewrites the one registration record (61.34607ms)
✔ CLI launch: omitting --task records an empty string, not null (28.79304ms)
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (83.001905ms)
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (135.400989ms)
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.478489ms)
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.706764ms)
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.71127ms)
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.171762ms)
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (269.787114ms)
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.801036ms)
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.689715ms)
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.269757ms)
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.466905ms)
✔ session file and launch log: 0600, the session file written once (1.010292ms)
✔ endReason maps the runner's exit codes; a signal is killed (0.116223ms)
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.193741ms)
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.588223ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (2.867402ms)
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.871553ms)
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (281.694173ms)
✔ workRef and validBranch take only what a ref name can hold (1.147966ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (160.304935ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (136.741882ms)
✔ a branch with no history in common with main refuses unrelated-history (72.040763ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (49.363452ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (173.705653ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (96.934926ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (89.154899ms)
✔ only a v2 bundle with the named branch is read (54.575858ms)
✔ a branch named main, or named for another task, moves only this task's work ref (99.122228ms)
✔ a record that throws moves the work ref back, or removes a new one (156.481748ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (396.377187ms)
✔ a root that can't be read refuses root-unreadable (31.210664ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2195.080989ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1029.037334ms)
✔ a working repository path that isn't a directory refuses (23.617561ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (120.949682ms)
✔ review of a project with no working repository refuses unknown-commit (13.391771ms)
✔ the runner's git tools hold the host's limits and branch rule (1.241609ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (215.29908ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (147.057776ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (121.311561ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (361.948194ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (247.841541ms)
ℹ tests 148
ℹ suites 0
ℹ pass 146
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6055.97211
✖ failing tests:
test at tests/landing.test.mjs:126:1
✖ runGate: the first failing step stops the gate and names its log (147.364142ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/landing.test.mjs:132:10)
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) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
test at tests/landing.test.mjs:142:1
✖ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.168203ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/landing.test.mjs:163:10)
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) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,29 @@
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:49:43
pkg-bus rc=0 18:49:43-18:49:55 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 11643.870722
pkg-business rc=0 18:49:55-18:49:57 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1902.454793
pkg-cli rc=0 18:49:57-18:50:17 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 19914.143774
pkg-cli-launcher rc=0 18:50:17-18:50:31 ℹ pass 19 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 14753.442572
pkg-control-board rc=0 18:50:31-18:50:32 ℹ pass 124 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 601.318424
pkg-conversation rc=0 18:50:32-18:51:20 ℹ pass 182 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 47622.749502
pkg-discord rc=0 18:51:20-18:51:22 ℹ pass 183 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2585.981236
pkg-harness rc=0 18:51:22-18:51:34 ℹ pass 108 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12062.67946
pkg-ledger rc=0 18:51:34-18:51:57 ℹ pass 86 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 22208.339871
pkg-mosaic rc=0 18:51:57-18:51:59 ℹ pass 69 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2056.635811
pkg-plugins rc=0 18:51:59-18:51:59 ℹ pass 28 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 223.296533
pkg-project rc=0 18:51:59-18:52:00 ℹ pass 30 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1176.427414
pkg-runs rc=0 18:52:00-18:52:01 ℹ pass 43 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 718.469224
pkg-seat rc=0 18:52:01-18:52:07 ℹ pass 148 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 6079.672118
pkg-tasks rc=0 18:52:07-18:52:12 ℹ pass 97 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 5020.853991
pkg-webui rc=0 18:52:12-18:53:07 ℹ pass 113 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 55154.695667
script-auth rc=0 18:53:07-18:53:08 | selftest: 15 passed, 0 failed
script-conductor rc=0 18:53:08-18:53:13 | selftest: 17 passed, 0 failed
script-config rc=0 18:53:13-18:53:15 | selftest: 24 passed, 0 failed
script-discord rc=0 18:53:15-18:53:22 | discord suite: 78 passed, 0 failed
script-extension-package rc=0 18:53:22-18:53:23 | extension package selftest: 18 passed, 0 failed
script-foundation rc=0 18:53:23-18:54:02 | selftest: 44 passed, 0 failed
script-land-work rc=0 18:54:02-18:54:15 | land-work selftests: 84 passed, 0 failed
script-queue rc=0 18:54:15-18:54:46 ℹ pass 156 ℹ fail 0 | queue suite: 28 passed, 0 failed
script-release rc=0 18:54:46-18:54:57 | selftest: 14 passed, 0 failed
script-task rc=0 18:54:57-18:55:25 | selftest: 98 passed, 0 failed
GATE_PASSED 18:55:25
network darkwing-r137_default removed
+33
View File
@@ -0,0 +1,33 @@
#!/bin/bash
set -o pipefail
# Darkwing builder gate, row 137 (#1631), candidate in the r137 worktree on
# base 7a2987cf5. Every package's node suite except queue's (test-queue.sh
# runs it), then every scripts/test-*.sh, sequential, each teed to its own
# log; stops at the first failure. cli's launcher test runs on its own under
# the session's inherited TMPDIR (the bwrap runner fails "did not start" under
# an override or with TMPDIR unset).
G=$HOME/darkwing-scratch/r137/wt
OUT=$HOME/darkwing-scratch/r137/gate${1:+-$1}
INHERITED_TMPDIR=${TMPDIR:?the session TMPDIR}
export TMPDIR=$HOME/darkwing-scratch/r137/tmp
export COMPOSE_PROJECT_NAME=darkwing-r137
dropnet() { n=${COMPOSE_PROJECT_NAME}_default
if docker network inspect "$n" >/dev/null 2>&1; then
c=$(docker network inspect -f '{{len .Containers}}' "$n"); [ "$c" = 0 ] && docker network rm "$n" >/dev/null && echo "network $n removed" || echo "network $n kept, $c containers"
fi; }
trap dropnet EXIT
mkdir -p "$OUT" "$TMPDIR"
cd "$G" || exit 9
[ -e "$G/node_modules" ] || { echo "STOP no node_modules in $G"; exit 8; }
echo "base $(git rev-parse --short HEAD) DOCKER_HOST=${DOCKER_HOST:-unset} docker=$(docker info --format '{{.ServerVersion}}' 2>/dev/null || echo none) start $(date -u +%H:%M:%S)"
run() { local name="$1" dir="$2" cmd="$3" t0; t0=$(date -u +%H:%M:%S)
(cd "$G/$dir" && bash -c "$cmd") 2>&1 | tee "$OUT/$name.log" > /dev/null; local rc=$?
echo "$name rc=$rc $t0-$(date -u +%H:%M:%S) $(grep -E '^ℹ (pass|fail|skipped) [0-9]+' "$OUT/$name.log" | tr '\n' ' ') | $(tail -n1 "$OUT/$name.log")"
[ $rc -eq 0 ] || { echo "STOP $name"; exit $rc; }; }
for d in packages/*/; do p=$(basename "$d"); [ -d "$d/tests" ] || continue; [ "$p" = queue ] && continue
if [ "$p" = cli ]; then
run pkg-cli packages/cli 'node --test $(ls tests/*.test.mjs | grep -v "^tests/launcher\.test\.mjs$")'
run pkg-cli-launcher packages/cli "TMPDIR=$INHERITED_TMPDIR node --test tests/launcher.test.mjs"
else run "pkg-$p" "packages/$p" 'node --test tests/*.test.mjs'; fi; done
for s in scripts/test-*.sh; do n=$(basename "$s" .sh); run "script-${n#test-}" . "bash $s"; done
echo "GATE_PASSED $(date -u +%H:%M:%S)"
@@ -0,0 +1,310 @@
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (144.05929ms)
✔ agents: working counts what the holder received and has not read; routed alone is not working (213.346928ms)
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (345.556383ms)
✔ agents: working wins over waiting, and Input needed still shows (179.954512ms)
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (210.800758ms)
✔ agents: state reads only its own business, even for a run name both use (175.100516ms)
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (214.74548ms)
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (182.239793ms)
✔ agents: stranded is oldest first and capped at 50 for a role (885.389857ms)
✔ agents: stranded is per role and per business (329.753864ms)
✔ agents: a message routed to a held role and not yet received is not stranded (136.839639ms)
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (265.502052ms)
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (194.901872ms)
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (268.53578ms)
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (264.138006ms)
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (247.882667ms)
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (352.427312ms)
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (175.464817ms)
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (269.391653ms)
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (293.680928ms)
✔ launch events require a human CLI capability; generic emit cannot forge authority events (191.580167ms)
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (192.187452ms)
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (260.938844ms)
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (178.170841ms)
✔ task action subjects and linked decision trail are complete and ordered (181.627308ms)
✔ launch binding is durable and reconnecting requires the identical trusted record (110.334877ms)
✔ business isolation includes inherited object names and cross-business message references (194.872137ms)
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (325.151088ms)
✔ task projection uses schema current view, skipping earlier and equal-start polls (151.025872ms)
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (225.769996ms)
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (151.980561ms)
✔ both arbiters require human resolution when their cross-role route is themselves (246.483924ms)
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (175.47955ms)
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.215999ms)
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (254.44728ms)
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (326.383224ms)
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (254.756276ms)
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (244.248268ms)
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (255.167246ms)
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (279.645384ms)
✔ REQ-COS-1: the chief of staff cannot end its own run or the assistant's through role.end (262.029861ms)
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (270.183817ms)
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (311.670727ms)
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (305.806919ms)
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (385.436063ms)
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (547.299838ms)
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (971.93228ms)
✔ comment cursors isolate businesses, move only forward and remain append-only (146.56018ms)
✔ only trusted sync writes validated cursors; events and cursor share rollback (119.600379ms)
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (879.596381ms)
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1516.80763ms)
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (797.021667ms)
✔ migration refuses mismatched source metadata without changing schema or evidence (767.716303ms)
✔ offline command migrates only the supplied fixture root and reports usage errors (1031.434504ms)
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (106.572352ms)
✔ credentials refuses a role session and any argument (174.177222ms)
✔ credentials reads the status on each request, and a broker without one lists none (222.966953ms)
✔ the broker process answers credentials without a token, path or variable in its output, log or store (218.695392ms)
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.93501ms)
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (2.415081ms)
✔ expiry refuses use and env references never become client data (0.653496ms)
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.22835ms)
✔ opaque tokens shorter than 16 characters refuse before use (0.291602ms)
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (2.333507ms)
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (472.617413ms)
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (483.596555ms)
✔ chief-executive-officer: another C-suite role isn't on the lists either (398.904562ms)
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (439.372537ms)
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (491.050882ms)
✔ chief-financial-officer: another C-suite role isn't on the lists either (386.048306ms)
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (472.419681ms)
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (455.229065ms)
✔ chief-information-officer: another C-suite role isn't on the lists either (410.738186ms)
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (529.453115ms)
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (516.767302ms)
✔ chief-information-security-officer: another C-suite role isn't on the lists either (387.98007ms)
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (437.277805ms)
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (434.285457ms)
✔ chief-marketing-officer: another C-suite role isn't on the lists either (343.030321ms)
✔ a human resolve sends the raising role one message from the human, and its request is the answer (227.47827ms)
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (241.261649ms)
✔ a human withdraw sends one message with the note (243.397158ms)
✔ a human seen before the close leaves the request on the close's answer, not the seen (313.858185ms)
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (263.109493ms)
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (291.209925ms)
✔ a raising role nobody holds at the close gets the message on the next claim (247.910634ms)
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (236.878189ms)
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (286.201279ms)
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (297.082822ms)
✔ a route the raiser hears from is allowed, checked from the route to the raiser (358.292683ms)
✔ a refused supersede withdraws nothing (295.233421ms)
✔ the assistant's within-role and gated raises still work (300.699805ms)
✔ roles lists open decisions routed to a role, and never the human inbox (210.465021ms)
✔ recent lists closed decisions of every route, newest close first, with how each closed (302.276529ms)
✔ recent gives the closing event as closed when the decision was seen first (300.372063ms)
✔ recent stops at RECENT rows (793.217442ms)
✔ every row is what trail already gives the same session for that id (263.144818ms)
✔ a role session can't list decisions, so it can't read another role's open decisions (429.759421ms)
✔ decisions is a read: one business, strict arguments, nothing written (393.163901ms)
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (142.917216ms)
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (143.986521ms)
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (155.472208ms)
✔ endLaunch leaves a claim another run took alone (192.667767ms)
✔ refuse records action.refused against the caller with the code only (134.34704ms)
✔ launches off refuses role.launch with launch-revoked until launches on (205.787798ms)
✔ broker process: launch ops authorize role.launch, record refusals and end runs (311.617838ms)
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.428167ms)
✔ process reader gets own kernel identity without exposing environment values (0.538745ms)
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.663909ms)
✔ real pid 1 remains inspectable when its environment is protected (0.243614ms)
✔ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (245.354458ms)
✔ checkLand refuses on the decision and the review (325.023483ms)
✔ a merge option with no first line refuses no-subject, as land-work does (252.355977ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (583.610972ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (238.540455ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (267.964982ms)
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (290.740704ms)
✔ no run may write the action.allowed for git.merge.protected itself (163.341282ms)
✔ a message to a stopped role sends launch.by one notice, and the result says so (203.923332ms)
✔ a message to a role outside launch.instances says so in its result and in the notice (173.36188ms)
✔ a message to a running role sends no notice and its result is unchanged (157.876236ms)
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (255.323027ms)
✔ a run launched but not yet claimed counts as no holder (139.757418ms)
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (258.179438ms)
✔ a business with no launch block tells nobody and says there is no launcher (116.612643ms)
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (332.223962ms)
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (202.946908ms)
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (290.873044ms)
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (451.637256ms)
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (208.532641ms)
✔ missing and foreign-business citations refuse and roll back message and grant (206.947969ms)
✔ cross-role sends still need a matching resolved decision and consume it once (271.944948ms)
✔ messages pages all human messages newest first without writes; read state is history (2563.822625ms)
✔ messages refuses role callers, invalid paging and cursors outside this human feed (265.300298ms)
✔ views messages passes only its paging arguments through (0.51912ms)
✔ messages isolates businesses even with a valid foreign cursor (171.903575ms)
✔ the assistant sends to the user and to the chief of staff only (306.537956ms)
✔ an assistant send to any other role, or to the tester, is refused and logged (331.658653ms)
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (339.31255ms)
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (337.231323ms)
✔ a sender-side list alone refuses a send to a role that has no list (320.785661ms)
✔ a target-side list alone refuses a send from a role that has no list (336.350706ms)
✔ the sender list is checked before the target list (293.643159ms)
✔ roles without the field behave exactly as before (427.337522ms)
✔ a business with no role definitions at all is unlimited (344.528011ms)
✔ a malformed messaging field refuses at boot (123.355385ms)
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (384.105943ms)
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (449.896392ms)
✔ review requests and verdicts between roles without the field are unchanged (314.692601ms)
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (189.424426ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (474.947934ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (441.022854ms)
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (214.082489ms)
✔ startup token refusal returns safe code without value or partial listening broker (67.208041ms)
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (200.354192ms)
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (226.239933ms)
✔ trusted host registers later launches; socket clients never have a registration verb (229.84155ms)
✔ runtime excludes declared project roots even when host supplies no repoRoots (64.094057ms)
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (210.437994ms)
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (150.599482ms)
✔ D2: spec.read refuses without content if its role is released during the read (151.653041ms)
✔ D3: spec.read secret check refuses flagged content without content (141.445631ms)
✔ D3: spec.read secret check refuses flagged subject without content (184.04861ms)
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.372603ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (202.918249ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (213.18783ms)
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (219.245447ms)
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (228.472489ms)
✔ a message with no reply gives an empty list (156.927627ms)
✔ replies come oldest first and stop at REPLIES (741.089021ms)
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (292.641353ms)
✔ strict arguments; a role session gets human-required (371.177219ms)
✔ views passes replies through as one call with the id (0.238469ms)
✔ requirements returns the committed list to a holding role session, and no one else (215.226683ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (159.499926ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (167.25647ms)
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (246.528365ms)
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (241.635802ms)
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (291.751571ms)
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (360.022747ms)
✔ reviewFetch answers only the addressed reviewer, for the request it cites (235.238553ms)
✔ review.verdict answers one request once, to the role that asked (312.244488ms)
✔ task.close on a pushed task needs an approve verdict for the latest push (404.675532ms)
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (295.287783ms)
✔ v3b prototype refusals, views and append-only mutations (1443.370064ms)
✔ gated approval authorizes once, survives store reopen, and fresh approval works (248.27825ms)
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (207.879642ms)
✔ two scheduled callers have exactly one grant and one consumed refusal (156.645944ms)
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (319.755398ms)
✔ class drift gated to cross-role refuses before consumption (217.404565ms)
✔ class drift cross-role to gated refuses before consumption (256.569884ms)
✔ class drift gated to within-role refuses before consumption (225.502317ms)
✔ class drift cross-role to within-role refuses before consumption (282.531965ms)
✔ class drift within-role to gated refuses before consumption (246.975882ms)
✔ class drift within-role to cross-role refuses before consumption (226.516789ms)
✔ message.send consumes approval and prevents a later send or authorize (293.698376ms)
✔ role.revoke consumes approval and prevents a later revoke or authorize (258.574863ms)
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1339.585071ms)
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (252.134135ms)
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (189.047194ms)
✔ two real socket writes to one repository yield one commit and one project-busy refusal (209.570865ms)
✔ client disconnect during await tolerates late reply (170.261308ms)
✔ client disconnect during await tolerates late refusal (187.686062ms)
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (362.119637ms)
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (295.80187ms)
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (312.815983ms)
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (227.988018ms)
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (262.196464ms)
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (227.301945ms)
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (314.739815ms)
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (149.711731ms)
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (425.596753ms)
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (455.988926ms)
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (407.786491ms)
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (290.270226ms)
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (588.532539ms)
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (432.620333ms)
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (227.947296ms)
✔ a business that never switched launches reads allowed with no time and no event (131.231526ms)
✔ launches revoked and then restored read allowed, with the restore time and event id (156.726798ms)
✔ a task closed on the tracker leaves the open list, and total counts the open ones (137.986053ms)
✔ a tombstone is not open (144.321565ms)
✔ the open list stops at the cap and says so; total still counts every open task (144.096806ms)
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (139.384511ms)
✔ a human session reads the same state, with the same cap (165.792148ms)
✔ reading state writes nothing: every table keeps its row count (168.096666ms)
✔ creates private WAL store and excludes a second writer until explicit close (125.795527ms)
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (177.078756ms)
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (184.619521ms)
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (198.388518ms)
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (113.13483ms)
✔ async transactions refuse before invoking their function (107.323659ms)
✔ the session default fits under the reply cap and pages to the end with next (313.561137ms)
✔ the short form: no description, assignees by role, every listed key (277.454348ms)
✔ each filter, alone and together, and total counts every match (343.794468ms)
✔ task_ref reads one task in full, as the whole board has it (377.385568ms)
✔ no arguments is the read the Console and mosaic make, unchanged (249.971048ms)
✔ an unknown argument or a bad value refuses invalid-request (909.062664ms)
✔ tasks rows carry priority and requirement for every session that reads tasks (334.485901ms)
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (371.119884ms)
✔ an empty business and one with snapshots but no task.created read cleanly (114.388617ms)
✔ recordTask keeps sync reads and a role write apart (203.854399ms)
✔ read_at must be one canonical UTC format, so the projection compares strings safely (115.386305ms)
✔ a bad entry refuses the whole record (135.404217ms)
✔ taskView reads the projection for one business (145.342065ms)
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (279.3021ms)
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (495.938555ms)
✔ without an adapter the server refuses every task verb (212.882634ms)
✔ the runtime refuses an invalid adapter and closes a valid one (199.108836ms)
✔ the process loads the S3 adapter from plain-data trackers (324.23708ms)
✔ the tester binds only when the business sets bus.tester to exactly true (879.263527ms)
✔ a business may not name a role tester, so the tester address is never a role (300.496414ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (541.744279ms)
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (225.91737ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (252.162895ms)
✔ the tester reads the human views a reader reads (168.249503ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.080436ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.318087ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.208512ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (109.507557ms)
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (880.628091ms)
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1144.651491ms)
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (789.919403ms)
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (801.50748ms)
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (366.655408ms)
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1204.453558ms)
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (322.820901ms)
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3551.967817ms)
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (144.409622ms)
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (157.570831ms)
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (273.600268ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (233.703195ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (188.016116ms)
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (136.142461ms)
✔ REQ-USER-2: the human verbs refuse another owner's thread (184.452407ms)
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (124.182281ms)
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (151.70596ms)
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (490.86068ms)
✔ socket capability stamps launch identity; shared views use wire, no SQL client (160.442983ms)
✔ two wire claims serialize; a lost reply never automatically retries (180.376464ms)
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (117.750631ms)
✔ client preserves UTF-8 when a response divides a multibyte character (11.585371ms)
✔ committed mutation followed by dropped reply reports unknown and is never retried (183.173211ms)
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (167.981984ms)
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (169.817193ms)
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (258.876929ms)
✔ a broker with no web service refuses a granted role (145.330454ms)
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (201.981838ms)
✔ a session that is not the role holder is refused (132.040888ms)
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (373.993538ms)
✔ web.search with no search source configured is a refused result, not an error (144.461978ms)
✔ a search source that fails with its own refusal, or that throws, is handled (180.174112ms)
✔ a slow search source ends in a refusal at the deadline (186.269174ms)
✔ a secret in the arguments is refused before anything is trailed or fetched (132.148515ms)
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (215.793213ms)
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.241426ms)
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (189.721166ms)
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (176.24401ms)
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (439.994006ms)
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (195.29039ms)
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (189.385971ms)
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (159.218931ms)
ℹ tests 302
ℹ suites 0
ℹ pass 302
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 11643.870722
@@ -0,0 +1,117 @@
✔ the role file loads and resolves through loadBusiness (7.295639ms)
✔ the shipped file is exactly the approved list (1.015557ms)
✔ the assistant's authority is message.send and record.write within role (2.744656ms)
✔ the assistant talks to the user and the chief of staff only, and no other shipped role is limited (0.741397ms)
✔ a business grant through limits does not widen the role (1.860594ms)
✔ a launch block whose by is the assistant is refused (3.582574ms)
✔ the instance takes no credential references and no tracker (5.816844ms)
✔ an arbiter whose role definition declares messaging lists is refused, for each kind (7.824869ms)
✔ an arbiter without messaging lists is accepted beside the limited assistant (4.580557ms)
✔ the contract passes work to the chief of staff and directs no one (0.847222ms)
✔ REQ-HARN-2: the assistant holds the web grant, and no other role file does (1.541725ms)
✔ config directory and file path follow MOSAIC_CONFIG (2.010692ms)
✔ the fixture business validates and comes back frozen (5.766025ms)
✔ two instances may share a definition (1.983435ms)
✔ top-level refusals (5.955983ms)
✔ arbiters and projects (9.224749ms)
✔ role instances (5.611284ms)
✔ Vikunja bots (7.694304ms)
✔ a role without Vikunja takes no tracker block (2.643587ms)
✔ credential references match the definition's services (2.664123ms)
✔ launch (8.140884ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (3.791929ms)
✔ loadBusiness: file checks (1.67058ms)
✔ loadBusiness: not a regular file (35.492597ms)
✔ loading writes nothing (1.025281ms)
✔ names that are Object.prototype properties don't count as declared (2.629262ms)
✔ the shipped example refuses as written and validates once filled in (0.757987ms)
✔ the role file loads and resolves through loadBusiness (8.939764ms)
✔ the shipped file is exactly the approved list (0.306155ms)
✔ the resolved record matches the approved list, so a widened file fails (2.433298ms)
✔ the chief of staff holds role.launch, message.send, role.end, organization.change and record.write; every other action is gated (2.09852ms)
✔ the pm does not hold role.launch (2.194301ms)
✔ a business grant of a gated action through limits does not widen the role (2.968052ms)
✔ a limit that drops role.launch leaves the chief of staff with no launch block (3.635672ms)
✔ a launch block whose by is the pm instance is refused (2.172558ms)
✔ the contract names no duty to talk to the human and the pm contract no launch (0.545488ms)
✔ the instance takes no credential references and no tracker (2.980725ms)
✔ usage errors exit 4 (287.877184ms)
✔ validate: a good business exits 0 and prints instance digests (64.932397ms)
✔ validate: project files (309.581292ms)
✔ validate: missing files and a broken system config (231.238899ms)
✔ validate: credential reference problems exit 2 and name each one (64.023052ms)
✔ validate: a token file inside the repository is refused (57.378655ms)
✔ validate: role definitions come from MOSAIC_ROLES_DIR (181.025248ms)
✔ resolve: prints one instance's record (251.819527ms)
✔ resolve: refusals (378.96756ms)
✔ parse: exactly one of file or env, plus the service's date (3.306724ms)
✔ check: a good file has no problems (1.067342ms)
✔ check never opens the file: a write-only token passes (0.475452ms)
✔ check: file problems (1.215801ms)
✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.16964ms)
✔ check: dates and environment references (0.532944ms)
✔ each definition loads, with a contract file, and is exactly the approved list (4.343331ms)
✔ an organization file that declares them passes, and each resolves to least privilege (7.165442ms)
✔ the chief of staff launches each one; no other role does (4.710977ms)
✔ a C-suite role can't be made the launcher: launch.by must hold role.launch (2.924979ms)
✔ limits can narrow a C-suite role but never widen it (2.405157ms)
✔ any unknown key, tool, action or version in a role file is refused (1.417506ms)
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (19.878316ms)
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (1.115318ms)
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (211.921651ms)
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (234.929059ms)
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (2.991907ms)
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (196.269825ms)
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.858399ms)
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (117.367157ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (15.053581ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (249.570124ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (344.954801ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.466084ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (45.193425ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.350106ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (96.044149ms)
✔ optional project repo is preserved and must be a normalized absolute path (13.21796ms)
✔ loaded business project repo cannot be nested in any declared code checkout (3.973366ms)
✔ path and load (3.009119ms)
✔ refusals (1.646795ms)
✔ record.write is within-role for the eleven approved v2 agents, never gated-only (4.410754ms)
✔ systemVars flattens the validated config (2.79505ms)
✔ precedence: system, business, project, project role, agent (8.008792ms)
✔ limits narrow the definition and never widen it (4.634502ms)
✔ role.launch stays within-role only for the instance the launch block names (6.674282ms)
✔ limits.authority without role.launch leaves the launcher with no launch block (2.383492ms)
✔ limits.authority narrows cross-role actions too (1.417899ms)
✔ classify (1.21735ms)
✔ the record carries what the broker and launcher need (0.844633ms)
✔ digest: key order doesn't matter, any value change does (7.963973ms)
✔ refusals (1.877433ms)
✔ the four shipped version 2 roles load (4.380209ms)
✔ shipped role scopes match addendum B section 2 and the SR runbook (1.748847ms)
✔ shipped authority follows the note's table (1.010085ms)
✔ every role file in roles/ loads through the validator, and a v2 contract exists (1.104631ms)
✔ version 1 files keep loading with no authority (1.583923ms)
✔ the conductor policy isn't a role (0.26823ms)
✔ a missing role file is exit 4, a symbolic link too (0.543889ms)
✔ version 2 refusals (1.907805ms)
✔ authority: closed vocabulary, no gated-only action, no overlap (3.612598ms)
✔ messaging: optional, role definitions and human, never the tester (2.392288ms)
✔ credentials: Gitea scopes (1.113399ms)
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.007523ms)
✔ credentials: services (0.431382ms)
✔ contract: a non-empty regular Markdown file beside the role file (0.731417ms)
✔ every key names known layers and a merge rule (1.053692ms)
✔ unknown keys and wrong layers refuse (0.659538ms)
✔ types (2.289186ms)
✔ merge: defaults, then the most specific layer wins (0.252787ms)
✔ merge: limits only narrow, and provenance lists each source (0.366087ms)
✔ merge doesn't change its inputs (0.138391ms)
✔ web.searxng takes https anywhere and http on loopback, so Jason's 127.0.0.1:8888 passes (0.24056ms)
ℹ tests 109
ℹ suites 0
ℹ pass 109
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1902.454793
@@ -0,0 +1,27 @@
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1199.665821ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (435.850497ms)
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (877.080276ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3594.111026ms)
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (416.61912ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (208.996173ms)
✔ a runner that stops at once ends its launch with the runner's reason (221.990934ms)
✔ a Claude Code launch with no session credential refuses before it starts (114.83846ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (200.914036ms)
✔ a runner killed from the host ends its launch as killed, not failed (256.566631ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (115.969336ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1173.546373ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (673.294266ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3611.82562ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (103.196827ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (110.866327ms)
✔ a launch client that never closes its side doesn't hold the host's close (114.035064ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1231.20764ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.665307ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14753.442572
@@ -0,0 +1,212 @@
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1591.021574ms)
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (79.455607ms)
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (159.318469ms)
✔ NO_COLOR: no escape codes, except reverse video on the selected row (227.017275ms)
✔ 1-9 shows the decide flow's own lines and question; only y resolves (201.365574ms)
✔ the app shows the same decide text as mosaic decide (114.624351ms)
✔ any key but y or Y at the question answers No; nothing is sent (3228.171324ms)
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (442.325414ms)
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (2172.488862ms)
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (225.875066ms)
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (160.691095ms)
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (783.470771ms)
✔ quitting at the question answers No and sends nothing, armed or not (217.73538ms)
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (129.224976ms)
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (126.9589ms)
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (845.989228ms)
✔ at every size the decide box shows each line y depends on, or says it is hidden (8032.986892ms)
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (156.560848ms)
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (122.690774ms)
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (58.979884ms)
✔ keys: views, moving, trail of a selection, the command line, help and quit (259.334087ms)
✔ one option: the status line says Press 1, not 1-1 (99.541378ms)
✔ no business: the app says so and :business picks one (54.107712ms)
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.688651ms)
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (166.033824ms)
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.441383ms)
✔ decide with --note still asks; a No sends nothing (67.113451ms)
✔ the app's business comes from a live bus host only (0.909393ms)
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.54517ms)
✔ draw is pure: same state, same frame (0.703602ms)
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (8.887766ms)
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (830.685852ms)
✔ a missing file is recorded too, and a valid file clears the status on the next start (591.702414ms)
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (178.773192ms)
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (150.264502ms)
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (122.729988ms)
✔ decide prints a declining choice as declining (184.367327ms)
✔ an unknown outcome is reported once and never resent (143.963741ms)
✔ a decision closed before the answer arrives exits 2 and points at its trail (115.226511ms)
✔ a prefix that matches two open decisions exits 2 and resolves neither (173.503987ms)
✔ without --business a command uses the live host's business, and a stale host.json is not a host (196.97232ms)
✔ every human command refuses inside an agent run before it touches the bus (128.292031ms)
✔ usage errors exit 4; no business and no host is a usage error (99.633512ms)
✔ agents and tasks print through the broker (95.340224ms)
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.304509ms)
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (68.404728ms)
✔ trackers come from the tracker.* variables of the one project that names a tracker project (96.642824ms)
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (41.037775ms)
✔ two projects that each name a tracker project refuse, since the boot shape holds one (41.703429ms)
✔ a business without tracker.baseUrl gets no trackers entry (33.546315ms)
✔ an unknown business and a broken system config refuse with exit 3 (66.084291ms)
✔ follow prints an unsolicited message after plain talk returned (227.879932ms)
✔ talk --follow continues after reply and prints a later unsolicited message (198.018636ms)
✔ inbox lists all unread human messages under decisions, does not deliver or read them (3838.508577ms)
✔ follow refuses agent context and bad arguments (747.276022ms)
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (384.221255ms)
✔ plain talk leaves the process SIGINT handlers unchanged (156.711898ms)
✔ empty views say so (1.155373ms)
✔ the trail keeps the broker's order and names a decision's task without its rows (1.537824ms)
✔ tasks print the tracker fields the snapshot carries (0.305215ms)
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (879.022195ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (937.531999ms)
✔ the size cap refuses a push before any byte (397.931343ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (592.104487ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (1286.46415ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1600.269491ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (418.780112ms)
✔ a review of a project the business no longer has refuses unknown-project (924.676162ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (328.578266ms)
✔ close() answers host-closing to a connection still sending its request line (342.814005ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (1087.092917ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (596.417438ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (667.372596ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.720119ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (592.627393ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (44.225799ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.911879ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (455.693055ms)
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (394.070898ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (393.96618ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (379.413456ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (380.610517ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (403.506241ms)
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1042.963277ms)
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (446.878422ms)
✔ a second host for the same data root refuses with exit 3 while the first runs (278.059918ms)
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (615.807438ms)
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (3.027215ms)
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.751732ms)
✔ a live host's lock stays, however old the file is (0.542264ms)
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (924.866953ms)
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (217.648796ms)
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (26.821005ms)
✔ a broker fork that throws leaves no host.lock and no host.json (31.107336ms)
✔ a broker send that throws leaves no host.lock and no host.json (35.758426ms)
✔ a broker that misses its boot wait leaves no host.lock and no host.json (51.071836ms)
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (756.048315ms)
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (738.696623ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (287.346364ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (212.355254ms)
✔ a host.json that can't be written stops both children and leaves no host.lock (300.911136ms)
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (28.332914ms)
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (184.953071ms)
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (693.482872ms)
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (331.353976ms)
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (343.614874ms)
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1581.106304ms)
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (359.476775ms)
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (182.635827ms)
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (223.41664ms)
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (209.801065ms)
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (180.22754ms)
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (188.563553ms)
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (137.843063ms)
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (291.022308ms)
✔ watchChildren reports a child that died before it was called, and one that dies later (25.520935ms)
✔ bus stop refuses to signal a live pid that is not a bus host (202.502773ms)
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (271.007106ms)
✔ bus start refuses with exit 3 without a notifier config (103.002579ms)
✔ bus start runs until bus stop; status reports it while it runs (752.035373ms)
✔ bus-service.sh renders the unit and installs it into a given directory (51.909162ms)
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (63.479256ms)
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (14.536722ms)
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.202513ms)
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (42.165463ms)
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (25.956461ms)
✔ limits view/set use the human bus transport and pass only the explicit patch (2.296534ms)
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (259.872018ms)
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (2.397591ms)
✔ zoned uses the IANA zone across DST (25.173292ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (189.697607ms)
✔ two blocking decisions get two DMs with different nonces (138.42423ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.207029ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (121.539236ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (129.589775ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (187.539261ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (111.577004ms)
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (210.511264ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (272.128758ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (148.373707ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (95.731714ms)
✔ an inbox read failure is logged and the next poll retries (0.800144ms)
✔ no Discord id reaches the journal or the log (186.138968ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (35.731523ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (38.436979ms)
✔ the journal: a whole file that is one torn line truncates to empty (34.253709ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (1.874436ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (2.581045ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (2.948407ms)
✔ the journal: a symlinked directory refuses and says it is a link (0.373186ms)
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.598802ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.481844ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.474711ms)
✔ digest content stays within Discord's 2000 characters (0.28783ms)
✔ runLoop never overlaps ticks and stops after the one in flight (110.292041ms)
✔ a human command refused with human-required prints the other-tree line and exits 3 (2.766139ms)
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.017762ms)
✔ other exit-3 refusals print no other-tree line (1.823116ms)
✔ the line names no path (0.221177ms)
✔ project init/check use declared business repo and never contact the bus (173.891009ms)
✔ project commands validate args and refuse undeclared projects and agent init (40.68926ms)
✔ project dispatcher reaches the human CLI (107.115626ms)
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (596.602542ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (459.372563ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (656.670595ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (344.294121ms)
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4750.465609ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (609.56675ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (267.818684ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (247.678304ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (349.070778ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (200.862718ms)
✔ inherited service.d override refuses without changing the unit (220.381918ms)
✔ inherited drop-in unreadable directory or file refuses before writing (190.24853ms)
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (206.706776ms)
✔ talk --tester refuses text without the [mos test] prefix before any call (110.022621ms)
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (114.825956ms)
✔ decide, stop and launches take no --tester (165.570772ms)
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.378425ms)
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.542788ms)
✔ talk --tester to a stopped role says nobody is told to launch it (140.925825ms)
✔ 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 (6528.684831ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (2066.392531ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4477.84807ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2893.847919ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (99.118035ms)
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (210.200526ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (245.99505ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (96.615805ms)
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (433.90771ms)
✔ the transport writes {business, verb, args} to the child and reads its JSON (43.78643ms)
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2171.47226ms)
✔ busExit and refuseInsideAgent (0.4918ms)
✔ talk sends a REQUEST, prints and reads only the reply to it, and leaves other messages unread (287.659562ms)
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1156.90567ms)
✔ a late reply the Console has listed stays unread for mosaic inbox, and the next talk skips it (2335.399554ms)
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (1292.077277ms)
✔ talk to a role launch.by can't launch says it isn't in the launch block (126.364509ms)
✔ talk to a stopped role prints the waiting line once, skips a non-reply and prints the reply (243.993133ms)
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (99.438483ms)
✔ launches off and on go to the broker and change the business's launch state (101.885841ms)
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (105.148689ms)
ℹ tests 202
ℹ suites 0
ℹ pass 202
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 19914.143774
@@ -0,0 +1,132 @@
✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (10.888837ms)
✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.222722ms)
✔ completed smoke replies and ordinary questions are idle, not human blockers (0.695014ms)
✔ only an explicit first-line input request makes a finished reply waiting (0.144798ms)
✔ tool activity, user text, errors and unfinished turns override attention text (0.119822ms)
✔ STOP access failure is unknown, not absence, under a non-root identity (26.166394ms)
✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (2.465177ms)
✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.190201ms)
✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (5.084404ms)
✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.53972ms)
✔ server rescans connector discovery and refuses HTTP reply without transport (28.805015ms)
✔ connector session links and linked directories are not read (0.969546ms)
✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.21077ms)
✔ CLI print uses the relaunch notice instead of old current preview (54.80542ms)
✔ connector owner and fixed task never inherit a native relaunch notice (1.727576ms)
✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (0.936956ms)
✔ loadConfig: missing file throws ConfigError (1.326856ms)
✔ loadConfig: invalid JSON throws ConfigError (0.261884ms)
✔ loadConfig: missing dataRoot throws ConfigError (0.189803ms)
✔ loadConfig: relative dataRoot throws ConfigError (0.187634ms)
✔ loadConfig: valid config returns dataRoot (0.579646ms)
✔ findNewestSession: picks the newest by mtime among two files (0.406185ms)
✔ findNewestSession: finds files in nested subdirectories (0.268369ms)
✔ findNewestSession: returns null for a missing dir (0.120632ms)
✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.572852ms)
✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.101409ms)
✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.415102ms)
✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (0.983746ms)
✔ deriveState: full state table (0.151896ms)
✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.278753ms)
✔ rule: newest entry is a tool result with no assistant text after it is working (0.260654ms)
✔ rule: a finished ordinary turn is idle, even if it says your move (0.240247ms)
✔ task: the first user message of the session, from text blocks (0.229101ms)
✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.230569ms)
✔ task: no user message in the log means null (shown as unknown), never a guess (0.235798ms)
✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.33822ms)
✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.476204ms)
✔ scan: the written record carries task, workspace and activeProject (0.425522ms)
✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.508379ms)
✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.341825ms)
✔ registration: a record whose pid is gone is stale; derived values win, sources say derived, registered stays with alive false; a pid the probe cannot decide is not stale; pidAlive itself (0.857884ms)
✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.381559ms)
✔ loadRegistrations: a missing seatsDir gives empty lists (0.131345ms)
✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.642531ms)
✔ matchRegistration: matches by sessionsDir, and by realpath through a symlink; sessionsDir null never matches; same seat name with a different sessionsDir does not match (fleet vs repo darkwing) (0.284592ms)
✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (1.080403ms)
✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.229211ms)
✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.408988ms)
✔ scanAgent: ageSeconds is computed from the injected now (0.212592ms)
✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.128874ms)
✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.290571ms)
✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.305484ms)
✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (0.732899ms)
✔ scan: relative boardDir throws ConfigError (0.079779ms)
✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (49.23747ms)
✔ CLI: missing config exits 2 with a refused: message (47.858379ms)
✔ CLI: unknown command exits 2 (50.591731ms)
✔ CLI: unknown --liveness value exits 2 (49.823212ms)
✔ panesRunPi: true when any trimmed line equals 'pi' (0.192496ms)
✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.071154ms)
✔ tmuxIsAlive: a pane running pi is alive (0.181932ms)
✔ tmuxIsAlive: session exists but pi has exited is not alive (0.06911ms)
✔ tmuxIsAlive: no such tmux session is not alive (0.046821ms)
✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.057404ms)
✔ tmuxIsAlive: passes -L <socket> only when a socket is given (0.095249ms)
✔ parsePanes: one pane per line, command and optional tab-separated path (0.078093ms)
✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.076043ms)
✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.090043ms)
✔ loadSeen: missing file returns {} (0.113973ms)
✔ loadSeen: invalid JSON throws ConfigError (0.165747ms)
✔ loadSeen: a JSON array throws ConfigError (0.145241ms)
✔ loadSeen: a non-string value throws ConfigError (0.157019ms)
✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.29243ms)
✔ markSeen: seen false deletes the key (0.243001ms)
✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.206415ms)
✔ markSeen: project containing '/' throws ConfigError (0.1146ms)
✔ markSeen: non-boolean seen throws ConfigError (0.134206ms)
✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.264181ms)
✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.223795ms)
✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.241342ms)
✔ scanAgent: an error-state session with a matching mark is seen (0.244274ms)
✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.495021ms)
✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.171633ms)
✔ taskSetBy: a registered task carries the record's setter; a record without the field (pre-#1511) reads unknown; the value is not copied into registered (0.590734ms)
✔ taskSetBy: null whenever the task shown is not the registered one: no registration, an empty registered task, a stale registration; the field is always present (0.5529ms)
✔ taskSetBy: scan() reads the field from disk through the seat package (bounded there), writes it to the per-agent record and index, and an invalid on-disk value is a registrationError, never a row value (1.351508ms)
✔ isLoopbackHost: recognizes loopback hosts (1.076256ms)
✔ isLoopbackHost: rejects non-loopback hosts (3.963866ms)
✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (2.764653ms)
✔ startServer: serves page, healthz, and a rescanning /api/board (30.484138ms)
✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (5.113572ms)
✔ startServer: /api/board returns 500 JSON with an error field when scan throws (2.033325ms)
✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (49.317158ms)
✔ CLI: serve rejects a non-numeric --port with exit 2 (54.576778ms)
✔ CLI: scan still works after the async cli refactor (49.566434ms)
✔ CLI: live serve prints its URL and answers /healthz (57.404442ms)
✔ page.html: esc() escapes every HTML-significant character (0.642657ms)
✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (7.802869ms)
✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (3.04973ms)
✔ POST /api/seen with invalid JSON returns 400 (1.52427ms)
✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (2.002411ms)
✔ POST /api/seen with a missing agent returns 400 (1.248928ms)
✔ POST /api/board returns 405; PUT /api/seen returns 405 (1.620133ms)
✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (48.19492ms)
✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.30782ms)
✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.24574ms)
✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.201989ms)
✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.137128ms)
✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.273765ms)
✔ page.html: task and active project cells show their source via sourceTag(); the detail has a Registered row via registeredText(); SOURCE_LABEL maps registration to registered; every dynamic value in sourceTag/fromSource/registeredText is escaped (0.55768ms)
✔ POST /api/reply: runs agent-send.sh with -s from the registration, -S <host>:control-board, -m text plus the fixed trailer, no -L on the default socket, MOSAIC_TMUX_SOCKET stripped; answers delivered with the exit code and both streams (32.008463ms)
✔ POST /api/reply: a registration with a tmux socket adds -L <socket> (25.376751ms)
✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (23.779993ms)
✔ POST /api/reply: refusals before the tool runs: empty or blank or long text 400, unknown row 404, no registration 409, stale registration 409, no tmux session 409, bad JSON 400; the tool is never called (14.05863ms)
✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (4.454093ms)
✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (0.175846ms)
✔ page.html: the reply box appears only where canReply() holds (live registration with a tmux session), the detail has a Reply row, the submit posts JSON to /api/reply, receipts and drafts survive a refresh, and every receipt value is escaped (0.562455ms)
✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (2.234822ms)
✔ page.html: the task cell and detail show who set a registered task via setByTag()/setByText(), both escaped, only from rec.taskSetBy; the reply gate does not read it (0.287769ms)
✔ Host/Origin guard: GET /api/board and POST /api/reply refuse a foreign Host, a wrong port and a cross-origin Origin with 403 JSON, before any scan or send, and never send CORS headers (7.785953ms)
✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (36.928879ms)
✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (4.400183ms)
✔ every refusal code the reader can raise has an HTTP status (0.891593ms)
✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (46.137447ms)
ℹ tests 124
ℹ suites 0
ℹ pass 124
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 601.318424
@@ -0,0 +1,190 @@
✔ W1: two processes acquire the same pair at once; exactly one claim (192.905535ms)
✔ W1: two writers publish the same revision at once: one wins, the other gets null, the winner's record stays (31.820809ms)
✔ W1: a revision name appears only after its bytes are synced; before that, only a temp file exists (17.755114ms)
✔ W2: acquire while a claim is reserved or active refuses already-active (332.345527ms)
✔ W3: acquire while stopping, uncertain, or stopped without proof refuses unsafe-replacement (404.606171ms)
✔ W4: same session with another seat tuple, and the reverse, both refuse; a loser on the seat key closes it no-unit (244.528326ms)
✔ W4: a hard link of one session under another seat is the same session: the second controller refuses already-active and launches nothing (199.660361ms)
✔ W4: a copy of one session under another seat is the same session: the second controller refuses already-active and launches nothing (196.934061ms)
✔ W4: a session header ID that changes after construction refuses target; nothing is claimed or launched (2.454403ms)
✔ W5: SIGKILL between every publication barrier of acquire and transition; restart never finds two holders or a lost claim (9865.800484ms)
✔ W5: SIGKILL between every publication barrier of release; restart finishes or holds the release (31662.430741ms)
✔ W6: controller killed mid-turn while the engine lives; restart is uncertain, no launch, prompts refuse (262.000518ms)
✔ W12: a live owner paused with SIGSTOP; a second controller refuses already-active and changes nothing (138.033523ms)
✔ W13: crash after the engine spawns, before active; restart finds the live unit: uncertain, no second spawn, force stop only (416.127032ms)
✔ W14: crash after reservation, before the spawn marker: stopped with a no-unit observation; the pair is free (269.870361ms)
✔ W20: crash after the spawn marker, scope collected; uncertain in both runs, the marker is copied, no launch until a boot proof (342.192583ms)
✔ W15: crash between the two keys during release; restart finishes it under the same claim ID (109.246706ms)
✔ W7: recorded boot ID differs on the same machine: stopped with a boot proof; open tool calls become uncertain (172.308583ms)
✔ W8: resume after a proven stop with the same pins: new claim ID, generation +1, same conversation, branch and leaf (272.153982ms)
✔ W9: resume with a changed binary, argv digest, branch or leaf is refused and the claim is unchanged (802.966757ms)
✔ W11: the controller writes no session file; only the fake engine's own appends appear (187.800639ms)
✔ W16: a highest revision that won't parse holds the pair uncertain; the older stopped revision is not reused (85.854102ms)
✔ W17: a claim root copied from another host refuses foreign-host and promotes nothing (66.087461ms)
✔ G1: a session path or claim root under .pi/state, ~/.claude, the data root or a registration refuses at construction (4.404493ms)
✔ G2: a symlink inside the fixture root to a live session file is refused by the real-path check (1.013057ms)
✔ G3: a fixture path swapped for a live path after construction is refused at bind (1.699707ms)
✔ no shim from this file's tests is left running for the after hook (5.411386ms)
✔ K1: force stop kills a tool child that called setsid; stopped with a verified proof (554.853608ms)
✔ K2: K1 on the process-group fallback ends uncertain, never stopped (441.410655ms)
✔ K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM (560.512734ms)
✔ K4: two engines; force stop one; the other survives by independent observation (2748.412366ms)
✔ K5: a stop during a tool call leaves the effect uncertain, and it is shown (476.148895ms)
✔ K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill (572.123875ms)
✔ K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete (471.989002ms)
✔ K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain (5174.7574ms)
✔ K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop (839.819033ms)
✔ K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop (697.723036ms)
✔ K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain (491.754845ms)
✔ K6: recover without proof, without confirmation, or with changed pins is refused (725.556844ms)
✔ K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed (369.232319ms)
✔ K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop (555.246544ms)
✔ K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced (3307.26963ms)
✔ K16: a claim from another machine ID refuses foreign-host; no boot proof is issued (43.439044ms)
✔ K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine (374.058381ms)
✔ K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof (351.809086ms)
✔ K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names (63.054165ms)
✔ R1: after a proven force stop the controller releases the scope; the shim and the unit are gone (383.664723ms)
✔ R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run (488.644069ms)
✔ R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence (1104.7877ms)
✔ E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released (393.563689ms)
✔ E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it (2515.619987ms)
✔ E3: an engine exit and a force stop take one escalation slot, in either order (1020.610519ms)
✔ E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot (954.767091ms)
✔ E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current (2574.344704ms)
✔ E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks (339.706442ms)
✔ R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on #1533) (394.479085ms)
✔ R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope (129.013545ms)
✔ R7: controller killed after the claim is stopped, before the release: the restart releases the scope (2588.312589ms)
✔ R8: controller killed between the two keys' stopped revisions: the restart releases the scope (447.55983ms)
✔ R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one (441.930316ms)
✔ R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on #1536) (376.282428ms)
✔ R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more (2539.229003ms)
✔ R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed (248.376051ms)
✔ no shim from this file's tests is left running for the after hook (4.14531ms)
✔ S1: `/goal x`, with leading spaces or a tab, refuses text-policy at admission; zero engine bytes (192.679869ms)
✔ S2: every prefix pinned Pi interprets is refused, from the list the code uses; the rest reach the engine exactly (187.428899ms)
✔ S3: `/goal` on the second line is pinned from the source: Pi checks only index 0, so it is admitted and sent exactly (187.016888ms)
✔ S4: a `/` left in the composer is cleared when control transfers and returns; the next submit sends only the new text (296.185434ms)
✔ S5: an observer terminal gets a paste then Enter, as send-message.sh does: not admitted: controller, nothing sent (192.193114ms)
✔ S6: a mediated-shaped registration (no tmux) passed to the board's replyToRow: 409 no tmux session; exec never runs (0.476499ms)
✔ S7: ESC, bracketed-paste markers and U+2028/U+2029 travel as one JSON string; the engine receives the exact text in one record (186.33684ms)
✔ P3: a Pi confirm, select, input or editor dialog is shown disabled with a reason and never answered (302.697904ms)
✔ E1: send, ack, user, toolCall, toolResult, final answer: shown once, no refresh, draft and reading position kept (197.0822ms)
✔ E2: U+2028, U+2029 inside JSON strings and CRLF line ends each parse as one record, on the splitter and through the controller (196.203943ms)
✔ E3: a multipart final, two blocks, null request correlation and duplicate delivery (200.659798ms)
✔ E4: a page read after message_end but before its entry is persisted: marker at the seam, re-read after run-settled, each message once (193.303673ms)
✔ E4: a gap or a new epoch also reconciles; nothing is concatenated across a gap (10.850223ms)
✔ E5: an unknown native event gives no client event; evidence records its type and bytes; the terminal count goes up (194.518832ms)
✔ E6: a tool result delayed across a pause and a reconnect is reconciled without a manual refresh (210.696139ms)
✔ E7: the terminal renders the same stream as the library client, as observer and then as controller, and submits only as controller (254.806462ms)
✔ terminal: engine control characters are made visible; a lost connection refuses submit (190.399337ms)
✔ terminal: outcome unknown is shown as such, with no resend offer, and nothing is resent (0.378716ms)
✔ terminal: text after Enter in the same input chunk starts the next message; it never joins the one submitted (0.274749ms)
✔ terminal: a paste-start marker split right after its ESC still opens the paste; the Enter inside it never submits (0.30238ms)
✔ terminal: Ctrl-T then Enter in one chunk is judged after the takeover, as if typed one key at a time (Filbert F2, #1507) (0.459794ms)
✔ terminal: input held behind Ctrl-T waits for that takeover while an earlier action is still pending (Darkwing T1 on #1522) (30.981075ms)
✔ terminal: a hold inside held input holds again, and once it is drained later input and Ctrl-C still reach the terminal (Darkwing note 1 on #1522) (0.393389ms)
✔ terminal: an action that throws still releases the input held behind it, in order, then rethrows (5.710595ms)
✔ terminal: after an action throws, later input still runs; input() puts the error in the status line (Filbert N1 on #1522) (0.319268ms)
✔ terminal: input() reports an error when it happens, so it never overwrites a later status; held input's promise doesn't carry the holder's error (Filbert N4 on #1522) (0.300248ms)
✔ terminal: invisible and bidi characters are made visible; head, status and notice lines stay one line (0.091451ms)
✔ every record these fixtures produced is a valid CHAT-01 record (E5: no record fails the schema) (209.17872ms)
✔ H1: two takeovers with the same expected generation: one wins, +1; the other refuses generation (232.152157ms)
✔ H2: the old controller's prompt after a takeover commits is refused with zero engine bytes (267.292839ms)
✔ H3: a takeover while a prompt holds the dispatch lock: written under the old actor, or refused; never both (817.800329ms)
✔ H4: self-takeover is refused (186.725333ms)
✔ H9: Interrupt racing a prompt's dispatch: before the write, dispatch-refused and no-turn; after, §3 rules (434.191352ms)
✔ H10: Interrupt and force stop together: one stop chain, force stop supersedes (985.415658ms)
✔ H10: an overlap during the pause before the abort: no abort, the stop ends uncertain (211.241779ms)
✔ H10: a no-turn Interrupt lifts only its own fence; admission stays closed under force stop, overlap or revocation (564.117555ms)
✔ H11: the controller disconnects mid-turn: work continues, the claim is unchanged, control stays put (261.603407ms)
✔ H12: an exact retry after reconnecting to the same incarnation returns the same receipt; one dispatch (143.983195ms)
✔ H13: a retry with the same request ID and different text is refused (184.339154ms)
✔ H14: late stdout from the old engine after a replacement is dropped by incarnation, counted, never rendered (567.772072ms)
✔ H15: a revoked connection's command is refused; the revocation fence holds (287.496189ms)
✔ H16: a second controller for the same session refuses already-active; the first is untouched (193.101167ms)
✔ H10: a second force stop while the first escalation runs refuses fenced; one escalation, and the claim records only the first stop's phases (825.501847ms)
✔ a force stop whose fence throws leaves no escalation flag behind, so the next force stop runs (Darkwing F2, #1507) (336.034907ms)
✔ H17: a confirmation reused, answered from another connection, or used after the stop changed is refused (757.438901ms)
✔ H18: two prompts before any native output: the second refuses busy; one engine write (200.358289ms)
✔ H19: the pipe fails mid-line under a large prompt: delivery-unknown transport-unknown, poisoned, no later write (341.375492ms)
✔ H19: the link itself never writes again after an unknown outcome, whoever calls it (0.660103ms)
✔ H19: the controller dies mid-write of a large line: after restart the outcome is unknown and nothing is resent (643.617436ms)
✔ H20: the line is written but the ack is lost when the controller dies: orphan, outcome unknown, nothing resent (559.564812ms)
✔ H21: a retry of the exact request with the old token after a crash is stale-incarnation; no second write (767.781798ms)
✔ H22: after H21 and a valid recovery, a new request with the new token is admitted (3113.532831ms)
✔ H23: requests pending at a restart are not resent; each shows outcome unknown (643.967785ms)
✔ no shim from this file's tests is left running for the after hook (4.695308ms)
✔ a plain conversation: catalogue row, one page, CHAT-01 records (5.350949ms)
✔ native entries map to blocks: tools, thinking, bash, notices, ids that do not fit (1.42647ms)
✔ F1: a malformed line is an unavailable part at its position, and reading continues (1.406124ms)
✔ F1: a missing parent stops the history with a notice that names the unreadable lines (2.120684ms)
✔ F1: an unreadable fork is never merged into another branch's history (1.414288ms)
✔ F1: a follow stays on its branch when the next entry's parent is unreadable (1.75514ms)
✔ F1: a file whose entries are all unreadable shows a notice per line (0.675984ms)
✔ F2: a truncated trailing line marks the view incomplete, not an error (1.085988ms)
✔ pagination: 100 parts, then the rest; parts concatenate to the whole branch (2.938377ms)
✔ F3: a replaced file (new inode) refuses old cursors with reconcile (4.626696ms)
✔ F4: a same-inode rewrite of the prefix refuses old cursors with reconcile (5.473159ms)
✔ F5: growth between pages keeps the epoch and the page stops at the pinned length (4.584001ms)
✔ F6: unknown, foreign and expired cursors refuse and leave the cursor usable (6.574015ms)
✔ F7: a symlinked file and a symlinked directory component are refused, never opened (7.660996ms)
✔ F8: a file swapped for a symlink after the catalogue is refused (1.559971ms)
✔ F9: registrations never add or redirect a root (1.514914ms)
✔ F10: a header cwd naming another project is refused (3.721596ms)
✔ F11: parentSession renders with a marker and the parent is never opened (0.617378ms)
✔ F12: two leaves: the default leaf is shown and the other branch reads alone (3.539503ms)
✔ F12: a follow refuses when an appended duplicate id changes the branch's earlier parts (1.759674ms)
✔ F12: a second root (Pi's resetLeaf) starts its own branch (1.243839ms)
✔ F13: compaction is a marker in place, then the retained content (0.680477ms)
✔ F14: long strings split into fragments and parts, reassemble exactly, and pages respect the byte cap (483.629378ms)
✔ fragments never cut a surrogate pair and keep an empty string (4.238066ms)
✔ F15: a Claude seat is an unsupported-harness placeholder whose directory is never read (1.388542ms)
✔ unknown conversations, empty files and non-Pi files refuse (2.202407ms)
✔ an unreadable file or root inside the roots is refused per row, not a failed catalogue (0.996614ms)
✔ a seat directory without search permission refuses that root, not the catalogue (1.827785ms)
✔ every page and cursor is a valid CHAT-01 record (764.100088ms)
✔ the engine pin holds for the installed package (1.56512ms)
✔ pinned Pi, sealed and without credentials, answers the controller's commands with the shapes the fake models (247.157683ms)
✔ sealed, pinned Pi ignores a trusted project's .pi resources; --approve past the seal would load them, and checkSeal refuses it (Filbert F2 on #1522) (479.45788ms)
✔ pinned Pi appends thinking_level_change at start when the branch lacks one, so the leaf moves (K8 then fails closed) (247.010397ms)
✔ N25: ordinary Interrupt reconciles; a non-empty queue_update in the window is O5 (453.216124ms)
✔ N1: an extension's follow-up queued after the fence is cleared before any abort; O5, Unknown (450.798763ms)
✔ N1: a follow-up queued before the fence is O5 at once; the Interrupt refuses fenced (226.027611ms)
✔ N2: with abort first, the fake runs the external item (the ordering guard has teeth) (21.004943ms)
✔ N3: the fence lands in preflight, preflight errors, no run: failed, No run, uncertain (349.263497ms)
✔ N4: the ack arrives after the first abort and a run starts: clear and abort again; Interrupted (197.381239ms)
✔ N5: an input handler takes the prompt: ack, no run, delivery-unknown handled-without-run (293.651925ms)
✔ N6: an extension queues between clear_queue and abort: O5 and O6, Unknown (456.638715ms)
✔ N7: clear_queue times out: no abort, nativeQueue unknown, force stop still ends it (1879.594338ms)
✔ N7: clear_queue answers an error: no abort, nativeQueue unknown, the link not poisoned (184.841429ms)
✔ N8: an extension prompt starts a run during Mosaic preflight; the losing settle is O3 (272.343828ms)
✔ N9: a run that started before the fence and ends aborted: failed interrupted, Interrupted (184.926542ms)
✔ N9: decision 34: a run that ends aborted with no stop in progress: aborted-without-stop, uncertain, outcome unknown (226.330856ms)
✔ N9: an aborted that lands after the fence but before any abort is written: aborted-without-stop, Unknown (376.525065ms)
✔ N10: fake conformance (32.34731ms)
✔ N11: the run fails before any user message_start: delivery-unknown ack-without-start, never failed (407.191233ms)
✔ N12: input that starts a run after the final empty clear is O1 and not part of the stop's proof (252.851936ms)
✔ N13: agent_start with no slot held is O1; a later prompt refuses with zero engine bytes (285.255003ms)
✔ N14: the run completes while clear_queue is in flight: finished, Completed first, uncertain (360.50267ms)
✔ N14: the run completes after the abort is written, before Pi applies it: finished, never relabelled (364.011315ms)
✔ N15: the fence lands in preflight, then an input handler takes it: handled-without-run, No run (365.745737ms)
✔ N16: Interrupt with no slot and no run refuses no-turn: no stop, no bytes, admission open (191.595336ms)
✔ N17: the run fails on its own during the exchange: failed, Failed on its own (300.506682ms)
✔ N18: no final assistant message_end, or a lost line: working stays working; before working, transport-unknown (648.720732ms)
✔ N19: a losing extension prompt settles inside the Mosaic run before its user message: O3, run-overlap (587.948533ms)
✔ N20: an extension triggerTurn during Mosaic preflight starts first; while streaming it queues with no signal (441.302705ms)
✔ N21: a losing settle after the receipt settled finished is O2; the receipt stays finished (229.167016ms)
✔ N22: an agent-level custom message is dropped by the clear with no signal; evidence names the seal (203.034852ms)
✔ N23: a nextTurn message survives clear and abort and attaches to the next prompt, with no signal (203.425476ms)
✔ N24: the seal is an allow-list: --extension, a missing --no-* flag, a second --mode or --session, a session or output flag, or a stray word refuses unsealed-engine; no engine starts (389.198186ms)
✔ N24b: the seal covers the engine command and environment: config can't name either, the env is built from names, and a mutated command is refused at bind (182.741365ms)
ℹ tests 182
ℹ suites 0
ℹ pass 182
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 47622.749502
@@ -0,0 +1,191 @@
✔ approvals: a request is validated before anything is posted; the rendering shows names and never ids (3.03173ms)
✔ approvals: the ledger is appended and folded into open requests with bind and approval states (1.393183ms)
✔ approvals: a reply approves only when it points at a request, says exactly approve, and comes from a listed approver once (0.776429ms)
✔ approvals: a button approves only on its own request message with the matching custom id (0.450407ms)
✔ approvals flow: a turn that opened a request posts the message with the button, records it, binds it, and both approvers approve (15.014293ms)
✔ approvals flow: a non-approver, a repeat, a wrong custom id and a service refusal each get their fixed line and a drop entry (6.238592ms)
✔ approvals flow: an invalid request from the model, a refused post, and no api client are recorded and post nothing (6.947676ms)
✔ approvals flow: start retries a bind and an approval left as unknown, under their original keys (2.259194ms)
✔ authorize: open channel, listed user (1.758668ms)
✔ authorize: wrong guild (0.187367ms)
✔ authorize: no guild (DM) (0.300664ms)
✔ authorize: unlisted channel (0.172948ms)
✔ authorize: unknown channel, no info (0.227557ms)
✔ authorize: thread of listed parent (0.178038ms)
✔ authorize: thread of unlisted parent (0.237693ms)
✔ authorize: text channel that is not a thread and not listed (0.133611ms)
✔ authorize: unlisted user (1.100752ms)
✔ authorize: no author (0.470109ms)
✔ authorize: bot author (listed id, bot flag) (0.219791ms)
✔ authorize: system author (0.260249ms)
✔ authorize: the bot itself (0.073372ms)
✔ authorize: webhook (0.097446ms)
✔ authorize: mention channel without mention (0.131408ms)
✔ authorize: mention channel with bot mention (0.114214ms)
✔ authorize: mention channel with @everyone only (0.141535ms)
✔ authorize: mention channel mentioning someone else (0.066436ms)
✔ authorize: mention channel, content says @bot but mentions empty (0.080139ms)
✔ authorize: private thread under mention channel, mentioned (0.06901ms)
✔ authorize: private thread under mention channel, not mentioned (0.063324ms)
✔ authorize: thread in another guild per channel info (0.067592ms)
✔ authorize: not an object (0.055976ms)
✔ authorize: no id (0.063084ms)
✔ authorize: oversize content is accepted and flagged (0.071001ms)
✔ authorize: exactly the limit is not oversize (0.066287ms)
✔ authorize: a user's channel allowlist drops them outside it, threads count as the parent, others are unaffected (0.704634ms)
✔ authorize: order puts wrong guild before user, and user before channel (no channel lookup for strangers) (0.138311ms)
✔ binding: a complete binding validates and is frozen (2.447554ms)
✔ binding: unknown key, missing field, wrong type refuse with exit 2 (1.288838ms)
✔ binding: empty allowlists refuse (0.371339ms)
✔ binding: a user's channel allowlist must be non-empty, listed and unique; absent means every listed channel (1.265621ms)
✔ reloadDiff: reloadable keys are summarised by id; every fixed key refuses with exit 2 (1.52064ms)
✔ binding: dmRecipient is optional, a snowflake, one of the listed users, and a fixed key (1.193903ms)
✔ binding: file must be 0600, regular, not a symlink (1.885247ms)
✔ binding: token file mode, symlink, emptiness and shape are checked; token never appears in errors (1.250876ms)
✔ cli: check refuses a non-0600 token file with exit 2 before any network use (85.329934ms)
✔ context files: absolute paths, traversal, symlinks and out-of-repo targets refuse; in-repo files resolve (2.714187ms)
✔ cli: check refuses a missing context file and a missing binding with exit 2; usage is exit 4 (292.393518ms)
✔ cli: reload validates the file first (exit 2), then needs a live owner (exit 1); usage is exit 4 (177.209687ms)
✔ cli: run refuses when STOP is present, before any network use (106.318782ms)
✔ binding: tools is optional, validated strictly, a fixed key for reload, and its roots are resolved against the data root (1.567432ms)
✔ binding: a git key is validated at load and reaches the extension whole, and only on a writable root (1.043677ms)
✔ delivery: an accepted message is in the inbox before the turn, the reply is chunked with one nonce per chunk, and the turn record is write-once (15.782359ms)
✔ delivery: refused and unknown outcomes are journaled; a later chunk is not sent after a failure (16.773317ms)
✔ delivery: restart with an unknown entry re-sends the same nonce once and reconciles before accepting traffic (1.30001ms)
✔ delivery: an unknown entry older than the dedupe window is marked refused, not re-sent; a still-unknown one refuses start (0.95609ms)
✔ delivery: repeated unknown reconciliations never refresh the dedupe window; the original intent time decides (1.127706ms)
✔ turn: a failed engine turn posts the fixed line, never model output, and writes a failed record (2.123953ms)
✔ turn: a second message during a turn is held by the engine, both get their own reply and record (33.147607ms)
✔ turn: a thread under a listed channel is answered in the thread; an unknown thread is looked up once (1.629066ms)
✔ drop: an unlisted user gets silence and one drop line; no inbox entry, no REST call, no engine call (0.816436ms)
✔ drop: an oversize message is accepted into the inbox, answered with the fixed line and journaled as a drop (0.943282ms)
✔ restart: an inbox with three ids and a replay of the same three produces zero turns (40.844739ms)
✔ stop: STOP present refuses start; STOP written while running refuses new turns and the current one finishes (31.363721ms)
✔ ceiling: the ceiling plus one is refused and journaled; one fixed line per UTC day; a new day accepts again (5.541029ms)
✔ ceiling: a burst arriving while turns are still running cannot queue past the ceiling (3.848343ms)
✔ ceiling: a turn interrupted by a crash still counts after restart; admissions are durable (2.451829ms)
✔ ceiling: the daily notice survives a same-day restart; one delivery attempt in total, even when the first attempt crashed mid-flight (4.249323ms)
✔ duplicate: the same event delivered twice while the thread lookup is held yields one prompt, one admission and one reply (1.128174ms)
✔ journal: no token-shaped string and no model output on the drop path reaches disk (0.420783ms)
✔ receipt: an admitted message gets one eyes reaction on the inbound message; drops and refusals get none; a failed reaction is recorded and does not fail the turn (2.206485ms)
✔ receipt: Discord refusing the reaction leaves the turn intact and records ok false (1.868096ms)
✔ reload: a new user is silent before and answered after; a removed channel goes silent; a lower ceiling applies at once (3.728874ms)
✔ reload: a fixed key refuses with exit 2 and the old binding stays in force (1.93698ms)
✔ tools: with a tools binding the turn record lists every read and its outcome; without one the field is null (3.629657ms)
✔ context: the Discord block names the server, channels and modes, and states the rules from Q15 and Q16 (2.619294ms)
✔ context: with tools the block names the roots, keeps file content as data, and says to state refusals plainly (0.816684ms)
✔ context: a writable root adds the write rules and says a write is real only once Jason commits (1.942989ms)
✔ context: the envelope is one bracketed line then the text; names cannot break the line (1.167856ms)
✔ context: a git root swaps the terminal-commit line for the git verbs, and a vault root adds the id protocol (1.293544ms)
✔ context: assembleContext concatenates files in launcher format and appends the block; sha256 is stable (1.107096ms)
✔ context: splitReply keeps paragraphs together under the limit and splits long ones at lines, spaces, then hard (0.833917ms)
✔ pinned Discord render/install and missing prerequisites; checkout bytes unchanged (76.260098ms)
✔ Discord status reports effective WorkingDirectory from a fake user manager (40.64704ms)
✔ engine: buildPiArgs carries the fixed flags, engine settings, session dir and prompt file (2.235239ms)
✔ engine: with tools, buildPiArgs turns pi's own tools off, loads the extension explicitly and allowlists exactly our three (0.393092ms)
✔ engine: a run with tool turns settles once, on the answer, with every tool call in the result (46.418454ms)
✔ engine: a run that ends on a tool-only turn fails the prompt as empty; a retried run settles on the real end (38.280247ms)
✔ engine: one prompt, one turn, text and usage come back (30.629036ms)
✔ engine: a prompt while streaming is held until pi settles, then sent as its own run, and answered in order (344.704065ms)
✔ engine: a held prompt that times out before pi settles fails on its own and is never sent (228.681035ms)
✔ engine: timeout sends abort and fails only that turn; the process stays (104.531123ms)
✔ engine: tool events from a run that outlived its timeout never land in the next prompt's record (224.211242ms)
✔ engine: a prompt after a turn that timed out before its agent_start waits for pi to settle instead of being refused (124.791143ms)
✔ engine: when pi has not started a timed-out turn by the end of the abort grace, the engine stops pi and fails held prompts (212.958803ms)
✔ engine: a timed-out turn pi starts only after the grace never answers a later prompt (613.826326ms)
✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (early prompt response) (1.34177ms)
✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (late prompt response) (0.539539ms)
✔ engine: a timed-out run pi did start outlives the grace; the next prompt goes out when it ends (425.964934ms)
✔ engine: a malformed JSONL line fails the turn, not the process (23.070738ms)
✔ engine: a turn that ends in error rejects with the error code; process exit fails pending turns (46.164314ms)
✔ gateway: hello -> identify with intents, ready, heartbeat with jitter, ack (2.427136ms)
✔ gateway: missed ack closes the socket and resumes with the last sequence (1.561158ms)
✔ gateway: op 7 reconnect resumes; op 9 non-resumable re-identifies (0.554654ms)
✔ gateway: op 9 resumable resumes (0.338333ms)
✔ gateway: close 4014 is fatal, reports the missing intent, never reconnects (0.981991ms)
✔ gateway: 4004 and 4013 are fatal too; 1006 reconnects with identify when no session (0.530492ms)
✔ gateway: close() is final and unparseable frames are ignored (0.365576ms)
✔ git: config validation is strict, needs write: true, a work tree and a private token file (51.254199ms)
✔ git: the child environment drops every host git config, names one helper, and carries the token path only for origin (45.773419ms)
✔ git: status reports the branch, ahead/behind and changed paths, and refuses off the named branch or mid-merge (70.541007ms)
✔ git: parseStatus reads porcelain v2 including renames and conflicts (0.374891ms)
✔ git: a commit stages exactly the named files, carries the seat author and the requester trailer, and pushes at once (71.973914ms)
✔ git: commit refusals: message, paths, requester, nothing to commit, and an index that already holds other work (79.286745ms)
✔ git: a commit whose push fails is still a commit, says so, and the next commit's push carries both (D6) (76.151776ms)
✔ git: pull is fast-forward only; a diverged origin or dirty local files refuse with nothing merged (175.44649ms)
✔ git: push pushes the named branch only and reports up to date (55.461941ms)
✔ git: no token value or token path ever reaches a git argument list; outputs are masked and capped (75.152748ms)
✔ git: the credential helper answers get over https from a private file and nothing else (176.342882ms)
✔ git: the vault protocol validates before a commit, honours another owner's lock, reserves ids, and locks around writes (693.866732ms)
✔ lock: the claim is exclusive; a second start against a live owner refuses (4.157014ms)
✔ lock: a stale lock (dead owner, reused pid, or record without start) refuses run and is never signaled; only unlock clears it (66.059278ms)
✔ lock: an incomplete claim (directory without owner record) is busy and refuses run; unlock clears it (0.865204ms)
✔ lock: an owner record that exists but cannot be read is invalid: never signaled, never removed, never claimed over (2.868611ms)
✔ lock: legacy upgrade; a live connector holding a {pid, start} record is unknown, unlock refuses and nothing changes; after it exits, unlock clears it (39.674149ms)
✔ lock: a live pid whose record carries a malformed or noncanonical start or boot string is unknown, not a mismatch; nothing signals, removes, or claims over it (255.416462ms)
✔ lock: identity syntax; only canonical unsigned decimal start ticks and lowercase boot uuids are identities (0.373693ms)
✔ lock: a process whose start marker or boot id cannot be read refuses to claim (21.909632ms)
✔ lock: a live pid whose identity cannot be read right now is unknown: never signaled, never removed, never claimed over (0.911374ms)
✔ lock: four processes racing for the same binding; exactly one claims it and the others refuse (40.112074ms)
✔ lock: stale handoff; concurrent starts over a stale lock all refuse, nothing reclaims, one unlock then exactly one live owner (113.687809ms)
✔ lock: four-party schedule; claims landing inside an unlock's gap never survive, one unlock leaves no owner and no residue (80.106416ms)
✔ notices: a kind is recorded per UTC day and found again (0.413556ms)
✔ notify: the DM channel opens once, every send carries the nonce, and only the message id comes back (4.702438ms)
✔ notify: refusals and unknowns surface as RestOutcome without ids; a refused send reopens the channel next time (2.048797ms)
✔ notify: no dmRecipient, a non-0600 binding or token, or a missing binding refuse before any network use (1.608676ms)
✔ check --offline validates local fixture without REST or gateway calls (150.817177ms)
✔ check --offline refuses token mode and missing context under the selected repo (110.771481ms)
✔ run --offline is a usage refusal before reading config or networking (57.183533ms)
✔ recover: nothing to do is clean; a lock whose owner is gone or that has no record is cleared and STOP ends up absent (44.798623ms)
✔ recover: an operator STOP refuses with exit 3 and is never removed, whatever the lock says (36.345364ms)
✔ recover: a brake written during the unlock wins; STOP stays with both lines and the start is refused (32.302513ms)
✔ recover: a held binding refuses with exit 3 and writes no STOP: live owner, alive pid without verifiable identity, unreadable record (61.235502ms)
✔ cli: recover exits 0 when ready, 3 behind a brake or a held binding, and run's own STOP refusal is 3 (586.840274ms)
✔ rest: createMessage sends nonce, enforce_nonce, empty allowed_mentions and a soft reply reference (2.139357ms)
✔ rest: 429 waits retry_after and retries; 4xx is refused; 5xx and socket errors are unknown (2.735058ms)
✔ rest: content and nonce limits are enforced locally; typing never throws (0.59211ms)
✔ rest: react PUTs the encoded emoji on the inbound message for @me; 2xx is true, anything else is false and never throws (0.783952ms)
✔ rest: createDm posts the recipient and resolves the channel id; 4xx refused, 5xx unknown, bad id never sent (0.722211ms)
✔ setspark config: a bare https or loopback origin, a private key file, a principal (4.751927ms)
✔ setspark config: reaches the tools config and the binding as a fixed key (2.757479ms)
✔ setspark config: the binding's key survives resolveToolRoots and the engine's JSON hand-off to the extension (1.49611ms)
✔ setspark config: approvers come from the binding's users, never from the binding's setspark key (1.889711ms)
✔ setspark verbs: required_approvers go out as discord ids from names and come back as names (20.378576ms)
✔ setspark verbs: no Discord user id reaches tool text, whatever shape the service returns it in (8.206234ms)
✔ setspark contract: a decision made with names opens a request the connector accepts; names stored by an old record still refuse (5.431484ms)
✔ setspark keys: read per call, one printable token per file, rotation without a restart (3.270034ms)
✔ setspark idempotency keys: principal, turn id, call index; connector keys name a step (0.480031ms)
✔ setspark http core: json in and out, bearer header, idempotency header, fixed user agent, no key anywhere else (1.947357ms)
✔ setspark http core: error bodies become fixed refusals with code and the 409 fields; server text is data, cut (1010.604435ms)
✔ setspark verbs: a setspark key enables the eight verbs and no counters (0.436634ms)
✔ setspark verbs: writes carry the turn's key and the asserted requester, reads carry no key, and the api key never appears in text or details (6.000569ms)
✔ setspark verbs: no turn refuses every write before any request; bad arguments refuse before any request; reads still work (1.132799ms)
✔ setspark verbs: renderRecord caps long output and hides the accepted snapshot (0.225757ms)
✔ setspark api: bind, add_approval (button and reply) and get use integer request ids and the connector's keys (2.200019ms)
✔ tools: config refuses a missing, symlinked, dotted, non-directory or duplicate root and bad limits (3.696544ms)
✔ tools: every escape is refused with a fixed reason and nothing outside the root is read (3.741975ms)
✔ tools: happy paths list, read a window, and search case-insensitively; dotfiles and symlinks never appear (4.746462ms)
✔ tools: the tool set renders text for the model, records details for the journal, and enforces the per-run budget (3.450612ms)
✔ tools: listing and search caps hold (10.04876ms)
✔ tools: credential shapes are caught; ordinary prose and ids are not (0.845122ms)
✔ tools: the read uses the checked file itself; a symlink, a swapped file, a FIFO, a grown file or a hard link at read time is refused (5.126589ms)
✔ tools: an unreadable file under the root is skipped by search and refused by read (1.120697ms)
✔ tools: config accepts write: true only as a boolean, and enables the write tools only then (1.111217ms)
✔ tools: every write outside the fence is refused before any byte lands, and no temp file remains (5.409338ms)
✔ tools: write_file leaves the exact bytes, edit_file replaces one exact match, and the set renders the change as uncommitted (2.797542ms)
✔ tools: a target that changed between the check and the rename is refused and the temp file is removed (1.727607ms)
✔ web: config takes an https or loopback-http SearXNG base url and a bounded fetch cap (2.242278ms)
✔ web: address rules refuse every private, loopback, link-local, mapped and multicast form (1.418045ms)
✔ web: web_fetch refuses bad urls, private hosts, rebinding names, non-https redirects, too many hops, error status, non-text bodies, and times out (1021.625644ms)
✔ web: web_fetch returns html as text with the title, follows an https redirect, keeps plain text and json, and cuts at the cap (4.09233ms)
✔ web: html to text drops scripts, styles and comments, decodes entities and keeps block breaks (0.217576ms)
✔ web: web_search asks the instance for json, returns at most ten clean results, and refuses a bad query, a down instance or an unusable answer (2.555515ms)
✔ web: the tool set enables the web tools only with a web key, counts them in the budget, and records url, status and hits (2.159134ms)
ℹ tests 183
ℹ suites 0
ℹ pass 183
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2585.981236
@@ -0,0 +1,116 @@
✔ sessionModel: agent vars win, then the system's execution settings (15.426201ms)
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (5.953766ms)
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (3.970248ms)
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (5.896742ms)
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (10.174631ms)
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (2.805548ms)
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (8.604071ms)
✔ the prompt names the project clones in the workspace, and none when there are none (5.986235ms)
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.387195ms)
✔ the prompt explains landing to a role with land_work, and to no other (3.738884ms)
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (6.416866ms)
✔ a bundle is written once: an existing file refuses (1.314855ms)
✔ a path with a single quote can't go into the hook command (1.269205ms)
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (2.473563ms)
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.666416ms)
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.515497ms)
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.607276ms)
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.491851ms)
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.994382ms)
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (4.607494ms)
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (7.10498ms)
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.963859ms)
✔ allow exits 0, a deny exits 2 with the reason on stderr (136.608806ms)
✔ a missing or wrong policy, or a bad event, exits 2 (80.428616ms)
✔ the bundle's wrapped command: a missing gate or node still blocks (1083.272246ms)
✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (809.201996ms)
✔ claude: the hook alone blocks a path outside the workspace (492.968668ms)
✔ claude: a second turn resumes the first turn's session (743.320282ms)
✔ claude adapter: --restricted is always passed (5.322758ms)
✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (16.674144ms)
✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (5.584381ms)
✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (731.222879ms)
✔ claude: a missing hook or MCP file refuses before claude starts (7.77514ms)
✔ pi: policy tools and typed tools pass, anything else is blocked (4.031057ms)
✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.893263ms)
✔ file tool paths must resolve inside the workspace (1.51737ms)
✔ pi's own path normalisation can't be used to step out (1.134759ms)
✔ a symlink inside the workspace that points out is outside (1.230296ms)
✔ a dangling symlink is refused at any depth, in both harnesses (5.347227ms)
✔ read is checked under every spelling pi's read would open, in both harnesses (20.029458ms)
✔ other spellings cover directories, dangling links and pi's cwd (2.006651ms)
✔ a relative path climbs from the workspace's real path, in both harnesses (6.380537ms)
✔ claude path fields per tool (1.778925ms)
✔ glob patterns stay inside the workspace (1.88594ms)
✔ a path that can't be checked is blocked (0.458795ms)
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (235.925094ms)
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (147.389035ms)
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1808.811567ms)
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.6597ms)
✔ land_work sends one land line and resolves the host's started answer (3.224586ms)
✔ initialize, ping and tools/list (58.635604ms)
✔ tools/call goes through the tool socket; a refusal is an isError result (48.439466ms)
✔ replies are compact JSON; over the cap a tool error names the size and the cap (39.641118ms)
✔ unknown tools and methods are JSON-RPC errors and never reach the socket (31.19734ms)
✔ a missing argument is a usage error (24.706001ms)
✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (389.253501ms)
✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (330.067992ms)
✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (319.172745ms)
✔ pi: a read is refused when pi would open another spelling outside (302.313433ms)
✔ pi: a relative path climbs from the real path of a workspace behind a symlink (298.076739ms)
✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (305.810518ms)
✔ pi: a missing extension refuses before any model call (6.18366ms)
✔ pi: an extension without its configuration fails pi's start (256.935667ms)
✔ founderCheck: founder variables, then a needed service without a usable token (1.626178ms)
✔ turnRequest names the sender, class, reply and decision (0.298951ms)
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.301766ms)
✔ turnRequest shows the message's own sent time, a day old as well as new (0.2ms)
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.349308ms)
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (280.758678ms)
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (230.484175ms)
✔ a task closed on the tracker is missing from the next turn's open list (230.839356ms)
✔ a message read a day after it was sent shows the time it was sent (184.473324ms)
✔ a decision the human resolves becomes a turn citing the decision and the answer (224.814103ms)
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (119.528307ms)
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (105.392451ms)
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (430.052564ms)
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (429.257417ms)
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1282.709813ms)
✔ the bus's launch notice is one turn with no reply, and is not taken again (251.272061ms)
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (148.847029ms)
✔ founder credentials stop before the claim (20) (170.30994ms)
✔ a refused claim exits 21; an ended run's capability exits 22 (195.756258ms)
✔ the launch ending under a running session exits 22 (145.490512ms)
✔ a broker that stays unreachable exits 23 after brokerRetries polls (252.902448ms)
✔ a broker that is down at the claim exits 23, not 21 (88.491142ms)
✔ no capability, or a malformed one, on stdin exits 2 (191.406913ms)
✔ a missing or malformed policy exits 2 before the claim (122.254862ms)
✔ every role sees read_spec, record writer follows its grant, citation schemas stay strict (17.592288ms)
✔ typed socket forwards read content/history and agent record writes, and cannot write a spec (195.670224ms)
✔ the PM gets its task verbs and the reads, and no launch (10.560908ms)
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (4.040919ms)
✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (13.654609ms)
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.398039ms)
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.171689ms)
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (9.199641ms)
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (1.093508ms)
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.138514ms)
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.151429ms)
✔ a coder with a tracker gets its own task tools and no task_reassign (0.957224ms)
✔ launch only when the business's launch block names the instance as launcher (1.704609ms)
✔ an action outside the instance's authority has no tool (1.454172ms)
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.824057ms)
✔ land_work is there only with land, after push_working, with the task and the decision (3.115143ms)
✔ callTool: one JSON line out, the result back, a refusal rejects (8.947507ms)
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.417558ms)
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.604895ms)
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.604995ms)
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.565861ms)
ℹ tests 108
ℹ suites 0
ℹ pass 108
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 12062.67946
@@ -0,0 +1,94 @@
✔ a raw token file, with or without one trailing newline, reaches curl only through the config stream (103.319993ms)
✔ the raw path accepts nothing else, and refuses before curl runs (344.416836ms)
✔ the file checks still apply on the raw path: mode, symlink, missing, directory (259.419296ms)
✔ the raw path base URL has no override (49.408313ms)
✔ the JSON path is unchanged, and JSON never falls through to the raw path (233.546237ms)
✔ a file that changes between the two reads refuses before curl runs, with or without a body (677.833959ms)
✔ the token reaches no child environment, even with an inherited CFG or SHELLOPTS=allexport (635.806294ms)
✔ real helper GET HTTP 200 preserves exit 0 without credentials (13.423963ms)
✔ real helper POST HTTP 201 preserves exit 0 without credentials (9.971225ms)
✔ real helper GET HTTP 403 preserves exit 1 without credentials (8.654743ms)
✔ fixture git subjects only, follow-ups and three session kinds (174.44122ms)
✔ text and JSON carry same numbers, open and truncated title (215.285336ms)
✔ missing credentials exit 2, no-issues never calls API and shows unknown (173.684134ms)
✔ empty range gives no rows and zero totals (149.759399ms)
✔ inclusive UTC dates, first-line preamble only, role and seat boundaries (144.336957ms)
✔ close-only issue included, even median, missing metadata stays unknown (141.311961ms)
✔ unique commits but per-issue links count multiple tags once each (141.717138ms)
✔ issue pages of 50, 50 and 7 read 107 issues in 3 pages (298.180178ms)
✔ one short page reads 1 page; --no-issues reads none and says so (260.285241ms)
✔ a short page 10 is read; a full page 10 refuses at the ceiling (679.782078ms)
✔ an issue number on two pages refuses (152.780721ms)
✔ a failing page 2 refuses the whole read without its stderr (150.538684ms)
✔ page 2 with a malformed record refuses (150.693881ms)
✔ page 2 with more than 50 rows refuses (156.248507ms)
✔ bad API payload not JSON refuses (154.473755ms)
✔ bad API payload {} refuses (149.195319ms)
✔ bad API payload [{"number":1}] refuses (152.653228ms)
✔ partial or malformed session log refuses with location, not content (252.118138ms)
✔ a U+2028 or U+2029 inside a session string is one line, not a malformed record (146.427506ms)
✔ no sessions is an empty table; symlink source refuses (206.995223ms)
✔ reads only refactor even when another branch is checked out (161.436673ms)
✔ invalid dates, reverse dates and duplicate options refuse (112.167186ms)
✔ T3 agent assignments do not count as human in Table 2 (151.831422ms)
✔ preamble parsing and issue number boundaries (0.542246ms)
✔ T3 header: agent, or board from control-board; anything short of the full header is human (0.201219ms)
✔ no closed issues with human messages means undefined ratio, not invented zero (0.244746ms)
✔ T3: seat, archived, unmapped and Researcher threads count; imported, deleted and other-project threads do not (458.65423ms)
✔ T3: the default path is read from HOME and prints no path line; --no-t3 says so (698.556343ms)
✔ T3: a HOME with no database exits 1 and names --no-t3 (128.50896ms)
✔ T3: a file that is not a database exits 1 and names --no-t3 (129.02726ms)
✔ T3: a seat thread renamed to another seat exits 1 naming thread, title and roles (372.466509ms)
✔ T3: an unmapped thread addressed as a seat exits 1 (371.964628ms)
✔ T3: a header to another thread id is not cross-checked (434.135603ms)
✔ T3: no project, or two, for this root exits 1 (1039.515227ms)
✔ T3: a removed column exits 1 and names it (220.860321ms)
✔ T3: a missing table exits 1 and names it (231.282681ms)
✔ T3: a counted row with an unknown role exits 1 without its text (373.954159ms)
✔ T3: a counted row with role reasoning without the reasoning: id prefix exits 1 without its text (399.565674ms)
✔ T3: a counted row with non-text content exits 1 without its text (385.413317ms)
✔ T3: a counted row with an unparseable created_at exits 1 without its text (400.195979ms)
✔ T3: a reasoning summary is skipped before any check and counted as excluded (1046.821063ms)
✔ T3: a missing orchestration_events makes the diagnostic unknown and keeps the counts (699.329392ms)
✔ T3: a human message with no event counts in humanWithoutEvent (407.052043ms)
✔ T3: an unparseable event makes the diagnostic unknown and keeps the counts (707.239156ms)
✔ T3: an event with no string messageId makes the diagnostic unknown and keeps the counts (666.305508ms)
✔ T3: an error that is not from SQLite is rethrown, not reported as a database failure (308.350284ms)
✔ T3: a symlink at ~/.t3 exits 1 (132.290988ms)
✔ T3: a symlink at ~/.t3/userdata exits 1 (128.109277ms)
✔ T3: a symlink at ~/.t3/userdata/state.sqlite exits 1 (124.702265ms)
✔ T3: with --t3-db, a symlinked file or directory exits 1 (423.551244ms)
✔ T3 WAL: the newest message only in -wal, writer attached, is counted (406.23556ms)
✔ T3 WAL: stopped cleanly, counts are correct and the main file is unchanged (384.074874ms)
✔ T3 WAL: -wal without -shm in a writable directory is read (429.825639ms)
✔ T3 WAL: -wal without -shm in a read-only directory exits 1 (406.330152ms)
✔ T3 WAL: stopped cleanly in a read-only directory exits 1 (383.286737ms)
✔ T3: a lock held past the 5 s busy timeout exits 1 and names --no-t3 (5377.931527ms)
✔ a done row whose closing issue is open is a violation; a row that is not done is not (1.740114ms)
✔ an issue several rows close is expected closed only once all of them are done (0.483797ms)
✔ closure needs positive evidence: unknown is undecided, and so is a skipped or short issue check (0.357854ms)
✔ each owner of an in-progress or in-review row gets one liveness class (7.309545ms)
✔ a required row not done after 14 days is a violation; a legacy row uses genesis as its lower bound (0.372233ms)
✔ an ISO requiredSince, as `set required` writes it, ages from its UTC day; one that does not parse is a violation (0.214026ms)
✔ the text section always ends in a count and a result, and never prints a full pass (0.31421ms)
✔ pidAlive: a running pid is present, an exited one is gone, and EPERM still means present (25.052542ms)
✔ issue states: open list first, then the metric page, then at most 10 lookups (264.018577ms)
✔ a full open list: lookups settle what it leaves out, and only an unsettled issue keeps it undecided (341.699272ms)
✔ the open list refuses on a failed call or a bad record, and never echoes the helper (166.824529ms)
✔ a helper call past the deadline is killed with its child, and the call reports it (2007.303402ms)
✔ readQueue loads queue.json through the queue validator and refuses anything else (115.002317ms)
✔ protected changes list every in-range entry that changes a required or parked row (411.070368ms)
✔ the CLI prints the queue section above the weekly table and under a queue key in --json (630.015555ms)
✔ a queue with nothing wrong prints 0 violations and a reduced pass, never a full pass (248.341279ms)
✔ --no-issues makes no call and leaves the issue checks undecided; --no-queue skips the section (298.631142ms)
✔ the CLI refuses a bad queue before any call, and a failed open list with exit 2 (279.836515ms)
✔ --unsupported-runtime repeats once per seat and takes a seat name (335.559956ms)
✔ an unreadable config makes every owner invalid instead of passing them (180.835801ms)
ℹ tests 86
ℹ suites 0
ℹ pass 86
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 22208.339871
@@ -0,0 +1,77 @@
✔ pure resolution selects current default or explicit enrolled account (1.858635ms)
✔ scope is explicit, bounded and never inferred (1.562406ms)
✔ fork pin is preserved against default change, override, missing account and revocation (0.704737ms)
✔ unenrolled account/provider, missing harness, model expansion and native model ceiling refuse (0.776972ms)
✔ only explicit synthetic credential forms and internal fixture stores admitted (5.241997ms)
✔ two concurrent workspaces of the same agent publish distinct complete private generations (61.235418ms)
✔ same execution ID is exclusively claimed and cannot overwrite a published generation (37.145447ms)
✔ failed generation after-auth preserves prior files, records failure and refuses blind same-ID retry (46.092803ms)
✔ failed generation before-publish preserves prior files, records failure and refuses blind same-ID retry (56.224213ms)
✔ credential lock contention refuses without duplicate side effects (11.441063ms)
✔ symlinked pre-existing final target is refused and never followed (26.274133ms)
✔ invalid registry cannot resolve; no fallback to supplied partial entries (0.261534ms)
✔ post-publication failure records uncertainty, preserves complete generation and prevents replay (26.469833ms)
✔ expired credentials refresh under transaction and subsequent generation reuses rotation (85.705359ms)
✔ refresh failure retains prior generation and store state (67.915398ms)
✔ refresh timeout retains prior generation and store state (143.987798ms)
✔ refresh malformed retains prior generation and store state (61.043056ms)
✔ concurrent refresh on same account refuses contention while unrelated account proceeds (222.143186ms)
✔ invalid refresh options refuse before burning claim (32.939424ms)
✔ fixed fake process rotates both OAuth fields without mutating caller input (27.644165ms)
✔ concurrent isolated processes preserve separate provider credentials (26.277778ms)
✔ fake failure is refused with fixed diagnostics (20.804511ms)
✔ fake malformed is refused with fixed diagnostics (21.082616ms)
✔ fake timeout is refused with fixed diagnostics (103.077709ms)
✔ fake unchanged is refused with fixed diagnostics (26.513141ms)
✔ caller executable/environment injection is rejected before spawning (0.267455ms)
✔ valid fixture tree validates and lists without secrets (66.070767ms)
✔ unknown-field refuses (0.370577ms)
✔ invalid-id refuses uppercase and traversal shapes (0.258256ms)
✔ plain-http baseUrl requires allowInsecureTransport (0.28458ms)
✔ native provider rejects allowInsecureTransport (0.192161ms)
✔ unsupported credential type and kind refuse (0.156443ms)
✔ account provider-path mismatch refuses (0.592846ms)
✔ profile account refs must be provider/account shaped (0.217551ms)
✔ seat selection accepts fork pin field, validates account refs (0.203263ms)
✔ harness manifest id must equal executable (gate 1) (0.19166ms)
✔ CLI validate: duplicate provider id across files refuses (24.805729ms)
✔ CLI validate: missing referenced provider/account refuse (31.890107ms)
✔ CLI validate: broken JSON refuses without secret echo (28.954697ms)
✔ CLI usage errors exit 2 (46.619033ms)
✔ credential.json sibling presence does not break validation and is never read (62.210114ms)
✔ D1 missing, empty and structurally empty roots refuse, no list projection (158.235171ms)
✔ D1 required directory auth cannot be absent (50.176557ms)
✔ D1 required directory auth/providers cannot be absent (50.342313ms)
✔ D1 required directory auth/accounts cannot be absent (58.020423ms)
✔ D1 required directory auth/settings cannot be absent (60.093777ms)
✔ D1 required directory harnesses cannot be absent (61.94281ms)
✔ D1 root file and unreadable metadata refuse (104.987282ms)
✔ D2 no symlink traversal at auth/providers/openai-codex.json (53.597215ms)
✔ D2 no symlink traversal at auth/accounts/openai-codex/homelab-openai (63.876425ms)
✔ D2 no symlink traversal at auth/providers (51.350593ms)
✔ D2 no symlink traversal at auth (56.989942ms)
✔ D2 root and ancestor symlinks and lexical traversal refuse (147.35417ms)
✔ private filesystem modes enforced for root (49.138433ms)
✔ private filesystem modes enforced for auth (50.331309ms)
✔ private filesystem modes enforced for auth/providers/openai-codex.json (53.638332ms)
✔ private filesystem modes enforced for auth/accounts/openai-codex/homelab-openai/account.json (55.961905ms)
✔ D3 numeric version 1 only across all record kinds (1.148025ms)
✔ D4 nested unknown keys and missing per-kind required fields refuse (61.70438ms)
✔ D5 unenrolled default refuses even when account exists (67.552416ms)
✔ D6 provider/account credential type must match (64.573731ms)
✔ D7 every harness endpoint enforces HTTP opt-in and shape (0.437575ms)
✔ D8 URLs reject embedded credentials and unsupported protocols without echo (162.634531ms)
✔ D9 malformed JSON diagnostics contain no content excerpt (59.317986ms)
✔ D10 missing metadata is missing-path, not invalid-json (62.937779ms)
✔ D10 library returns no partial entries on any invalid record (73.549746ms)
✔ null/scalar/array metadata refuses without stack or echo (235.698678ms)
✔ credential sibling is never opened, even when an unreadable symlink (29.630318ms)
✔ oversized metadata refuses before parsing (59.179473ms)
ℹ tests 69
ℹ suites 0
ℹ pass 69
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2056.635811
@@ -0,0 +1,36 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.007903ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.217903ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.838794ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.146828ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.143146ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.653064ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.514702ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.548189ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.47303ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.154364ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.874133ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.644965ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.31592ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.756848ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.61993ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.431135ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.602182ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.795577ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.068206ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.16316ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.987973ms)
✔ REQ-PLUG-2 the real tree's searxng-url module switches on as the search-source and answers (2.624486ms)
✔ REQ-PLUG-2 a SearXNG that refuses JSON (403) is search-down, a bad settings url throws (1.111132ms)
✔ REQ-PLUG-2 search-source takes one name, not a list (0.234458ms)
✔ REQ-PLUG-2 searxng-bundled queries the fixed loopback address and ignores web.searxng (0.722013ms)
✔ REQ-PLUG-2 harness-builtin switches on, serves no broker search, and refuses if called (0.593234ms)
✔ the searxng modules end the request when the broker's AbortSignal fires (41.535969ms)
✔ hasModule: true for a shipped module, false for a missing one, an unknown kind or a bad name (0.464909ms)
ℹ tests 28
ℹ suites 0
ℹ pass 28
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 223.296533
@@ -0,0 +1,38 @@
✔ failed init cleans its layout and permits retry (pre-existing=false) (30.351989ms)
✔ failed init cleans its layout and permits retry (pre-existing=true) (28.403711ms)
✔ project check distinguishes a complete but uncommitted layout (13.761872ms)
✔ record repo refuses every declared code root including a sibling project (0.619841ms)
✔ agent record writer refuses a human definition without changing history or files (12.851689ms)
✔ failed init preserves an unrelated file created while its commit runs (11.086909ms)
✔ failed init preserves an unrelated file inside a newly created layout directory (11.418719ms)
✔ failed init refuses to delete a replacement of its owned metadata file (11.324705ms)
✔ init creates a checked versioned layout, valid templates and human-authored local history (25.409061ms)
✔ init honors repo, refuses a non-empty directory and an undeclared project without touching files (14.678882ms)
✔ check reports every bad record, filename mismatch and unknown top-level path (12.535479ms)
✔ one writer commits validated docs, requirements and decisions with the bound agent author (100.149809ms)
✔ writer refuses spec paths, bad schemas, mismatched IDs and invalid actor metadata before changing history (14.904455ms)
✔ writer refuses human pending edits and remotes instead of absorbing or contacting them (20.882314ms)
✔ links, repo/code overlap, identity mismatch and a busy writer refuse safely (21.909453ms)
✔ schemas remain package-owned and reject invalid nested data and dates (0.326768ms)
✔ git commit failure restores only the attempted record and leaves human history unchanged (153.162615ms)
✔ git hooks and ambient git identity cannot alter the record writer or execute outside actions (37.383567ms)
✔ project-local schemas cannot weaken checks; invalid UTF-8 and linked git directories refuse (14.476643ms)
✔ schema constraints and layout omissions are reported independently (14.310685ms)
✔ unsupported schema keywords, malformed contexts, ignored local config and nonempty markers refuse (20.847602ms)
✔ a linked git directory is refused before a writer lock can touch its target (33.005222ms)
✔ spec reads exact committed content and its path commit/log, not dirty bytes or a later docs commit (61.511428ms)
✔ latest agent spec edit is visible but never confirmed or replaced by an earlier human version (29.860129ms)
✔ shared file reader exposes committed docs and refuses path/revision injection or another history (55.077987ms)
✔ reader rejects missing paths, links, invalid UTF-8, NUL and oversized committed blobs (219.312497ms)
✔ reader refuses mismatched committed project identity, unsafe config and unknown argument keys (28.722384ms)
✔ path history is bounded at 100 and explicitly marks truncation (667.051499ms)
✔ committed UTF-8 BOM, Unicode and trailing newlines are returned without normalization (28.831474ms)
✔ D4: spec log refuses a commit subject larger than its 256 KiB read bound (33.139387ms)
ℹ tests 30
ℹ suites 0
ℹ pass 30
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1176.427414
@@ -0,0 +1,51 @@
✔ isRunId accepts the run id shape and nothing else (0.855325ms)
✔ a missing data root or runs directory lists nothing (1.301876ms)
✔ runs as a regular file lists nothing, as before (0.513664ms)
✔ listRunIds keeps r- names only, sorted oldest first (0.650391ms)
✔ listRunRecords returns each result, or null for an incomplete or unreadable one (1.203557ms)
✔ readRunRecord returns documents and artifacts in directory order (0.849036ms)
✔ readRunRecord is null for a missing run, a dangling link or a file (0.565499ms)
✔ readRunRecord and readRunDocument refuse an invalid run id before touching the disk (0.553379ms)
✔ readRunDocument reads only the three run documents (0.466004ms)
✔ a link inside the data root is followed (0.823587ms)
✔ a data root that is itself a link is trusted as configured (0.552043ms)
✔ a run directory linked out of the data root is never read (0.574095ms)
✔ a document linked out of the data root reads as null (0.716721ms)
✔ a runs directory linked out of the data root refuses (0.491276ms)
✔ a relative link that climbs out of the data root refuses (0.345388ms)
✔ a sibling whose name starts with the data root's name is outside it (0.418242ms)
✔ a link loop refuses instead of reading as missing (0.521519ms)
✔ an unreadable runs directory refuses instead of listing nothing (0.357978ms)
✔ an unreadable run directory refuses instead of reading as missing (0.42653ms)
✔ a link to the data root's parent is outside it (0.318816ms)
✔ listRunIds sorts whatever order the directory returns (0.642476ms)
✔ listRunRecords lists an r- name that isn't a valid run id, as before (0.404631ms)
✔ the readers write nothing (1.612362ms)
✔ no pointer is null (1.424732ms)
✔ the pointer release.sh writes reads back (0.929509ms)
✔ a pointer that isn't the version 1 shape refuses with exit 2 (1.454753ms)
✔ a pointer that is a directory refuses with exit 4 (0.947944ms)
✔ a state file linked out of the data root refuses (0.800691ms)
✔ a state directory linked out of the data root refuses (0.476511ms)
✔ a state directory linked out to nothing reads as no release and an empty log (0.400899ms)
✔ a missing log is empty (0.305609ms)
✔ the log reads oldest first and counts malformed lines (0.801116ms)
✔ last must be a positive integer (0.403952ms)
✔ the state readers write nothing (0.651569ms)
✔ list prints each run in the established format (60.375413ms)
✔ list prints a damaged result.json as unknown and keeps listing the runs after it (61.780734ms)
✔ list prints each result field that isn't a string as unknown or - (59.241225ms)
✔ show prints the run in the established format (61.491812ms)
✔ show of a missing run and an invalid id exit 4 as before (93.48065ms)
✔ list and show refuse a runs directory linked out of the data root (120.96331ms)
✔ show refuses a run linked out of the data root; list reports it unknown (114.079855ms)
✔ list shows an r- name that isn't a valid run id, as before (60.056464ms)
✔ show refuses an invalid id before reading the config (34.971187ms)
ℹ tests 43
ℹ suites 0
ℹ pass 43
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 718.469224
@@ -0,0 +1,161 @@
✔ a first launch clones the root at its branch, with the root's path as origin (36.53327ms)
✔ the clone is not at its place until git clone has finished (21.72301ms)
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (62.082746ms)
✔ a clone ahead of the root keeps its commits and counts as current (43.479173ms)
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
✔ a modified file (47.12321ms)
✔ an untracked file (51.911516ms)
✔ a staged file (46.284785ms)
✔ another branch (42.288921ms)
✔ a detached HEAD (44.935938ms)
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (233.684167ms)
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (45.217585ms)
▶ a clone kept before the branch check, or for a failed status, gets no fetch
✔ not-a-clone (24.93768ms)
✔ hooks-present (28.106892ms)
✔ submodule (33.456952ms)
✔ config-changed (31.339883ms)
✔ root-unreadable (30.308475ms)
✔ root-detached (38.037936ms)
✔ status-failed, on the root's branch and clean (39.674963ms)
✔ status-failed, dirty (42.873243ms)
✔ a clone kept before the branch check, or for a failed status, gets no fetch (270.011543ms)
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (48.97056ms)
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (57.771552ms)
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (90.311514ms)
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
✔ user.name (29.02329ms)
✔ user.email (33.238026ms)
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (62.771732ms)
✔ a commit git can't read after the fast-forward is null (51.363839ms)
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (21.318323ms)
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
✔ core.fsmonitor (36.336067ms)
✔ core.hooksPath (35.308412ms)
✔ a hook file (31.365203ms)
✔ include.path (34.472125ms)
✔ includeIf (36.084654ms)
✔ a filter driver (34.055899ms)
✔ origin moved (32.539935ms)
✔ a second origin url (33.07798ms)
✔ the origin url twice, both the root (36.790434ms)
✔ an ext:: origin (33.773105ms)
✔ a branch tracking another remote (32.53664ms)
✔ a branch merging a tag (33.0562ms)
✔ a fetch line onto local branches (45.722419ms)
✔ no origin (37.741976ms)
✔ a config file over the size cap (33.097067ms)
✔ config a symlink to /dev/zero (32.784416ms)
✔ the clone a symlink to the bait (37.309026ms)
✔ the clone a file (32.263156ms)
✔ the clone a plain directory (32.341275ms)
✔ .git a gitdir: file (33.511435ms)
✔ .git a symlink (34.115538ms)
✔ .git/logs a symlink (31.968904ms)
✔ .git/refs/heads a symlink (31.658663ms)
✔ .git/objects a symlink (32.924046ms)
✔ a reflog hard-linked to a file outside (34.527659ms)
✔ HEAD a fifo (33.428633ms)
✔ a commondir file (33.702159ms)
✔ an alternates file (32.027032ms)
✔ a gitlink staged, no .gitmodules (43.814198ms)
✔ a gitlink and .gitmodules staged (46.983327ms)
✔ a gitlink to a repository with its own gitlink (53.609458ms)
✔ a gitlink and .gitmodules committed (49.869838ms)
✔ a gitlink and submodule.active in config (47.500325ms)
✔ a .git/modules with no gitlink (35.716895ms)
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1240.317214ms)
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
✔ missing (10.076311ms)
✔ not a repository (9.980061ms)
✔ a plain directory inside another repository (14.719629ms)
✔ unreadable (10.094249ms)
✔ on no branch (11.905195ms)
✔ missing an object (15.137253ms)
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (72.687428ms)
✔ a clone whose root is on no branch, or gone, is kept and named (29.968752ms)
✔ no credential or forge remote of the root reaches a clone (48.688931ms)
✔ every project in the business file gets its own clone at its own branch (39.973706ms)
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.296908ms)
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.355942ms)
✔ a timeout signals git's process group, so a process git started dies with it (514.766177ms)
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (521.179359ms)
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.06295ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.16136ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (25.55366ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.375068ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (146.561651ms)
✔ runGate: the first failing step stops the gate and names its log (228.628569ms)
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (164.670764ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (568.016482ms)
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.698995ms)
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.713757ms)
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.658155ms)
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.164466ms)
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.977119ms)
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.161728ms)
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1712.481289ms)
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2456.579466ms)
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (260.065427ms)
✔ resolveSeat: by name under --repo resolves the repo layout (1.340055ms)
✔ resolveSeat: by path resolves the fleet layout (0.338374ms)
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.715789ms)
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.64427ms)
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.789064ms)
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.307441ms)
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.122049ms)
✔ CLI launch: registers, execs the fake launch script, and passes args through (31.622215ms)
✔ CLI launch: --harness lands in the record (28.801084ms)
✔ CLI launch: the launch script's own exit code passes through (27.301255ms)
✔ CLI launch: relaunching a seat rewrites the one registration record (58.619438ms)
✔ CLI launch: omitting --task records an empty string, not null (28.870329ms)
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (84.419701ms)
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (126.363377ms)
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.45891ms)
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.551553ms)
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.715893ms)
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.117535ms)
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (254.795453ms)
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.79778ms)
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.743822ms)
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.248085ms)
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.548494ms)
✔ session file and launch log: 0600, the session file written once (1.037325ms)
✔ endReason maps the runner's exit codes; a signal is killed (0.131241ms)
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.732897ms)
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.584148ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.750341ms)
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.955864ms)
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (302.007076ms)
✔ workRef and validBranch take only what a ref name can hold (1.152536ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (150.856635ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (147.418579ms)
✔ a branch with no history in common with main refuses unrelated-history (67.643867ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (44.290334ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (142.98199ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (101.199795ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (103.028033ms)
✔ only a v2 bundle with the named branch is read (64.100795ms)
✔ a branch named main, or named for another task, moves only this task's work ref (126.493614ms)
✔ a record that throws moves the work ref back, or removes a new one (172.783866ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (422.39657ms)
✔ a root that can't be read refuses root-unreadable (28.003359ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2187.835368ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.127111ms)
✔ a working repository path that isn't a directory refuses (28.894443ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (126.674189ms)
✔ review of a project with no working repository refuses unknown-commit (16.339097ms)
✔ the runner's git tools hold the host's limits and branch rule (1.352209ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (214.402529ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (146.513368ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (116.446654ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (350.201075ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (227.846829ms)
ℹ tests 148
ℹ suites 0
ℹ pass 148
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6079.672118
@@ -0,0 +1,105 @@
✔ the boot config is checked before anything starts (96.584994ms)
✔ a business with no tracker entry refuses task verbs (110.669488ms)
✔ credential.expiring and .expired are recorded once per instance (207.702524ms)
✔ a token file that changes on disk records credential.changed (114.476589ms)
✔ autostart polls, reconciles and retries a startup the tracker was down for (115.121393ms)
✔ a refusal a restart must clear is not retried by the poll (99.826698ms)
✔ a poll that fires while two are queued is dropped (100.516178ms)
✔ close waits for a running verb and refuses one that has not started (194.156972ms)
✔ stopped bus resumes an empty task cursor after a long outage, exactly once (187.684601ms)
✔ persisted IDs avoid replay, exclude bots and bound rows to observed new comments (185.894752ms)
✔ commit followed by crash before cache advance neither loses nor duplicates a comment (139.72801ms)
✔ failed event insert rolls back cursor and a retry still emits the comment once (139.788815ms)
✔ initial cursor accepts a comment within the stated one-minute clock skew margin (112.878668ms)
✔ the bundled Vikunja is the pinned upstream image the runbook names (1.090074ms)
✔ every published port is on 127.0.0.1, and no secret is in the file (0.399021ms)
✔ the committed table loads frozen; its verbs are the broker task verbs (1.215147ms)
✔ a write names a verb the table has as its own key, not one it inherits (0.432868ms)
✔ the schema refuses any other shape (1.85717ms)
✔ the Field table in the slice 1 plan names the verbs each field is written by (0.55073ms)
✔ each verb refuses, asks for a decision and writes as the table and the role files say (1160.138311ms)
✔ the list holds the PRD's requirement ids, in its order, at its version (1.372814ms)
✔ the committed list loads frozen (0.601668ms)
✔ the schema refuses any other shape (2.208473ms)
✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (340.794806ms)
✔ the project list holds recorded project objects in the recorded list envelope (98.908802ms)
✔ the recorded task bodies pass the checks S3 applies to every read (0.434159ms)
✔ the client works against the fake over real HTTP with the platform fetch (263.819591ms)
✔ a correct install starts, and the first reconcile records tasks that already exist (120.086942ms)
✔ verbs refuse while a business is starting and after startup refused it (125.305217ms)
✔ startup refuses a token that can do more than its role needs (388.355867ms)
✔ startup refuses an unsupported version and flags an untested one (284.994252ms)
✔ startup refuses a board that the runbook did not install (315.403275ms)
✔ startup refuses a project the sync bot cannot read (88.583835ms)
✔ startup refuses a configured label the pm bot cannot see (85.601883ms)
✔ startup refuses an expired credential and a missing sync credential (175.30681ms)
✔ an unreachable tracker refuses with tracker-unavailable (78.625244ms)
✔ an edit in the UI is recorded once, with the fields that changed (205.506174ms)
✔ a move between open buckets is seen on the board, though updated does not change (171.429535ms)
✔ a person's comment is counted and a bot's is not (252.930027ms)
✔ the hourly reconcile catches a comment through comment_count (222.180551ms)
✔ a task closed in the UI leaves the open view with its done bucket (372.418737ms)
✔ a task that leaves the board is recorded as deleted, moved or out of reach (256.59276ms)
✔ a poll that read before a verb wrote does not overwrite the verb (168.710381ms)
✔ a tracker fault during a tick is reported and the next tick catches up (162.570821ms)
✔ a malformed answer refuses the tick with tracker-shape (110.548993ms)
✔ no token value reaches the database, the log or a refusal (262.694069ms)
✔ the first look at a task counts only comments inside the window (167.656451ms)
✔ with descendants off the adapter reads no project list and no child, as in v0 (127.877486ms)
✔ a three-level tree is read per project, and a project outside it is not (103.112964ms)
✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (198.139801ms)
✔ a root without the installed buckets refuses with descendants on (107.947563ms)
✔ the project list refuses without read_all, and skips archived projects and saved filters (188.613614ms)
✔ descendants must be true or false (96.095953ms)
✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (155.49092ms)
✔ a child made after startup joins the tree at the next reconcile (144.842376ms)
✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (165.240335ms)
✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (180.419741ms)
✔ a reconcile that fails keeps the previous tree (129.199188ms)
✔ a closed task the cursor missed takes its own project's done bucket (125.122195ms)
✔ closed tasks read at startup take their own project's done bucket (90.309712ms)
✔ a closed task the cursor returns takes its own project's done bucket (119.963411ms)
✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (118.148168ms)
✔ a task in a bucket outside the five keeps its raw bucket id (116.317051ms)
✔ bucket 0 on a watch-only task never becomes a bucket or a state (200.992951ms)
✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (130.915606ms)
✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (119.820865ms)
✔ task.create needs a recorded human request and a requirement id (189.952001ms)
✔ task.create takes only an approved requirement id (216.402311ms)
✔ task.create cites the request a received message carries, not the message's id (169.619466ms)
✔ only labels named in the business file can be written (229.247865ms)
✔ task.schedule sets and clears a due date and relations (260.417273ms)
✔ assign and reassign move the role bots and record task.assigned (300.348024ms)
✔ task.update.assigned is for the assignee and records task.state (299.071366ms)
✔ a wrong expected digest records task.conflict and writes nothing (169.89321ms)
✔ a cross-role verb needs a resolved decision, used once (219.165889ms)
✔ task.close needs a verdict; after it every verb refuses with task-done (223.269891ms)
✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (252.605569ms)
✔ a lost answer is settled by a re-read and never retried (159.739949ms)
✔ a create whose answer is lost is reported uncertain, and the poll finds the task (110.98078ms)
✔ a task the sync bot cannot read refuses and records nothing (89.993967ms)
✔ verbs and polls for one business run one at a time (155.379276ms)
✔ a due date with milliseconds is written to the second (151.259331ms)
✔ every write landed and the final read failed: the verb succeeds and records what it wrote (106.470259ms)
✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (79.960042ms)
✔ a create whose final read fails succeeds and records task.created (89.514709ms)
✔ an edit between the last write and the final read shows as external on the next poll (113.057946ms)
✔ task.created is recorded when a later label write fails (80.096615ms)
✔ every verb acts in an installed child, on the child's own board (251.763118ms)
✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (162.7464ms)
✔ with descendants off, task.create takes only the root project (77.44044ms)
✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (111.061527ms)
✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (138.744626ms)
✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (93.378246ms)
✔ a verb and a create in the child record the final read of the child's board (86.427247ms)
✔ a create in the child whose final read fails records the child's todo bucket (97.416164ms)
✔ a lost answer in the child is settled by a re-read of the child's board (121.123871ms)
✔ every related task is read before authority, not only the first (95.843013ms)
ℹ tests 97
ℹ suites 0
ℹ pass 97
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 5020.853991
@@ -0,0 +1,123 @@
✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (7110.020529ms)
✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (7108.811955ms)
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (3764.441324ms)
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (5976.082819ms)
✔ the README says a refused field table names the file or the key at fault, never a path (1.1232ms)
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (7822.316876ms)
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (313.304258ms)
✔ decisions route serves the roles and recent lists from the reader view (491.517572ms)
✔ credentials route serves the broker credential status from the reader view (242.304295ms)
✔ replies route serves the replies to one message from the reader view (820.955563ms)
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (157.951527ms)
✔ bus refusals map to statuses and never carry a path or a stack (124.77814ms)
✔ humanCall speaks the human transport protocol without blocking the server (1981.911641ms)
✔ busReader takes --business, else the live bus host, else refuses (516.405949ms)
✔ humanCall kills a transport that runs past its timeout (527.318275ms)
✔ serve refuses a --business value that is not a business id (449.165564ms)
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (5248.402447ms)
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3273.891833ms)
✔ conversation view: a newer session with no readable history keeps the marker (2364.909161ms)
✔ conversation view: seats without history say so and offer no reply (3292.855477ms)
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (5034.207416ms)
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54722.873981ms)
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (309.647893ms)
✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (10472.019385ms)
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (3767.311844ms)
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2579.902533ms)
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (7103.547226ms)
✔ copy writes nothing when an archived path is missing at the commit (1171.150912ms)
✔ a copy that loses the rename race leaves no read-only temp directory behind (775.188004ms)
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (1376.612304ms)
✔ a copy that meets a target holding files says exists: and moves nothing into it (684.587053ms)
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (578.112183ms)
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (825.43574ms)
✔ serve refuses a --checkout that is not an absolute directory path (233.794419ms)
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (50.000043ms)
✔ preview options are all three or none, and each is checked (11.781432ms)
✔ the CLI refuses a partial or invalid preview flag set at start (2374.739031ms)
✔ the CLI with all three flags serves the preview mode (259.888502ms)
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (24.891883ms)
✔ the header name matches without regard to case, and the value compare is exact (5.050395ms)
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (38.278194ms)
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (15.872345ms)
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (8.040004ms)
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (25.63645ms)
✔ a repeated Host is 400 before any other check, in preview mode and without it (13.005613ms)
✔ without the preview flags the public name is refused and writes still reach the board (8.083129ms)
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (1.504968ms)
✔ credential state from the date alone, as the bus states it (0.16702ms)
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1320.020335ms)
✔ queue: a refused read fails closed with the store's text, redacted (1511.374048ms)
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (3472.365249ms)
✔ business: names, vars on the allowlist, authority, credential metadata only (17.056563ms)
✔ business: missing or invalid file refuses with the module's text, redacted (30.88067ms)
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (9.914278ms)
✔ settings: release, board, loopback address, notifier binding name only (1101.071896ms)
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (70.191315ms)
✔ bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it (33.495431ms)
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (5079.14403ms)
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (23004.659078ms)
✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (7491.145593ms)
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13501.555034ms)
✔ startServer takes send only as a function and only with the preview mode (9.646301ms)
✔ the CLI refuses --send without the preview flags, and without a configured bus (451.701468ms)
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (155.833241ms)
✔ without --send the route is read-only like every other write, and config says no send (8.831627ms)
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (5.852617ms)
✔ config says send only on the public name with --send on (1.847424ms)
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.534762ms)
✔ each request check refuses before anything is sent, and logs the refusal without the body (16.734713ms)
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (3.71842ms)
✔ a crafted role name cannot forge a log line (2.344858ms)
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (6.964962ms)
✔ through the human transport the request is exactly the business, message.send and the keys (94.116403ms)
✔ against a real broker: the message is written once as a human send, and its refusals map (1503.565407ms)
✔ loopback host and board origin fail closed (7.439439ms)
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (300.43754ms)
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (35.955884ms)
✔ unreachable board reports URL; CLI rejects unsupported options (332.623811ms)
✔ render prints the unit without the preview flags (8.794885ms)
✔ render carries every serve flag, the preview set included (5.735761ms)
✔ a partial preview set is refused (13.460139ms)
✔ a value the unit cannot carry is refused, for every flag (231.777394ms)
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (28.316188ms)
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (133.140762ms)
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (42.006392ms)
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (185.834409ms)
✔ status prints the unit state and GET /healthz on the installed port (327.630543ms)
✔ usage: an unknown verb or flag, and start or enable, exit 4 (224.602997ms)
✔ without --send, render is the template with its placeholders filled, byte for byte (192.46207ms)
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (159.047086ms)
✔ --send without the whole preview set is refused and writes nothing (265.21341ms)
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (542.395198ms)
✔ uninstall and status take no --send (150.231725ms)
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (466.17361ms)
✔ when the state read fails, install and uninstall refuse with one line and change nothing (80.131868ms)
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (86.8107ms)
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (293.939611ms)
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (40.359026ms)
✔ the uid header takes only an Authentik uid; the username header still takes a username (310.918573ms)
✔ a preview value cannot start with - or . (32.913252ms)
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (566.9717ms)
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (3355.81786ms)
2026-10-16T18:52:18.067Z settings user="jason" changed
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (18.457199ms)
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (8.091616ms)
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (6.830401ms)
✔ tokens.css and icons.svg are byte copies of docs/design (1.316614ms)
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.626843ms)
✔ shipped strings are unchanged, and the web keeps its write boundary (2.985943ms)
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (7455.06422ms)
✔ five states on Board, Inbox, Tasks, Agents and Trail (3371.199967ms)
✔ Queue, Business and Settings in their five states, with no move button (4903.818599ms)
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3950.812153ms)
✔ the server log names no config path when the system config refuses (316.410919ms)
ℹ tests 113
ℹ suites 0
ℹ pass 113
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 55154.695667
@@ -0,0 +1,17 @@
OK status with missing harness credential exits 3 and still lists accounts
OK status reports harness credential (read-only) + mosaic accounts
OK api key material never reaches output
OK oauth token material never reaches output
OK unparseable credential file exits 2
OK symlinked credential file exits 4
OK env-side credential names reported
OK env var values never reach output
OK accounts without an accounts dir reports none and creates nothing
OK accounts lists files and marks the active one
OK loose account perms flagged in listing
OK agent --auth with missing account file refuses (exit 4)
OK agent --auth with non-0600 account file refuses
OK agent --auth with invalid account name refuses
OK auth.sh without valid config refuses
selftest: 15 passed, 0 failed
@@ -0,0 +1,55 @@
Note: switching to '7a2987cf51e2c010038783889379ec29fb4332cb'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
Not currently on any branch.
nothing to commit, working tree clean
Note: switching to '7a2987cf51e2c010038783889379ec29fb4332cb'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
OK dry-run: allowed change, exit 0, nothing committed (exit 0)
OK dry-run committed nothing
OK apply: allowed change exits 0 (exit 0)
OK apply: attribution in commit subject
OK apply: target tree clean after commit
OK disallowed path refused (exit 1)
OK disallowed path: target untouched
OK syntax gate refused broken .mjs (exit 1)
OK syntax gate: target untouched
OK suite failure refused (exit 1)
OK suite failure: target reverted to clean
OK disabled policy refused (exit 2)
OK disabled policy: target untouched
OK failed run refused (exit 1)
OK failed run: target untouched
OK missing run exits 4 (exit 4)
OK invalid policy exits 2 (exit 2)
selftest: 17 passed, 0 failed
@@ -0,0 +1,26 @@
OK absent adapter defaults to pi
OK adapter mock validates (exit 0)
OK unsupported adapter exits 2 (exit 2)
OK env exports adapter
OK bootstrap creates default when absent (exit 0)
OK bootstrap wrote config file
OK bootstrap is idempotent on existing config (exit 0)
OK bootstrap did not rewrite existing config
OK validate missing config exits 3 (exit 3)
OK malformed JSON exits 2 (exit 2)
OK unsupported configVersion exits 2 (exit 2)
OK unknown top-level key exits 2 (exit 2)
OK unknown execution key exits 2 (exit 2)
OK unsupported backend exits 2 (exit 2)
OK unsupported environment exits 2 (exit 2)
OK relative dataRoot exits 2 (exit 2)
OK non-canonical dataRoot exits 2 (exit 2)
OK filesystem root dataRoot exits 2 (exit 2)
OK home directory dataRoot exits 2 (exit 2)
OK dataRoot containing config dir exits 2 (exit 2)
OK control character in provider exits 2 (exit 2)
OK symlinked config file exits 2 (exit 2)
OK env exports resolve correctly
OK failed validation modified nothing
selftest: 24 passed, 0 failed
@@ -0,0 +1,82 @@
toolchain: node v26.8.1
OK syntax: packages/discord/src/approvals.mjs
OK syntax: packages/discord/src/authorize.mjs
OK syntax: packages/discord/src/binding.mjs
OK syntax: packages/discord/src/cli.mjs
OK syntax: packages/discord/src/connector.mjs
OK syntax: packages/discord/src/context.mjs
OK syntax: packages/discord/src/engine-pi.mjs
OK syntax: packages/discord/src/errors.mjs
OK syntax: packages/discord/src/gateway.mjs
OK syntax: packages/discord/src/git.mjs
OK syntax: packages/discord/src/journal.mjs
OK syntax: packages/discord/src/notify.mjs
OK syntax: packages/discord/src/rest.mjs
OK syntax: packages/discord/src/setspark.mjs
OK syntax: packages/discord/src/tools.mjs
OK syntax: packages/discord/src/web.mjs
OK syntax: packages/discord/bin/git-credential.mjs
OK syntax: packages/discord/extension/tools.mjs
OK syntax: packages/discord/tests/approvals.test.mjs
OK syntax: packages/discord/tests/authorize.test.mjs
OK syntax: packages/discord/tests/binding.test.mjs
OK syntax: packages/discord/tests/connector.test.mjs
OK syntax: packages/discord/tests/context.test.mjs
OK syntax: packages/discord/tests/copy-service.test.mjs
OK syntax: packages/discord/tests/engine.test.mjs
OK syntax: packages/discord/tests/fake-pi.mjs
OK syntax: packages/discord/tests/gateway.test.mjs
OK syntax: packages/discord/tests/git.test.mjs
OK syntax: packages/discord/tests/helpers.mjs
OK syntax: packages/discord/tests/journal.test.mjs
OK syntax: packages/discord/tests/notify.test.mjs
OK syntax: packages/discord/tests/offline-check.test.mjs
OK syntax: packages/discord/tests/recover.test.mjs
OK syntax: packages/discord/tests/rest.test.mjs
OK syntax: packages/discord/tests/setspark.test.mjs
OK syntax: packages/discord/tests/tools.test.mjs
OK syntax: packages/discord/tests/web.test.mjs
OK syntax: packages/discord/fixtures/claim-worker.mjs
OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs
OK syntax: scripts/discord.sh
OK syntax: scripts/discord-service.sh
OK packages/discord declares no dependencies
OK no bot-token-shaped string in packages/discord
OK fixture binding uses placeholder ids only
OK fixture binding validates
OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool
OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start
OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root
OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token
OK real pi with protocol vault adds reserve_id to the git verbs
OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key
OK real pi refuses a git key on a read-only root (fail closed)
OK real pi with the pilot flags (--no-tools) exposes no tool at all
OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed)
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
OK node --test packages/discord/tests/ (ℹ pass 183)
OK scripts/discord.sh --help exits 0
OK scripts/discord.sh check without a binding exits 4
OK scripts/discord.sh recover without a binding exits 4
OK scripts/discord.sh reload without a binding exits 4
OK scripts/discord-service.sh without a command exits 4
OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP
OK service install writes the rendered unit (0644) and leaves no temp file
OK service install a second time reports unchanged
OK systemd-analyze verify accepts the rendered unit
OK service uninstall removes the unit file
OK service install with an unknown flag exits 4
OK service install with USER unset finishes and names the account for lingering
OK pinned render runs copy CLI with copy cwd/repo and no checkout executable
OK pinned install writes the rendered unit in a temporary unit directory
OK pinned install refuses short prerequisite and writes no unit
OK pinned install refuses missing prerequisite and writes no unit
OK pinned install refuses cli prerequisite and writes no unit
OK pinned install refuses pi prerequisite and writes no unit
OK status names the copy from fake systemctl effective cwd
OK checkout install explicitly recommends --copy
OK wrapper check --offline passes local fixture and makes no network call
OK wrapper run --offline refuses usage
discord suite: 78 passed, 0 failed
@@ -0,0 +1,21 @@
OK initial ordinary-file install
OK installed tree matches canonical source
OK installed tree has no symlinks
OK check detects installation drift
OK sync refuses to overwrite installation drift
OK check detects an extra destination file
OK check detects an extra destination directory
OK check rejects a destination symlink
OK sync accepts a canonical source update
OK updated installation matches canonical source
scripts/test-extension-package.sh: line 14: 548051 Killed "$@" > /dev/null 2>&1
OK forced interruption kills the replacing process
OK next invocation recovers old consistent installation
OK interrupted replacement rolled back
OK sync succeeds after interruption recovery
OK unlocked stale lock file does not block
OK active lock refuses a concurrent sync
OK source symlink fails closed
OK nested second entrypoint fails closed
extension package selftest: 18 passed, 0 failed
@@ -0,0 +1,53 @@
toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0
OK syntax: scripts/foundation-inspect.mjs
OK syntax: scripts/foundation/strict-json.mjs
OK syntax: scripts/foundation/canonical.mjs
OK syntax: scripts/foundation/resolve.mjs
OK syntax: scripts/foundation/validate-record.mjs
OK syntax: scripts/foundation/fixtures/build-fixtures.mjs
OK syntax: scripts/foundation/canonical.test.mjs
OK syntax: scripts/foundation/cli.test.mjs
OK syntax: scripts/foundation/fixtures.test.mjs
OK syntax: scripts/foundation/resolve.test.mjs
OK syntax: scripts/foundation/strict-json.test.mjs
OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written)
OK fixture generator runs
OK checked-in fixtures/bundles equal a fresh generation
OK checked-in fixtures/raw equal a fresh generation
OK checked-in fixtures/index.json equal a fresh generation
OK checked-in demo bundles equal a fresh generation
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
OK node --test scripts/foundation/ (ℹ pass 80)
OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof)
platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999)
node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases)
schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10
profile column (schema-valid records only): profile-valid 510, profile-invalid 30
profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns
OK oracle: zero schema-column disagreements with the pinned checker
OK oracle: strict-only profile refusals are counted and asserted
OK demo: permitted read preview exits 0 (exit 0)
OK demo: permitted file.change preview exits 0 (exit 0)
OK demo: assignment.change proposal is unresolved (exit 3) (exit 3)
OK demo: revoked registration is refused (exit 3) (exit 3)
OK demo: message is not authority (exit 3) (exit 3)
OK usage: no arguments exits 2 (exit 2)
OK io: missing file exits 4 (exit 4)
OK io: directory exits 4 (exit 4)
OK io: symlink exits 4 (O_NOFOLLOW) (exit 4)
OK bound: oversize fixture exits 2 (exit 2)
OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2)
OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2)
OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0)
OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed
OK text output starts with the disclaimer
OK json output is valid JSON with result allowed and exactly the charter §7 fields
OK json golden matches byte-for-byte
OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal
OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs
OK canary never printed (bundle run and credential-file run)
OK a non-bundle JSON file is refused at the shape gate, not read into output
OK no field of the non-bundle file is echoed
selftest: 44 passed, 0 failed
@@ -0,0 +1,86 @@
OK args: exit 2, target-branch
OK args: exit 2, target-branch
OK args: exit 4
OK args: exit 4
OK args: exit 4
OK --base next refuses before the config is read (got 2)
OK a missing system config exits 3 (got 3)
OK nobus: exit 3
OK schema-table: exit 2, bus-schema
OK schema-meta: exit 2, bus-schema
OK openBus opens the database read-only
OK other-business: exit 2, decision-not-found
OK no-raise: exit 2, decision-not-found
OK not-a-merge: exit 2, not-a-merge
OK open: exit 2, not-resolved
OK withdrawn: exit 2, not-resolved
OK by-agent: exit 2, not-human
OK via-webui: exit 2, not-human
OK no-answer: exit 2, not-human
OK answer-role: exit 2, not-human
OK answer-run: exit 2, not-human
OK answer-choice: exit 2, not-human
OK two-answers: exit 2, not-human
OK chose-no: exit 2, not-merge-option
OK two-refs: exit 2, work-ref
OK bad-ref: exit 2, work-ref
OK task-ref-disagrees: exit 2, work-ref
OK raise-task-disagrees: exit 2, work-ref
OK target-main: exit 2, target-branch
OK superseded-question: exit 2, superseded
OK superseded-task: exit 2, superseded
OK superseded-by: exit 2, superseded
OK no-verdict: exit 2, no-verdict
OK changes-later: exit 2, not-approved
OK short-commit: exit 2, not-approved
OK wrong-task-body: exit 2, not-approved
OK args: exit 2, decision-not-found
OK earlier-merge: exit 0
OK ref-moved: exit 2, ref-moved
OK root-top: exit 2, root-file
OK root-newdir: exit 2, root-file
OK root-src: exit 2, root-file
OK unrelated: exit 2, base-conflict
OK empty: exit 2, base-conflict
OK an empty reviewed diff says so
OK dirty-changed: exit 2, checkout-dirty
OK dirty-staged: exit 2, checkout-dirty
OK dirty-untracked: exit 2, checkout-dirty
OK conflict: exit 2, base-conflict
OK a refusal after the worktree is added leaves no worktree or scratch
OK cleanup looks for the worktree's Docker network
OK dirty-during: exit 2, checkout-dirty
OK a reviewed path dirtied during the gate moves no ref
OK drift: exit 2, patch-drift
OK patch-drift leaves no worktree or scratch
OK gate-pkg: exit 2, gate-failed
OK gate-failed names the failing step's log, and it exists
OK gate-failed leaves no worktree or scratch
OK gate-script: exit 2, gate-failed
OK a failing scripts/test-*.sh fails the gate
OK a failed gate moves no ref
OK nomods: exit 4
OK a target without node_modules leaves no worktree or scratch
OK moved: exit 2, base-moved
OK base-moved keeps the base where it moved to
OK dry: exit 0
OK --dry-run writes no ref
OK --dry-run prints the commit with --subject and --attribution
OK --dry-run runs the gate
OK --dry-run leaves no worktree or scratch
OK land: exit 0
OK the landing is one commit on the old base
OK its diff is the reviewed diff by patch-id
OK its tree is the dry run's
OK the message has the option's subject, the citations and the attribution last
OK it prints the line for the PM
OK the checked-out base has the reviewed paths and keeps the unrelated edit
OK only refs/heads/refactor exists in the target
OK the work ref is unchanged
OK the bus database is unchanged
OK the gate ran each package suite but queue, and each scripts/test-*.sh
OK the landing leaves no worktree or scratch
OK the target's node_modules is still there, with its contents
OK the worktree's Docker network is removed
---
land-work selftests: 84 passed, 0 failed
@@ -0,0 +1,36 @@
toolchain: node v26.8.1, git version 2.55.0
OK syntax: packages/queue/src/cli.mjs
OK syntax: packages/queue/src/errors.mjs
OK syntax: packages/queue/src/io.mjs
OK syntax: packages/queue/src/lock.mjs
OK syntax: packages/queue/src/queue.mjs
OK syntax: packages/queue/src/review.mjs
OK syntax: packages/queue/src/store.mjs
OK syntax: packages/queue/tests/commit.test.mjs
OK syntax: packages/queue/tests/data.test.mjs
OK syntax: packages/queue/tests/dispatch.test.mjs
OK syntax: packages/queue/tests/gate-owner.test.mjs
OK syntax: packages/queue/tests/helpers.mjs
OK syntax: packages/queue/tests/lock.test.mjs
OK syntax: packages/queue/tests/migration.test.mjs
OK syntax: packages/queue/tests/review.test.mjs
OK syntax: packages/queue/tests/store.test.mjs
OK syntax: packages/queue/tests/write.test.mjs
OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs
OK syntax: packages/queue/tests/fixtures/kill-at.mjs
OK syntax: packages/queue/tests/fixtures/lock-child.mjs
OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh
OK syntax: scripts/queue-commit.sh
OK syntax: scripts/git-hooks/pre-commit
OK syntax: scripts/mosaic
OK queue-commit.sh, the guard and scripts/mosaic are executable
OK packages/queue declares no dependencies
ℹ tests 156
ℹ pass 156
ℹ fail 0
OK node --test packages/queue/tests/
OK scripts/mosaic queue help
skip queue verify and render --check: this checkout (/home/jwoltje/darkwing-scratch/r137/wt) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
queue suite: 28 passed, 0 failed
@@ -0,0 +1,16 @@
OK valid RELEASE resolves (exit 0)
OK invalid RELEASE exits 1 (exit 1)
OK missing RELEASE exits 1 (exit 1)
OK valid RELEASE leaves image tag consistent with version
OK status safe on empty state (exit 0)
OK status created no pointer
OK fault-injected activation refuses (exit 1)
OK refused activation wrote no pointer
OK refusal logged exactly once with valid fields
OK healthy activation succeeds (exit 0)
OK pointer written with valid fields
OK repeat activation succeeds (log grows) (exit 0)
OK log is append-only across activations
OK rollback without previous refuses (exit 1)
selftest: 14 passed, 0 failed
@@ -0,0 +1,101 @@
OK valid task validates (exit 0)
OK unknown task key exits 2 (exit 2)
OK unsupported taskVersion exits 2 (exit 2)
OK invalid task id exits 2 (exit 2)
OK empty prompt exits 2 (exit 2)
OK NUL in expectExact exits 2 (exit 2)
OK out-of-range timeout exits 2 (exit 2)
OK missing mission file exits 4 (exit 4)
OK task with valid mission validates (exit 0)
OK invalid mission exits 2 (exit 2)
OK validate missing task exits 4 (exit 4)
OK validation does not modify the task file
OK prune dry-run exits 0 (exit 0)
OK dry-run deleted nothing
OK prune --keep=2 --yes removes oldest (exit 0)
OK kept exactly 2 newest runs
OK newest run kept, oldest pruned
OK append-only receipt written (3 entries)
OK sessions/workspaces untouched by prune
OK prune with invalid keep exits 4 (exit 4)
OK mock adapter: gate passes on matching mock response (exit 0)
OK mock adapter: expect-mismatch recorded (exit 1)
OK mismatch reason recorded
OK unknown adapter fails closed (exit 1)
OK mission task runs via mock adapter (exit 0)
OK mission section injected into generated prompt
OK retry of mission run succeeds (exit 0)
OK retriedFrom lineage recorded
OK mission section present after retry (relative path resolved)
OK retry of missing run exits 4 (exit 4)
OK skill install bundled ms-tools (exit 0)
OK installed to skills-available
OK double install refuses (exit 1)
OK activate enables skill (exit 0)
OK enabled dir populated
OK uninstall while enabled refuses (exit 1)
OK deactivate moves back to available (exit 0)
OK uninstall removes from available (exit 0)
OK seat with enabled skill launches
OK skill path delivered to adapter
OK shipped researcher contract resolves (ceiling + network)
OK resolve-role refuses a non-role document (conductor policy) (exit 2)
OK resolve-role refuses name/filename mismatch (exit 2)
OK resolve-role refuses unknown network declaration (exit 2)
OK resolve-role refuses duplicate role tool (exit 2)
OK resolve-role refuses unsupported tool (exit 2)
OK resolve-role refuses missing contract file (exit 4)
OK version 1 role prints no contract line
OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer)
OK resolve-role accepts a minimal version 2 role (exit 0)
OK resolve-role refuses an action outside the vocabulary (exit 2)
OK resolve-role refuses a gated-only action in a role file (exit 2)
OK resolve-role refuses a Vikunja verb no role may hold (exit 2)
OK resolve-role refuses a version 2 role whose contract is missing (exit 2)
OK resolve-role refuses a contract that is a symbolic link (exit 2)
OK seat launches under role ceiling
OK role ceiling narrows seat tools (read,write,bash -> read,bash)
OK narrowing recorded loudly
OK missing role contract refuses launch (exit 2)
OK missing-contract refusal names the role
OK empty ceiling intersection -> tool-free seat
OK tool-free outcome recorded loudly
OK overridden agents dir without seat definition refuses (exit 4)
OK seat-resolution refusal names the seat
OK policy: mission only -> mission tools
OK policy: task only -> task tools
OK policy: both -> intersection (task narrowed)
OK policy: empty intersection -> tool-free
OK invalid mission capabilities rejected (exit 2)
mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls)
OK task run with user layer present (exit 0)
OK user context dispatched into generated prompt
OK workspace+tools task runs via mock (exit 0)
OK workspace path + tools delivered to adapter
OK persistent workspace created on host
OK plain task still runs (no workspace/tools) (exit 0)
OK workspace var present but empty when absent
OK tools empty when absent
OK unknown tool exits 2 (exit 2)
OK workspace traversal exits 2 (exit 2)
OK live hello task succeeds with exact marker
OK result.json written in run dir
OK result.json contents are correct
OK wrong expectExact fails with exit 1 (reason: expect-mismatch)
OK each run gets a distinct run dir (no clobber)
OK list shows both runs
OK fork base: teach succeeds (exit 0)
OK fork child recalls ancestor context (exit 0)
OK forked child recalled ancestor code word
OK ancestor session untouched by fork
OK child session dir has its own branch file
OK onboard without name exits 4 (non-interactive) (exit 4)
OK onboard --name renders profile (exit 0)
OK profile written
OK canon structure: required filled, optional placeholdered
OK canon sections present
OK user recall run succeeds
OK recalled user name (response: Jason)
OK no agent identity on headless run
selftest: 98 passed, 0 failed
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,31 @@
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
128aae5d0d6c3d2b11c474508d75b412d24b2b3fff3079822b4fe6de96b53dce packages/bus/README.md
380f01f7d97485ff62acec37692b4b4354615fe1be486d18fbf85c82277819ec packages/bus/src/broker.mjs
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
62b641b44b2939c6eec86856b47de967d501e36d6cf437b993c844d8007353c1 packages/cli/README.md
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
03a4903b14ea72781a337e1782cba41918f35849b25e223110ed4d283864cee4 packages/cli/tests/git-socket.test.mjs
97c613a0e59d39fa715d32144741bd996a6392862353f0bf204029d707789d50 packages/cli/tests/launcher.test.mjs
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
a47aecd10338ffa77df4f1993b90ab60dd91cf33651eb5e7ac23f53f73d73d98 packages/harness/README.md
b97b5df64d6ea56183b2d672bbe95321ecfab5171f11e1ba643b6778b70b9fb6 packages/harness/src/bundle.mjs
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
81966394d5d875e3e62d231df4e5442849ff7dde40bebe6f52d8d9a7b3b6d99f packages/harness/tests/bundle.test.mjs
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
c09885c94d45a48345c132e7e7bf2233ca6787ca23771a35393e6dc635d784d6 packages/bus/src/landing.mjs
7ed287a6035cb2ca9d9df09054403df868820a32cdc714ff6b15aa36f8474e1b packages/bus/tests/land.test.mjs
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
@@ -0,0 +1,11 @@
base 7a2987cf5 working.mjs 0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 start 19:18:01
seat-working rc=0 19:18:01-19:18:07 ℹ pass 26 ℹ fail 0 ℹ skipped 0
cli-git-socket rc=0 19:18:07-19:18:16 ℹ pass 23 ℹ fail 0 ℹ skipped 0
kill-b1-patch-drift edit: line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
kill-b1-patch-drift rc=1 19:18:16-19:18:22 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b1-patch-drift KILLED: only "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed
kill-b2-against-root edit: line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
kill-b2-against-root rc=1 19:18:22-19:18:29 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b2-against-root KILLED: only "once the root shares no history with a landed main, a push is checked against main, not the root" failed
seat rc=0 19:18:29-19:18:36 ℹ pass 150 ℹ fail 0 ℹ skipped 0
ROUND_PASSED 19:18:36
@@ -0,0 +1,31 @@
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (468.742786ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (450.1039ms)
✔ the size cap refuses a push before any byte (236.893063ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (426.830271ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (261.339696ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (393.742348ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (298.919766ms)
✔ a review of a project the business no longer has refuses unknown-project (296.588919ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (255.283971ms)
✔ close() answers host-closing to a connection still sending its request line (223.840206ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (633.118467ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (517.021489ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (591.701562ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.219983ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (534.466153ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.021266ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.034736ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (439.791977ms)
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (354.235216ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (341.591759ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (340.561024ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (369.785283ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (348.641601ms)
ℹ tests 23
ℹ suites 0
ℹ pass 23
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8216.532812
@@ -0,0 +1,50 @@
✔ workRef and validBranch take only what a ref name can hold (1.112589ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (132.017935ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (131.951028ms)
✔ a branch with no history in common with main refuses unrelated-history (67.709236ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (48.603794ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (153.530007ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (95.044552ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (91.223103ms)
✔ only a v2 bundle with the named branch is read (59.921163ms)
✔ a branch named main, or named for another task, moves only this task's work ref (111.899426ms)
✔ a record that throws moves the work ref back, or removes a new one (157.20872ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (516.007777ms)
✔ a root that can't be read refuses root-unreadable (42.041594ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2225.771609ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1030.601983ms)
✔ a working repository path that isn't a directory refuses (33.629964ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (136.492586ms)
✔ review of a project with no working repository refuses unknown-commit (15.783781ms)
✔ the runner's git tools hold the host's limits and branch rule (1.231816ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (257.142736ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (165.765133ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (260.159955ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (134.259314ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (412.315834ms)
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (118.973334ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (229.397188ms)
ℹ tests 26
ℹ suites 0
ℹ pass 25
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6685.327014
✖ failing tests:
test at tests/working.test.mjs:531:1
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (118.973334ms)
AssertionError [ERR_ASSERTION]: Missing expected rejection.
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/working.test.mjs:544:3)
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: undefined,
operator: 'rejects',
diff: 'simple'
}
@@ -0,0 +1,45 @@
✔ workRef and validBranch take only what a ref name can hold (1.253114ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (143.549227ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (131.145298ms)
✔ a branch with no history in common with main refuses unrelated-history (71.275578ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (51.942901ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (162.626279ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (93.281737ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (91.170531ms)
✔ only a v2 bundle with the named branch is read (58.52534ms)
✔ a branch named main, or named for another task, moves only this task's work ref (105.938776ms)
✔ a record that throws moves the work ref back, or removes a new one (158.522492ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (403.553288ms)
✔ a root that can't be read refuses root-unreadable (31.200166ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2191.630084ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1032.134534ms)
✔ a working repository path that isn't a directory refuses (25.835822ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (141.45438ms)
✔ review of a project with no working repository refuses unknown-commit (16.9642ms)
✔ the runner's git tools hold the host's limits and branch rule (1.422314ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (261.590906ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (152.749522ms)
✖ once the root shares no history with a landed main, a push is checked against main, not the root (154.76656ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (134.909937ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (459.66953ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (156.389473ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (253.016454ms)
ℹ tests 26
ℹ suites 0
ℹ pass 25
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6548.457998
✖ failing tests:
test at tests/working.test.mjs:454:1
✖ once the root shares no history with a landed main, a push is checked against main, not the root (154.76656ms)
Error: the commit shares no history with main
at refuse (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/src/working.mjs:88:9)
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/src/working.mjs:224:76
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
code: 'unrelated-history'
}
@@ -0,0 +1,34 @@
✔ workRef and validBranch take only what a ref name can hold (1.088957ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (136.581789ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (113.932866ms)
✔ a branch with no history in common with main refuses unrelated-history (60.62182ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (42.020726ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (127.31239ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (88.374072ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (76.727718ms)
✔ only a v2 bundle with the named branch is read (50.177052ms)
✔ a branch named main, or named for another task, moves only this task's work ref (92.643992ms)
✔ a record that throws moves the work ref back, or removes a new one (133.431949ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (395.151927ms)
✔ a root that can't be read refuses root-unreadable (36.656656ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2176.337933ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.409164ms)
✔ a working repository path that isn't a directory refuses (30.512055ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.265654ms)
✔ review of a project with no working repository refuses unknown-commit (13.463647ms)
✔ the runner's git tools hold the host's limits and branch rule (1.170915ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (215.950482ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (148.305906ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (213.001025ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.077733ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (369.212541ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (144.682253ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (238.397869ms)
ℹ tests 26
ℹ suites 0
ℹ pass 26
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6226.559372
@@ -0,0 +1,163 @@
✔ a first launch clones the root at its branch, with the root's path as origin (46.402335ms)
✔ the clone is not at its place until git clone has finished (30.378869ms)
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (79.778759ms)
✔ a clone ahead of the root keeps its commits and counts as current (50.404522ms)
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
✔ a modified file (57.910668ms)
✔ an untracked file (59.09627ms)
✔ a staged file (59.010129ms)
✔ another branch (58.797002ms)
✔ a detached HEAD (57.695687ms)
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (294.01783ms)
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (93.14183ms)
▶ a clone kept before the branch check, or for a failed status, gets no fetch
✔ not-a-clone (60.667167ms)
✔ hooks-present (37.843541ms)
✔ submodule (38.415573ms)
✔ config-changed (82.129898ms)
✔ root-unreadable (44.486316ms)
✔ root-detached (49.335971ms)
✔ status-failed, on the root's branch and clean (50.230333ms)
✔ status-failed, dirty (44.808268ms)
✔ a clone kept before the branch check, or for a failed status, gets no fetch (409.559046ms)
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (49.748997ms)
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (56.866448ms)
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (98.637908ms)
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
✔ user.name (34.862652ms)
✔ user.email (35.274434ms)
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (70.748119ms)
✔ a commit git can't read after the fast-forward is null (59.167263ms)
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (23.690256ms)
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
✔ core.fsmonitor (45.97217ms)
✔ core.hooksPath (46.515621ms)
✔ a hook file (39.841338ms)
✔ include.path (39.688277ms)
✔ includeIf (41.060017ms)
✔ a filter driver (43.863858ms)
✔ origin moved (40.279486ms)
✔ a second origin url (46.014574ms)
✔ the origin url twice, both the root (44.852984ms)
✔ an ext:: origin (43.746661ms)
✔ a branch tracking another remote (40.782323ms)
✔ a branch merging a tag (41.313221ms)
✔ a fetch line onto local branches (39.734197ms)
✔ no origin (47.13466ms)
✔ a config file over the size cap (44.94032ms)
✔ config a symlink to /dev/zero (40.11926ms)
✔ the clone a symlink to the bait (35.988231ms)
✔ the clone a file (37.305001ms)
✔ the clone a plain directory (38.024591ms)
✔ .git a gitdir: file (40.458365ms)
✔ .git a symlink (39.570204ms)
✔ .git/logs a symlink (35.692048ms)
✔ .git/refs/heads a symlink (33.256906ms)
✔ .git/objects a symlink (34.281105ms)
✔ a reflog hard-linked to a file outside (34.49633ms)
✔ HEAD a fifo (31.388304ms)
✔ a commondir file (32.843239ms)
✔ an alternates file (36.465546ms)
✔ a gitlink staged, no .gitmodules (56.037117ms)
✔ a gitlink and .gitmodules staged (54.361984ms)
✔ a gitlink to a repository with its own gitlink (61.271925ms)
✔ a gitlink and .gitmodules committed (56.694202ms)
✔ a gitlink and submodule.active in config (50.804746ms)
✔ a .git/modules with no gitlink (40.017018ms)
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1439.951004ms)
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
✔ missing (14.746425ms)
✔ not a repository (12.240775ms)
✔ a plain directory inside another repository (18.803976ms)
✔ unreadable (12.060169ms)
✔ on no branch (14.246498ms)
✔ missing an object (18.355719ms)
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (91.468955ms)
✔ a clone whose root is on no branch, or gone, is kept and named (40.067794ms)
✔ no credential or forge remote of the root reaches a clone (57.255958ms)
✔ every project in the business file gets its own clone at its own branch (40.233547ms)
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.548254ms)
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1018.575299ms)
✔ a timeout signals git's process group, so a process git started dies with it (516.707264ms)
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (514.031957ms)
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (2.170958ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.213873ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (35.647758ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (2.705074ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (179.273278ms)
✔ runGate: the first failing step stops the gate and names its log (278.122256ms)
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (186.038628ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (658.02138ms)
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.604687ms)
✔ sandboxProblem names a missing bwrap and a bwrap that fails (11.623192ms)
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.6431ms)
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.126229ms)
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.850786ms)
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.464721ms)
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1976.834349ms)
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2860.245503ms)
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (271.852007ms)
✔ resolveSeat: by name under --repo resolves the repo layout (1.647412ms)
✔ resolveSeat: by path resolves the fleet layout (0.411608ms)
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.835922ms)
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.748716ms)
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.950241ms)
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.659253ms)
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.436842ms)
✔ CLI launch: registers, execs the fake launch script, and passes args through (37.869189ms)
✔ CLI launch: --harness lands in the record (35.114285ms)
✔ CLI launch: the launch script's own exit code passes through (32.754743ms)
✔ CLI launch: relaunching a seat rewrites the one registration record (79.66047ms)
✔ CLI launch: omitting --task records an empty string, not null (37.37462ms)
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (104.242365ms)
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (159.438731ms)
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.475664ms)
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.663758ms)
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.831332ms)
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.377097ms)
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (314.780322ms)
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.954208ms)
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (1.042278ms)
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.446557ms)
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (2.203209ms)
✔ session file and launch log: 0600, the session file written once (1.26953ms)
✔ endReason maps the runner's exit codes; a signal is killed (0.141418ms)
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.487903ms)
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (2.974463ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (2.513191ms)
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (2.97558ms)
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (347.954438ms)
✔ workRef and validBranch take only what a ref name can hold (2.221213ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (191.879327ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (161.731648ms)
✔ a branch with no history in common with main refuses unrelated-history (97.090305ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (53.080059ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (251.034199ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (169.986321ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (114.42524ms)
✔ only a v2 bundle with the named branch is read (64.344337ms)
✔ a branch named main, or named for another task, moves only this task's work ref (131.903949ms)
✔ a record that throws moves the work ref back, or removes a new one (186.369556ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (445.77811ms)
✔ a root that can't be read refuses root-unreadable (36.514022ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2204.096095ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1035.037248ms)
✔ a working repository path that isn't a directory refuses (24.020269ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.312266ms)
✔ review of a project with no working repository refuses unknown-commit (13.542644ms)
✔ the runner's git tools hold the host's limits and branch rule (1.265113ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (222.404829ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (148.179974ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (215.931602ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (119.736558ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (400.994292ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (160.480046ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (280.827859ms)
ℹ tests 150
ℹ suites 0
ℹ pass 150
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6932.378723
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env bash
# Row 137 round 2 (Filbert's comment 28782): seat working.test and cli git-socket.test
# on the candidate, each singly, then one kill per new test. A kill edits working.mjs
# in place, runs working.test, which must fail on exactly the new test, and restores
# the file; the script checks the restored file's sha256 against the one it started with.
# Last, the whole seat suite. Not the full gate. Usage: r2-round.sh <worktree> <logdir>
set -uo pipefail
WT=$(cd "$1" && pwd -P); LOGS=$(mkdir -p "$2" && cd "$2" && pwd -P)
export TMPDIR="$HOME/darkwing-scratch/r137/tmp"; mkdir -p "$TMPDIR"
SRC="$WT/packages/seat/src/working.mjs"
SUM=$(sha256sum "$SRC" | cut -d' ' -f1)
restore() {
if [ -f "$SRC.orig" ]; then mv -f "$SRC.orig" "$SRC"; fi
[ "$(sha256sum "$SRC" | cut -d' ' -f1)" = "$SUM" ] || { echo "RESTORE_MISMATCH $SRC"; return 1; }
}
trap restore EXIT
echo "base $(git -C "$WT" rev-parse --short HEAD) working.mjs $SUM start $(date -u +%H:%M:%S)"
run() { # name package-dir test-file
local log="$LOGS/$1.log" start; start=$(date -u +%H:%M:%S)
(cd "$WT/$2" && timeout 600 node --test "tests/$3") > "$log" 2>&1
local rc=$?
echo "$1 rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$log" | tr '\n' ' ')"
return $rc
}
# probe name sed-expression changed-line test-name
probe() {
cp -p "$SRC" "$SRC.orig"
sed -i "$2" "$SRC"
if [ "$(grep -cF -- "$3" "$SRC")" != 1 ]; then echo "STOP $1: the edit didn't apply"; exit 1; fi
echo "$1 edit: $(grep -nF -- "$3" "$SRC" | sed 's/^\([0-9]*\):\s*/line \1: /')"
run "$1" packages/seat working.test.mjs
local rc=$? log="$LOGS/$1.log"
restore || exit 1
if [ $rc -ne 0 ] && grep -q '^ℹ fail 1$' "$log" && grep -qF "✖ $4" "$log"; then
echo "$1 KILLED: only \"$4\" failed"
else
echo "STOP $1: expected exactly that test to fail"; exit 1
fi
}
run seat-working packages/seat working.test.mjs || { echo "STOP seat-working"; exit 1; }
run cli-git-socket packages/cli git-socket.test.mjs || { echo "STOP cli-git-socket"; exit 1; }
probe kill-b1-patch-drift \
's/if (appliedId !== patch_id) refuse("patch-drift"/if (false) refuse("patch-drift"/' \
'if (false) refuse("patch-drift"' \
"a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree"
probe kill-b2-against-root \
's/"merge-base", commit, "refs\/heads\/main"\])).ok) refuse("unrelated-history"/"merge-base", commit, "refs\/heads\/root"])).ok) refuse("unrelated-history"/' \
'"merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history"' \
"once the root shares no history with a landed main, a push is checked against main, not the root"
# The whole seat suite once more, on the restored candidate.
start=$(date -u +%H:%M:%S)
(cd "$WT/packages/seat" && timeout 900 node --test tests/*.test.mjs) > "$LOGS/seat.log" 2>&1
rc=$?
echo "seat rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$LOGS/seat.log" | tr '\n' ' ')"
[ $rc -eq 0 ] || { echo "STOP seat"; exit 1; }
echo "ROUND_PASSED $(date -u +%H:%M:%S)"
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,31 @@
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
b30b6b597f515ba155306132804aec10acb6ca07ec82aafaf9baf93533874b9c packages/bus/README.md
c86afa94c0bc5d941f5af699dadb8439103d16ca52746038036fdd3110c5453a packages/bus/src/broker.mjs
a8a92b4a7d44f85a11f6780d88fdc043ddba203ffca6362b9d0e782dc2e1d07f packages/bus/src/landing.mjs
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
ca08921e227d3c554b3480a97b2e81bf113f5b11033bb385cb6070bbfd5178e4 packages/bus/tests/land.test.mjs
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
512af9a1d48a48f798fa6e3279f9ca8206615e2c3ea55a8772d2b3bbd151eb20 packages/cli/README.md
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
415b54a0ec8f5b022f8b9bde1b2c9cdde6b8c086ac9f0de01544387f3f58ffb2 packages/cli/tests/git-socket.test.mjs
4bc008fd4c3f2dca1e0795884139889ad2d8bb35554bceeb109c7e3129990384 packages/cli/tests/launcher.test.mjs
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
69c5623e5a7fec9e36ca3877ed0edbb56eceb0e7b5ceea8a8559db8224fecf45 packages/harness/README.md
6b877124b42153842c480006ff2f76379e627df44e50e3581d4933553a77f6ca packages/harness/src/bundle.mjs
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
8d930f3ecc67c8d4b37ebede28323d1a9b9954c6297234384b3b1401608de237 packages/harness/tests/bundle.test.mjs
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
@@ -0,0 +1,40 @@
base 63c82f1c4 start 19:43:51
bus-land rc=0 19:43:51-19:43:53 ℹ pass 10 ℹ fail 0 ℹ skipped 0
bus-hard-waits rc=0 19:43:53-19:43:55 ℹ pass 12 ℹ fail 0 ℹ skipped 0
bus-project-runtime rc=0 19:43:55-19:43:55 ℹ pass 3 ℹ fail 0 ℹ skipped 0
seat-landing rc=0 19:43:55-19:43:56 ℹ pass 8 ℹ fail 0 ℹ skipped 0
seat-working rc=0 19:43:56-19:44:03 ℹ pass 26 ℹ fail 0 ℹ skipped 0
harness-bundle rc=0 19:44:03-19:44:03 ℹ pass 22 ℹ fail 0 ℹ skipped 0
harness-git-tools rc=0 19:44:03-19:44:05 ℹ pass 5 ℹ fail 0 ℹ skipped 0
harness-tools rc=0 19:44:05-19:44:05 ℹ pass 19 ℹ fail 0 ℹ skipped 0
cli-git-socket rc=0 19:44:05-19:44:14 ℹ pass 23 ℹ fail 0 ℹ skipped 0
cli-launcher rc=0 19:44:14-19:44:29 ℹ pass 19 ℹ fail 0 ℹ skipped 0
cli-thread-launch rc=0 19:44:29-19:44:43 ℹ pass 8 ℹ fail 0 ℹ skipped 0
test-land-work rc=0 19:44:43-19:44:56 land-work selftests: 86 passed, 0 failed
kill-b1-patch-drift edit: packages/seat/src/working.mjs line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
kill-b1-patch-drift rc=1 19:44:56-19:45:02 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b1-patch-drift KILLED: "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed, 1 failing
kill-b2-against-root edit: packages/seat/src/working.mjs line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
kill-b2-against-root rc=1 19:45:02-19:45:08 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b2-against-root KILLED: "once the root shares no history with a landed main, a push is checked against main, not the root" failed, 1 failing
kill-a-gated-refusal edit: packages/bus/src/broker.mjs line 815: if (false) fail('not-authorized');
kill-a-gated-refusal rc=1 19:45:08-19:45:10 ℹ pass 9 ℹ fail 1 ℹ skipped 0
kill-a-gated-refusal KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
kill-b-arbiter-path edit: packages/bus/src/landing.mjs line 112: const arbitrated = false && d.class === 'cross-role' && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
kill-b-arbiter-path rc=1 19:45:10-19:45:11 ℹ pass 4 ℹ fail 6 ℹ skipped 0
kill-b-arbiter-path KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 6 failing
kill-5-cross-role-only edit: packages/bus/src/landing.mjs line 112: const arbitrated = arbiter && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
kill-5-cross-role-only rc=1 19:45:11-19:45:13 ℹ pass 9 ℹ fail 1 ℹ skipped 0
kill-5-cross-role-only KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
kill-arbiter-default edit: packages/bus/src/landing.mjs line 91: export function readLanding(q, business, id, { into, arbiter = true }) {
kill-arbiter-default rc=1 19:45:13-19:45:14 ℹ pass 9 ℹ fail 1 ℹ skipped 0
kill-arbiter-default KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 1 failing
kill-held-cross-role edit: packages/bus/src/broker.mjs line 924: if (this.#raisedThread(d) !== record.thread) continue;
kill-held-cross-role rc=1 19:45:14-19:45:16 ℹ pass 8 ℹ fail 2 ℹ skipped 0
kill-held-cross-role KILLED: "landHeld is true only for an approved, unspent cross-role merge decision" failed, 2 failing
bus rc=0 19:45:16-19:45:29 ℹ pass 316 ℹ fail 0 ℹ skipped 0
seat rc=0 19:45:29-19:45:35 ℹ pass 150 ℹ fail 0 ℹ skipped 0
ROUND_PASSED 19:45:35
exit 0
[exited with code 0]
@@ -0,0 +1,20 @@
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.022259ms)
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (44.855655ms)
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (483.89615ms)
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (267.989072ms)
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (121.421164ms)
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (153.267449ms)
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (156.899778ms)
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (108.355383ms)
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (122.689901ms)
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (109.224015ms)
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (113.770006ms)
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (151.15857ms)
ℹ tests 12
ℹ suites 0
ℹ pass 12
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1890.281641
@@ -0,0 +1,18 @@
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (127.395725ms)
✔ checkLand refuses on the decision and the review (146.460503ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (239.622452ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (119.431748ms)
✔ a merge option with no first line refuses no-subject, as land-work does (106.922383ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (272.465401ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (118.404041ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (126.517924ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (131.116898ms)
✔ no run may write the action.allowed for git.merge.protected itself (80.804258ms)
ℹ tests 10
ℹ suites 0
ℹ pass 10
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1523.81645
@@ -0,0 +1,11 @@
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.240583ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (93.10966ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (114.154017ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 284.331313
@@ -0,0 +1,324 @@
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (171.928445ms)
✔ agents: working counts what the holder received and has not read; routed alone is not working (302.476332ms)
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (438.137379ms)
✔ agents: working wins over waiting, and Input needed still shows (248.737384ms)
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (272.820064ms)
✔ agents: state reads only its own business, even for a run name both use (227.210627ms)
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (255.584006ms)
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (255.826375ms)
✔ agents: stranded is oldest first and capped at 50 for a role (995.41125ms)
✔ agents: stranded is per role and per business (410.64899ms)
✔ agents: a message routed to a held role and not yet received is not stranded (145.87404ms)
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (390.232108ms)
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (257.046041ms)
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (359.792425ms)
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (330.431747ms)
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (309.244921ms)
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (400.671381ms)
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (207.165488ms)
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (364.356707ms)
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (364.049408ms)
✔ launch events require a human CLI capability; generic emit cannot forge authority events (255.229576ms)
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (247.489352ms)
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (308.869757ms)
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (207.707781ms)
✔ task action subjects and linked decision trail are complete and ordered (245.922601ms)
✔ launch binding is durable and reconnecting requires the identical trusted record (141.861486ms)
✔ business isolation includes inherited object names and cross-business message references (226.881695ms)
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (324.696176ms)
✔ task projection uses schema current view, skipping earlier and equal-start polls (186.101398ms)
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (262.420433ms)
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (176.837718ms)
✔ both arbiters require human resolution when their cross-role route is themselves (284.315564ms)
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (206.822574ms)
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (1.841406ms)
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (322.692982ms)
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (465.648404ms)
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (324.43572ms)
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (311.265858ms)
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (298.64493ms)
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (365.431861ms)
✔ REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant gets past the protection (319.506328ms)
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (248.628012ms)
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (367.020648ms)
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (366.656538ms)
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (450.961059ms)
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (630.992811ms)
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1112.432875ms)
✔ comment cursors isolate businesses, move only forward and remain append-only (172.164354ms)
✔ only trusted sync writes validated cursors; events and cursor share rollback (175.857198ms)
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (1170.350851ms)
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1788.636838ms)
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (961.452395ms)
✔ migration refuses mismatched source metadata without changing schema or evidence (951.681589ms)
✔ offline command migrates only the supplied fixture root and reports usage errors (1059.031001ms)
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (161.465835ms)
✔ credentials refuses a role session and any argument (254.52564ms)
✔ credentials reads the status on each request, and a broker without one lists none (313.696752ms)
✔ the broker process answers credentials without a token, path or variable in its output, log or store (277.024036ms)
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.645249ms)
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (3.939576ms)
✔ expiry refuses use and env references never become client data (0.87009ms)
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.839741ms)
✔ opaque tokens shorter than 16 characters refuse before use (0.41739ms)
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (1.614415ms)
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (663.681958ms)
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (626.209842ms)
✔ chief-executive-officer: another C-suite role isn't on the lists either (470.234317ms)
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (575.011533ms)
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (491.511477ms)
✔ chief-financial-officer: another C-suite role isn't on the lists either (468.81539ms)
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (557.904775ms)
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (554.743394ms)
✔ chief-information-officer: another C-suite role isn't on the lists either (490.657953ms)
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (590.101599ms)
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (581.947481ms)
✔ chief-information-security-officer: another C-suite role isn't on the lists either (460.43192ms)
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (496.149988ms)
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (433.610485ms)
✔ chief-marketing-officer: another C-suite role isn't on the lists either (378.495278ms)
✔ a human resolve sends the raising role one message from the human, and its request is the answer (296.92264ms)
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (348.609279ms)
✔ a human withdraw sends one message with the note (325.336653ms)
✔ a human seen before the close leaves the request on the close's answer, not the seen (394.390744ms)
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (331.859125ms)
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (327.357146ms)
✔ a raising role nobody holds at the close gets the message on the next claim (319.111822ms)
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (273.425886ms)
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (406.213889ms)
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (402.215664ms)
✔ a route the raiser hears from is allowed, checked from the route to the raiser (479.598822ms)
✔ a refused supersede withdraws nothing (355.575292ms)
✔ the assistant's within-role and gated raises still work (346.636797ms)
✔ roles lists open decisions routed to a role, and never the human inbox (282.86945ms)
✔ recent lists closed decisions of every route, newest close first, with how each closed (406.060459ms)
✔ recent gives the closing event as closed when the decision was seen first (407.072351ms)
✔ recent stops at RECENT rows (991.855104ms)
✔ every row is what trail already gives the same session for that id (308.147866ms)
✔ a role session can't list decisions, so it can't read another role's open decisions (436.298637ms)
✔ decisions is a read: one business, strict arguments, nothing written (466.563579ms)
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (176.536093ms)
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (186.229095ms)
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (217.584643ms)
✔ endLaunch leaves a claim another run took alone (250.856166ms)
✔ refuse records action.refused against the caller with the code only (177.399362ms)
✔ launches off refuses role.launch with launch-revoked until launches on (259.44956ms)
✔ broker process: launch ops authorize role.launch, record refusals and end runs (388.042926ms)
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.23688ms)
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (127.722422ms)
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (877.904146ms)
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (526.207831ms)
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (283.268578ms)
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (346.582856ms)
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (305.828921ms)
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (258.084421ms)
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (256.677097ms)
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (261.108474ms)
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (284.066626ms)
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (324.028335ms)
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.48898ms)
✔ process reader gets own kernel identity without exposing environment values (0.43473ms)
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.581143ms)
✔ real pid 1 remains inspectable when its environment is protected (0.221499ms)
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (407.135363ms)
✔ checkLand refuses on the decision and the review (464.802601ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (684.560394ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (339.814739ms)
✔ a merge option with no first line refuses no-subject, as land-work does (330.980011ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (725.152073ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (332.627849ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (341.82618ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (353.28469ms)
✔ no run may write the action.allowed for git.merge.protected itself (240.687032ms)
✔ a message to a stopped role sends launch.by one notice, and the result says so (303.909ms)
✔ a message to a role outside launch.instances says so in its result and in the notice (243.669634ms)
✔ a message to a running role sends no notice and its result is unchanged (197.924896ms)
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (361.977155ms)
✔ a run launched but not yet claimed counts as no holder (182.013799ms)
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (325.159482ms)
✔ a business with no launch block tells nobody and says there is no launcher (151.470069ms)
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (414.526933ms)
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (290.864634ms)
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (356.209209ms)
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (547.570861ms)
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (276.812584ms)
✔ missing and foreign-business citations refuse and roll back message and grant (224.459833ms)
✔ cross-role sends still need a matching resolved decision and consume it once (295.475046ms)
✔ messages pages all human messages newest first without writes; read state is history (3006.229017ms)
✔ messages refuses role callers, invalid paging and cursors outside this human feed (341.344472ms)
✔ views messages passes only its paging arguments through (0.290829ms)
✔ messages isolates businesses even with a valid foreign cursor (208.447006ms)
✔ the assistant sends to the user and to the chief of staff only (375.782493ms)
✔ an assistant send to any other role, or to the tester, is refused and logged (418.528438ms)
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (416.417269ms)
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (352.270663ms)
✔ a sender-side list alone refuses a send to a role that has no list (387.715939ms)
✔ a target-side list alone refuses a send from a role that has no list (407.476588ms)
✔ the sender list is checked before the target list (368.7465ms)
✔ roles without the field behave exactly as before (539.770059ms)
✔ a business with no role definitions at all is unlimited (403.637602ms)
✔ a malformed messaging field refuses at boot (139.125209ms)
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (446.969194ms)
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (477.170094ms)
✔ review requests and verdicts between roles without the field are unchanged (362.044146ms)
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (250.306052ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (537.317949ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (501.670825ms)
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (235.456325ms)
✔ startup token refusal returns safe code without value or partial listening broker (67.70906ms)
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (215.1427ms)
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (241.664372ms)
✔ trusted host registers later launches; socket clients never have a registration verb (238.144625ms)
✔ runtime excludes declared project roots even when host supplies no repoRoots (65.684451ms)
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (205.248481ms)
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (196.578125ms)
✔ D2: spec.read refuses without content if its role is released during the read (170.553201ms)
✔ D3: spec.read secret check refuses flagged content without content (148.66085ms)
✔ D3: spec.read secret check refuses flagged subject without content (163.121269ms)
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.291845ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (220.351179ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (227.905845ms)
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (271.761333ms)
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (233.615431ms)
✔ a message with no reply gives an empty list (189.406387ms)
✔ replies come oldest first and stop at REPLIES (892.36566ms)
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (358.546831ms)
✔ strict arguments; a role session gets human-required (458.87671ms)
✔ views passes replies through as one call with the id (0.243115ms)
✔ requirements returns the committed list to a holding role session, and no one else (235.003514ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (177.342663ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (216.333371ms)
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (277.986175ms)
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (299.301571ms)
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (336.08262ms)
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (450.596551ms)
✔ reviewFetch answers only the addressed reviewer, for the request it cites (302.801602ms)
✔ review.verdict answers one request once, to the role that asked (383.174253ms)
✔ task.close on a pushed task needs an approve verdict for the latest push (436.21033ms)
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (320.203296ms)
✔ v3b prototype refusals, views and append-only mutations (1780.765467ms)
✔ gated approval authorizes once, survives store reopen, and fresh approval works (296.131129ms)
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (256.650091ms)
✔ two scheduled callers have exactly one grant and one consumed refusal (197.11119ms)
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (388.021803ms)
✔ class drift gated to cross-role refuses before consumption (282.00587ms)
✔ class drift cross-role to gated refuses before consumption (312.09861ms)
✔ class drift gated to within-role refuses before consumption (290.902243ms)
✔ class drift cross-role to within-role refuses before consumption (321.619306ms)
✔ class drift within-role to gated refuses before consumption (273.944447ms)
✔ class drift within-role to cross-role refuses before consumption (303.911252ms)
✔ message.send consumes approval and prevents a later send or authorize (247.967274ms)
✔ role.revoke consumes approval and prevents a later revoke or authorize (303.960696ms)
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1648.610821ms)
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (308.912818ms)
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (226.333763ms)
✔ two real socket writes to one repository yield one commit and one project-busy refusal (232.44763ms)
✔ client disconnect during await tolerates late reply (201.977466ms)
✔ client disconnect during await tolerates late refusal (212.181097ms)
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (403.323234ms)
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (360.373444ms)
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (357.644268ms)
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (273.118853ms)
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (297.447776ms)
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (291.858813ms)
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (371.819934ms)
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (211.701485ms)
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (514.848751ms)
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (508.51339ms)
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (502.566718ms)
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (249.154504ms)
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (649.144478ms)
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (433.134447ms)
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (228.536738ms)
✔ a business that never switched launches reads allowed with no time and no event (143.589144ms)
✔ launches revoked and then restored read allowed, with the restore time and event id (189.879713ms)
✔ a task closed on the tracker leaves the open list, and total counts the open ones (175.67893ms)
✔ a tombstone is not open (176.802855ms)
✔ the open list stops at the cap and says so; total still counts every open task (185.483883ms)
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (184.371176ms)
✔ a human session reads the same state, with the same cap (165.490487ms)
✔ reading state writes nothing: every table keeps its row count (202.131666ms)
✔ creates private WAL store and excludes a second writer until explicit close (171.892204ms)
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (196.258983ms)
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (238.82219ms)
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (220.157937ms)
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (130.594407ms)
✔ async transactions refuse before invoking their function (135.618308ms)
✔ the session default fits under the reply cap and pages to the end with next (339.900097ms)
✔ the short form: no description, assignees by role, every listed key (279.651369ms)
✔ each filter, alone and together, and total counts every match (374.236856ms)
✔ task_ref reads one task in full, as the whole board has it (347.912138ms)
✔ no arguments is the read the Console and mosaic make, unchanged (270.76151ms)
✔ an unknown argument or a bad value refuses invalid-request (920.184935ms)
✔ tasks rows carry priority and requirement for every session that reads tasks (389.41788ms)
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (409.601921ms)
✔ an empty business and one with snapshots but no task.created read cleanly (137.858422ms)
✔ recordTask keeps sync reads and a role write apart (214.871678ms)
✔ read_at must be one canonical UTC format, so the projection compares strings safely (147.160724ms)
✔ a bad entry refuses the whole record (125.426606ms)
✔ taskView reads the projection for one business (169.828099ms)
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (336.242075ms)
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (448.042766ms)
✔ without an adapter the server refuses every task verb (246.906752ms)
✔ the runtime refuses an invalid adapter and closes a valid one (217.540769ms)
✔ the process loads the S3 adapter from plain-data trackers (345.88603ms)
✔ the tester binds only when the business sets bus.tester to exactly true (987.764193ms)
✔ a business may not name a role tester, so the tester address is never a role (297.837078ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (601.106074ms)
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (227.593082ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (255.094013ms)
✔ the tester reads the human views a reader reads (181.145046ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.170037ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.333917ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.216009ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (119.749415ms)
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (889.858434ms)
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1237.92929ms)
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (872.122649ms)
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (814.390502ms)
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (414.287516ms)
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1357.225901ms)
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (345.409348ms)
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3554.065349ms)
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (101.615362ms)
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (142.784589ms)
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (163.110116ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (182.947777ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (159.177897ms)
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (144.15201ms)
✔ REQ-USER-2: the human verbs refuse another owner's thread (154.850034ms)
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.583824ms)
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (190.644219ms)
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (457.229662ms)
✔ socket capability stamps launch identity; shared views use wire, no SQL client (178.171213ms)
✔ two wire claims serialize; a lost reply never automatically retries (234.869893ms)
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (129.442319ms)
✔ client preserves UTF-8 when a response divides a multibyte character (11.716952ms)
✔ committed mutation followed by dropped reply reports unknown and is never retried (202.36388ms)
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (193.189832ms)
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (179.861372ms)
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (277.346307ms)
✔ a broker with no web service refuses a granted role (182.741544ms)
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (218.877595ms)
✔ a session that is not the role holder is refused (145.553234ms)
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (396.353628ms)
✔ web.search with no search source configured is a refused result, not an error (161.146943ms)
✔ a search source that fails with its own refusal, or that throws, is handled (173.317477ms)
✔ a slow search source ends in a refusal at the deadline (207.576222ms)
✔ a secret in the arguments is refused before anything is trailed or fetched (143.776175ms)
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (239.93454ms)
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.263194ms)
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (183.586421ms)
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (160.594315ms)
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (467.653895ms)
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (176.480697ms)
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (196.819445ms)
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (161.17917ms)
ℹ tests 316
ℹ suites 0
ℹ pass 316
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 12815.533014
@@ -0,0 +1,31 @@
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (551.251665ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (528.579604ms)
✔ the size cap refuses a push before any byte (269.30183ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (452.58736ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (267.739357ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (396.051646ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (306.811539ms)
✔ a review of a project the business no longer has refuses unknown-project (302.870279ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (211.64561ms)
✔ close() answers host-closing to a connection still sending its request line (216.241139ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (648.364247ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (538.709921ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (575.18493ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.410207ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (535.518462ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.233662ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (300.727339ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (444.928604ms)
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (366.039215ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (410.934589ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (452.404951ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (369.150802ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (351.538449ms)
ℹ tests 23
ℹ suites 0
ℹ pass 23
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8639.362185
@@ -0,0 +1,27 @@
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1206.200713ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (437.519741ms)
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (871.328835ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3585.555977ms)
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (359.545401ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (138.892363ms)
✔ a runner that stops at once ends its launch with the runner's reason (211.615468ms)
✔ a Claude Code launch with no session credential refuses before it starts (112.353104ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (197.462465ms)
✔ a runner killed from the host ends its launch as killed, not failed (263.269273ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (120.866648ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1015.241638ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (674.148094ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3642.220555ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (113.285047ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (120.130438ms)
✔ a launch client that never closes its side doesn't hold the host's close (121.813745ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1232.17579ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.531215ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14515.480258
@@ -0,0 +1,16 @@
✔ 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 (5246.82668ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1486.268898ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4312.216573ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2651.316649ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (53.207589ms)
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (144.473872ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (177.300702ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (47.009699ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14207.208132
@@ -0,0 +1,30 @@
✔ sessionModel: agent vars win, then the system's execution settings (7.854925ms)
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.029381ms)
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.774208ms)
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.975372ms)
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.11884ms)
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.346022ms)
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.155196ms)
✔ the prompt names the project clones in the workspace, and none when there are none (4.197445ms)
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.261762ms)
✔ the prompt explains landing to a role with land_work, and to no other (2.560705ms)
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (4.846701ms)
✔ a bundle is written once: an existing file refuses (0.909896ms)
✔ a path with a single quote can't go into the hook command (1.019942ms)
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (1.352449ms)
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.205918ms)
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.177993ms)
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.097005ms)
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.137309ms)
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (2.986828ms)
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.291657ms)
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (4.350039ms)
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.248896ms)
ℹ tests 22
ℹ suites 0
ℹ pass 22
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 128.748577
@@ -0,0 +1,13 @@
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (156.1405ms)
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (115.093375ms)
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1809.272779ms)
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.833301ms)
✔ land_work sends one land line and resolves the host's started answer (3.393511ms)
ℹ tests 5
ℹ suites 0
ℹ pass 5
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2450.637148
@@ -0,0 +1,27 @@
✔ the PM gets its task verbs and the reads, and no launch (7.262191ms)
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.666322ms)
✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (8.79721ms)
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.590752ms)
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.095285ms)
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.35237ms)
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (1.141343ms)
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.851001ms)
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.869919ms)
✔ a coder with a tracker gets its own task tools and no task_reassign (0.964246ms)
✔ launch only when the business's launch block names the instance as launcher (1.743816ms)
✔ an action outside the instance's authority has no tool (0.980557ms)
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.087357ms)
✔ land_work is there only with land, after push_working, with the task and the decision (2.331761ms)
✔ callTool: one JSON line out, the result back, a refusal rejects (8.506717ms)
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.384691ms)
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.371751ms)
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.622881ms)
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.417013ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 133.755195
@@ -0,0 +1,34 @@
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (120.80608ms)
✔ checkLand refuses on the decision and the review (147.424537ms)
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (134.777989ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (119.129379ms)
✔ a merge option with no first line refuses no-subject, as land-work does (110.964726ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (273.613354ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (122.300434ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (127.5339ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (130.596847ms)
✔ no run may write the action.allowed for git.merge.protected itself (81.903168ms)
ℹ tests 10
ℹ suites 0
ℹ pass 9
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1424.902514
✖ failing tests:
test at tests/land.test.mjs:178:1
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (134.777989ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:190:10)
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: undefined,
expected: { reason: 'not-human' },
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,48 @@
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (142.605734ms)
✔ checkLand refuses on the decision and the review (146.696348ms)
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (142.943011ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (111.950354ms)
✔ a merge option with no first line refuses no-subject, as land-work does (110.027874ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (271.711264ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (121.489725ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (126.571426ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (129.967256ms)
✔ no run may write the action.allowed for git.merge.protected itself (79.001039ms)
ℹ tests 10
ℹ suites 0
ℹ pass 9
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1453.690671
✖ failing tests:
test at tests/land.test.mjs:178:1
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (142.943011ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /not-authorized/. Input:
'Error: not-human'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:10)
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) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:32
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5),
expected: /not-authorized/,
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,36 @@
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (118.546734ms)
✔ checkLand refuses on the decision and the review (159.767448ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (246.094953ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (121.392831ms)
✔ a merge option with no first line refuses no-subject, as land-work does (112.411767ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (274.137409ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (124.673661ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (133.96026ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (137.979957ms)
✔ no run may write the action.allowed for git.merge.protected itself (83.382547ms)
ℹ tests 10
ℹ suites 0
ℹ pass 9
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1568.000852
✖ failing tests:
test at tests/land.test.mjs:90:1
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (118.546734ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:96:10)
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)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { reason: 'not-human' },
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,161 @@
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (115.323299ms)
✖ checkLand refuses on the decision and the review (124.688192ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (235.863051ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (120.082292ms)
✖ a merge option with no first line refuses no-subject, as land-work does (100.925418ms)
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (102.907846ms)
✖ a ticket outlives the run that asked, and recordLand checks the task again (101.693903ms)
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (105.374223ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (125.360746ms)
✔ no run may write the action.allowed for git.merge.protected itself (75.139067ms)
ℹ tests 10
ℹ suites 0
ℹ pass 4
ℹ fail 6
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1271.9205
✖ failing tests:
test at tests/land.test.mjs:90:1
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (115.323299ms)
Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:97:15)
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) {
code: 'not-human'
}
test at tests/land.test.mjs:144:1
✖ checkLand refuses on the decision and the review (124.688192ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-verdict/. Input:
'Error: not-human'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:23
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:10),
expected: /no-verdict/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:217:1
✖ a merge option with no first line refuses no-subject, as land-work does (100.925418ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-subject/. Input:
'Error: not-human'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:25
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:10),
expected: /no-subject/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:236:1
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (102.907846ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /work-ref/. Input:
'Error: not-human'
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:246:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:238:32
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:246:10),
expected: /work-ref/,
operator: 'throws',
diff: 'simple'
}
test at tests/land.test.mjs:269:1
✖ a ticket outlives the run that asked, and recordLand checks the task again (101.693903ms)
Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:272:24)
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) {
code: 'not-human'
}
test at tests/land.test.mjs:286:1
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (105.374223ms)
Error: not-human
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:289:19)
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) {
code: 'not-human'
}
@@ -0,0 +1,50 @@
✔ workRef and validBranch take only what a ref name can hold (1.025278ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (141.052883ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (117.954527ms)
✔ a branch with no history in common with main refuses unrelated-history (62.670621ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (41.774755ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (126.833196ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (81.885998ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (79.791027ms)
✔ only a v2 bundle with the named branch is read (51.055726ms)
✔ a branch named main, or named for another task, moves only this task's work ref (92.897923ms)
✔ a record that throws moves the work ref back, or removes a new one (137.057372ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (394.35892ms)
✔ a root that can't be read refuses root-unreadable (35.606434ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2182.142372ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.284625ms)
✔ a working repository path that isn't a directory refuses (31.144948ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (127.085506ms)
✔ review of a project with no working repository refuses unknown-commit (12.970621ms)
✔ the runner's git tools hold the host's limits and branch rule (1.163523ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (214.433459ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (144.787362ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (356.12664ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (119.329738ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (369.951973ms)
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (110.749918ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (233.737943ms)
ℹ tests 26
ℹ suites 0
ℹ pass 25
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6344.143424
✖ failing tests:
test at tests/working.test.mjs:531:1
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (110.749918ms)
AssertionError [ERR_ASSERTION]: Missing expected rejection.
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/tests/working.test.mjs:544:3)
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: undefined,
operator: 'rejects',
diff: 'simple'
}
@@ -0,0 +1,45 @@
✔ workRef and validBranch take only what a ref name can hold (1.140781ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (133.394699ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (115.512679ms)
✔ a branch with no history in common with main refuses unrelated-history (61.952765ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (40.274776ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (125.962434ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (87.852579ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (78.523472ms)
✔ only a v2 bundle with the named branch is read (50.654154ms)
✔ a branch named main, or named for another task, moves only this task's work ref (91.88841ms)
✔ a record that throws moves the work ref back, or removes a new one (134.840919ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (416.263815ms)
✔ a root that can't be read refuses root-unreadable (35.703221ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2171.659005ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.235732ms)
✔ a working repository path that isn't a directory refuses (30.781986ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (124.222944ms)
✔ review of a project with no working repository refuses unknown-commit (13.63881ms)
✔ the runner's git tools hold the host's limits and branch rule (1.264832ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (238.777549ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (172.773927ms)
✖ once the root shares no history with a landed main, a push is checked against main, not the root (169.471647ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (133.50926ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (402.001833ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (149.282325ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (246.573137ms)
ℹ tests 26
ℹ suites 0
ℹ pass 25
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6311.39345
✖ failing tests:
test at tests/working.test.mjs:454:1
✖ once the root shares no history with a landed main, a push is checked against main, not the root (169.471647ms)
Error: the commit shares no history with main
at refuse (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/src/working.mjs:88:9)
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/src/working.mjs:224:76
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
code: 'unrelated-history'
}
@@ -0,0 +1,60 @@
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (130.956476ms)
✔ checkLand refuses on the decision and the review (164.466337ms)
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (133.836036ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (128.181922ms)
✔ a merge option with no first line refuses no-subject, as land-work does (118.866105ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (299.698592ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (138.207625ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (135.09024ms)
✖ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (128.680107ms)
✔ no run may write the action.allowed for git.merge.protected itself (89.072919ms)
ℹ tests 10
ℹ suites 0
ℹ pass 8
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1523.479432
✖ failing tests:
test at tests/land.test.mjs:178:1
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (133.836036ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:191:10)
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) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
test at tests/land.test.mjs:314:1
✖ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (128.680107ms)
AssertionError [ERR_ASSERTION]: gated
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:327:10)
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)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,16 @@
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.364571ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.158392ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.959689ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.279505ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (143.107369ms)
✔ runGate: the first failing step stops the gate and names its log (213.065877ms)
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (144.374376ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (525.908042ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1101.275227
@@ -0,0 +1,34 @@
✔ workRef and validBranch take only what a ref name can hold (1.121354ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (132.185308ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (117.277679ms)
✔ a branch with no history in common with main refuses unrelated-history (90.784958ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (109.246449ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (137.822707ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (85.989085ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (82.155384ms)
✔ only a v2 bundle with the named branch is read (50.875648ms)
✔ a branch named main, or named for another task, moves only this task's work ref (94.942265ms)
✔ a record that throws moves the work ref back, or removes a new one (154.859904ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (368.791806ms)
✔ a root that can't be read refuses root-unreadable (30.1109ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2176.625106ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.292378ms)
✔ a working repository path that isn't a directory refuses (23.870723ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (125.128692ms)
✔ review of a project with no working repository refuses unknown-commit (13.53362ms)
✔ the runner's git tools hold the host's limits and branch rule (1.202824ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (219.874528ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (151.703528ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (210.71631ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.994858ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (361.510945ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (139.182786ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (236.978251ms)
ℹ tests 26
ℹ suites 0
ℹ pass 26
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6313.92304
@@ -0,0 +1,163 @@
✔ a first launch clones the root at its branch, with the root's path as origin (38.396027ms)
✔ the clone is not at its place until git clone has finished (31.966362ms)
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (79.034332ms)
✔ a clone ahead of the root keeps its commits and counts as current (52.745395ms)
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
✔ a modified file (59.276598ms)
✔ an untracked file (53.696794ms)
✔ a staged file (47.526912ms)
✔ another branch (54.629158ms)
✔ a detached HEAD (51.478948ms)
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (267.898375ms)
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (47.390555ms)
▶ a clone kept before the branch check, or for a failed status, gets no fetch
✔ not-a-clone (30.082175ms)
✔ hooks-present (30.112196ms)
✔ submodule (35.713041ms)
✔ config-changed (31.99445ms)
✔ root-unreadable (40.761536ms)
✔ root-detached (39.983584ms)
✔ status-failed, on the root's branch and clean (44.43347ms)
✔ status-failed, dirty (40.952778ms)
✔ a clone kept before the branch check, or for a failed status, gets no fetch (295.422509ms)
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (40.556496ms)
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (47.829236ms)
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (75.57472ms)
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
✔ user.name (26.584885ms)
✔ user.email (30.180988ms)
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (57.257909ms)
✔ a commit git can't read after the fast-forward is null (54.919116ms)
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (22.56489ms)
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
✔ core.fsmonitor (34.588591ms)
✔ core.hooksPath (37.390685ms)
✔ a hook file (36.690374ms)
✔ include.path (39.415405ms)
✔ includeIf (35.284633ms)
✔ a filter driver (32.628642ms)
✔ origin moved (34.334316ms)
✔ a second origin url (35.14025ms)
✔ the origin url twice, both the root (38.740824ms)
✔ an ext:: origin (35.027173ms)
✔ a branch tracking another remote (33.436749ms)
✔ a branch merging a tag (33.768148ms)
✔ a fetch line onto local branches (35.295265ms)
✔ no origin (34.914304ms)
✔ a config file over the size cap (33.307638ms)
✔ config a symlink to /dev/zero (31.150995ms)
✔ the clone a symlink to the bait (33.849472ms)
✔ the clone a file (31.446481ms)
✔ the clone a plain directory (32.720717ms)
✔ .git a gitdir: file (32.905961ms)
✔ .git a symlink (30.437268ms)
✔ .git/logs a symlink (30.400786ms)
✔ .git/refs/heads a symlink (32.707297ms)
✔ .git/objects a symlink (167.668586ms)
✔ a reflog hard-linked to a file outside (33.386686ms)
✔ HEAD a fifo (36.008917ms)
✔ a commondir file (36.0624ms)
✔ an alternates file (34.548355ms)
✔ a gitlink staged, no .gitmodules (45.172275ms)
✔ a gitlink and .gitmodules staged (48.916053ms)
✔ a gitlink to a repository with its own gitlink (56.995656ms)
✔ a gitlink and .gitmodules committed (52.030078ms)
✔ a gitlink and submodule.active in config (55.916219ms)
✔ a .git/modules with no gitlink (34.345046ms)
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1391.100862ms)
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
✔ missing (10.226307ms)
✔ not a repository (9.80267ms)
✔ a plain directory inside another repository (15.114648ms)
✔ unreadable (10.465119ms)
✔ on no branch (12.622618ms)
✔ missing an object (17.314534ms)
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (76.413679ms)
✔ a clone whose root is on no branch, or gone, is kept and named (30.190409ms)
✔ no credential or forge remote of the root reaches a clone (52.301224ms)
✔ every project in the business file gets its own clone at its own branch (39.80658ms)
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (512.592934ms)
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.549717ms)
✔ a timeout signals git's process group, so a process git started dies with it (514.290656ms)
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (516.154103ms)
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (0.968349ms)
✔ gateEnv keeps the named variables that are strings and drops everything else (0.180544ms)
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.746269ms)
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.425099ms)
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (180.387107ms)
✔ runGate: the first failing step stops the gate and names its log (259.361384ms)
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (166.060336ms)
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (563.988603ms)
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.414975ms)
✔ sandboxProblem names a missing bwrap and a bwrap that fails (12.058482ms)
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.479411ms)
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.633668ms)
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.742467ms)
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.207269ms)
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1838.37211ms)
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2642.418644ms)
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (304.226263ms)
✔ resolveSeat: by name under --repo resolves the repo layout (1.260678ms)
✔ resolveSeat: by path resolves the fleet layout (0.328242ms)
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.719367ms)
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.666302ms)
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.843026ms)
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.508627ms)
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.201711ms)
✔ CLI launch: registers, execs the fake launch script, and passes args through (28.747273ms)
✔ CLI launch: --harness lands in the record (29.069945ms)
✔ CLI launch: the launch script's own exit code passes through (30.696396ms)
✔ CLI launch: relaunching a seat rewrites the one registration record (70.446282ms)
✔ CLI launch: omitting --task records an empty string, not null (36.139265ms)
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (102.814407ms)
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (142.167777ms)
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.439242ms)
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.571408ms)
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.720868ms)
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.880235ms)
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (290.929114ms)
✔ REQ-LIMIT-1: family substring matching is no longer exported (1.039464ms)
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.716378ms)
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.262949ms)
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.901509ms)
✔ session file and launch log: 0600, the session file written once (1.484993ms)
✔ endReason maps the runner's exit codes; a signal is killed (0.196679ms)
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.783502ms)
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.256027ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.526874ms)
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.054953ms)
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (362.279094ms)
✔ workRef and validBranch take only what a ref name can hold (1.171391ms)
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (193.505593ms)
✔ a rewritten branch refuses non-fast-forward and the work ref stays (175.037048ms)
✔ a branch with no history in common with main refuses unrelated-history (89.200338ms)
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (45.214098ms)
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (173.211953ms)
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (97.47318ms)
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (85.980843ms)
✔ only a v2 bundle with the named branch is read (55.072636ms)
✔ a branch named main, or named for another task, moves only this task's work ref (101.123869ms)
✔ a record that throws moves the work ref back, or removes a new one (160.480709ms)
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (430.013707ms)
✔ a root that can't be read refuses root-unreadable (29.860331ms)
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2189.967591ms)
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.520349ms)
✔ a working repository path that isn't a directory refuses (23.627636ms)
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.838135ms)
✔ review of a project with no working repository refuses unknown-commit (12.898766ms)
✔ the runner's git tools hold the host's limits and branch rule (1.19075ms)
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (224.098858ms)
✔ after a landing, a push built on the root still lands and main stays where the landing put it (149.212448ms)
✔ once the root shares no history with a landed main, a push is checked against main, not the root (213.155109ms)
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.653034ms)
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (362.043326ms)
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (136.476845ms)
✔ finish refuses base-moved when main moved, and a record that throws moves main back (240.955404ms)
ℹ tests 150
ℹ suites 0
ℹ pass 150
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6525.218086
@@ -0,0 +1,88 @@
OK args: exit 2, target-branch
OK args: exit 2, target-branch
OK args: exit 4
OK args: exit 4
OK args: exit 4
OK --base next refuses before the config is read (got 2)
OK a missing system config exits 3 (got 3)
OK nobus: exit 3
OK schema-table: exit 2, bus-schema
OK schema-meta: exit 2, bus-schema
OK openBus opens the database read-only
OK other-business: exit 2, decision-not-found
OK no-raise: exit 2, decision-not-found
OK not-a-merge: exit 2, not-a-merge
OK open: exit 2, not-resolved
OK withdrawn: exit 2, not-resolved
OK by-agent: exit 2, not-human
OK via-webui: exit 2, not-human
OK no-answer: exit 2, not-human
OK answer-role: exit 2, not-human
OK answer-run: exit 2, not-human
OK answer-choice: exit 2, not-human
OK two-answers: exit 2, not-human
OK arbiter-cross: exit 2, not-human
OK arbiter-cited: exit 2, not-human
OK chose-no: exit 2, not-merge-option
OK two-refs: exit 2, work-ref
OK bad-ref: exit 2, work-ref
OK task-ref-disagrees: exit 2, work-ref
OK raise-task-disagrees: exit 2, work-ref
OK target-main: exit 2, target-branch
OK superseded-question: exit 2, superseded
OK superseded-task: exit 2, superseded
OK superseded-by: exit 2, superseded
OK no-verdict: exit 2, no-verdict
OK changes-later: exit 2, not-approved
OK short-commit: exit 2, not-approved
OK wrong-task-body: exit 2, not-approved
OK args: exit 2, decision-not-found
OK earlier-merge: exit 0
OK ref-moved: exit 2, ref-moved
OK root-top: exit 2, root-file
OK root-newdir: exit 2, root-file
OK root-src: exit 2, root-file
OK unrelated: exit 2, base-conflict
OK empty: exit 2, base-conflict
OK an empty reviewed diff says so
OK dirty-changed: exit 2, checkout-dirty
OK dirty-staged: exit 2, checkout-dirty
OK dirty-untracked: exit 2, checkout-dirty
OK conflict: exit 2, base-conflict
OK a refusal after the worktree is added leaves no worktree or scratch
OK cleanup looks for the worktree's Docker network
OK dirty-during: exit 2, checkout-dirty
OK a reviewed path dirtied during the gate moves no ref
OK drift: exit 2, patch-drift
OK patch-drift leaves no worktree or scratch
OK gate-pkg: exit 2, gate-failed
OK gate-failed names the failing step's log, and it exists
OK gate-failed leaves no worktree or scratch
OK gate-script: exit 2, gate-failed
OK a failing scripts/test-*.sh fails the gate
OK a failed gate moves no ref
OK nomods: exit 4
OK a target without node_modules leaves no worktree or scratch
OK moved: exit 2, base-moved
OK base-moved keeps the base where it moved to
OK dry: exit 0
OK --dry-run writes no ref
OK --dry-run prints the commit with --subject and --attribution
OK --dry-run runs the gate
OK --dry-run leaves no worktree or scratch
OK land: exit 0
OK the landing is one commit on the old base
OK its diff is the reviewed diff by patch-id
OK its tree is the dry run's
OK the message has the option's subject, the citations and the attribution last
OK it prints the line for the PM
OK the checked-out base has the reviewed paths and keeps the unrelated edit
OK only refs/heads/refactor exists in the target
OK the work ref is unchanged
OK the bus database is unchanged
OK the gate ran each package suite but queue, and each scripts/test-*.sh
OK the landing leaves no worktree or scratch
OK the target's node_modules is still there, with its contents
OK the worktree's Docker network is removed
---
land-work selftests: 86 passed, 0 failed
+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env bash
# Row 137 round 3 (sage-0565): the candidate rebased onto 63c82f1c4 with the REQ-LAND-1 refusal
# and the arbiter path. Every test file the candidate touches, plus row 139's hard-waits test, each
# singly; scripts/test-land-work.sh; then one kill per new check. A kill edits one source file in
# place, runs one test file, which must fail on the named test (and on exactly N tests when N is
# given), and restores the file; the script checks every restored file's sha256 against the one it
# started with. Last, the whole bus and seat suites. Not the full gate.
# Usage: r3-round.sh <worktree> <logdir>
set -uo pipefail
WT=$(cd "$1" && pwd -P); LOGS=$(mkdir -p "$2" && cd "$2" && pwd -P)
INHERITED_TMPDIR=/mnt/storage/scratch/tmp
export TMPDIR="$HOME/darkwing-scratch/r137/tmp"; mkdir -p "$TMPDIR"
SRCS=(packages/seat/src/working.mjs packages/bus/src/broker.mjs packages/bus/src/landing.mjs)
declare -A SUM
for f in "${SRCS[@]}"; do SUM[$f]=$(sha256sum "$WT/$f" | cut -d' ' -f1); done
restore() {
local f bad=0
for f in "${SRCS[@]}"; do
if [ -f "$WT/$f.orig" ]; then mv -f "$WT/$f.orig" "$WT/$f"; fi
[ "$(sha256sum "$WT/$f" | cut -d' ' -f1)" = "${SUM[$f]}" ] || { echo "RESTORE_MISMATCH $f"; bad=1; }
done
return $bad
}
trap restore EXIT
echo "base $(git -C "$WT" rev-parse --short HEAD) start $(date -u +%H:%M:%S)"
# run name package-dir test-file [tmpdir]
run() {
local log="$LOGS/$1.log" start; start=$(date -u +%H:%M:%S)
(cd "$WT/$2" && TMPDIR="${4:-$TMPDIR}" timeout 600 node --test "tests/$3") > "$log" 2>&1
local rc=$?
echo "$1 rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$log" | tr '\n' ' ')"
return $rc
}
# probe name source sed-expression changed-line package-dir test-file fails test-name
# fails is the exact number of failing tests, or "any" for one or more.
probe() {
local src="$WT/$2"
cp -p "$src" "$src.orig"
sed -i "$3" "$src"
if [ "$(grep -cF -- "$4" "$src")" != 1 ]; then echo "STOP $1: the edit didn't apply"; exit 1; fi
echo "$1 edit: $2 $(grep -nF -- "$4" "$src" | sed 's/^\([0-9]*\):\s*/line \1: /')"
run "$1" "$5" "$6"
local rc=$? log="$LOGS/$1.log" n
restore || exit 1
n=$(grep -E '^ℹ fail [0-9]+$' "$log" | awk '{print $3}')
if [ $rc -ne 0 ] && grep -qF "✖ $8" "$log" && { [ "$7" = any ] && [ "${n:-0}" -ge 1 ] || [ "${n:-}" = "$7" ]; }; then
echo "$1 KILLED: \"$8\" failed, $n failing"
else
echo "STOP $1: expected \"$8\" to fail ($7 failing), got ${n:-none}"; exit 1
fi
}
run bus-land packages/bus land.test.mjs || { echo "STOP bus-land"; exit 1; }
run bus-hard-waits packages/bus hard-waits.test.mjs || { echo "STOP bus-hard-waits"; exit 1; }
run bus-project-runtime packages/bus project-runtime.test.mjs || { echo "STOP bus-project-runtime"; exit 1; }
run seat-landing packages/seat landing.test.mjs || { echo "STOP seat-landing"; exit 1; }
run seat-working packages/seat working.test.mjs || { echo "STOP seat-working"; exit 1; }
run harness-bundle packages/harness bundle.test.mjs || { echo "STOP harness-bundle"; exit 1; }
run harness-git-tools packages/harness git-tools.test.mjs || { echo "STOP harness-git-tools"; exit 1; }
run harness-tools packages/harness tools.test.mjs || { echo "STOP harness-tools"; exit 1; }
run cli-git-socket packages/cli git-socket.test.mjs || { echo "STOP cli-git-socket"; exit 1; }
# The real-sandbox tests take the inherited TMPDIR (the bwrap runner fails under an override).
run cli-launcher packages/cli launcher.test.mjs "$INHERITED_TMPDIR" || { echo "STOP cli-launcher"; exit 1; }
run cli-thread-launch packages/cli thread-launch.test.mjs "$INHERITED_TMPDIR" || { echo "STOP cli-thread-launch"; exit 1; }
start=$(date -u +%H:%M:%S)
(cd "$WT" && timeout 600 bash scripts/test-land-work.sh) > "$LOGS/test-land-work.log" 2>&1
rc=$?
echo "test-land-work rc=$rc $start-$(date -u +%H:%M:%S) $(tail -1 "$LOGS/test-land-work.log")"
[ $rc -eq 0 ] || { echo "STOP test-land-work"; exit 1; }
FIRST="REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op"
LAND1="REQ-LAND-1: a gated merge decision refuses not-authorized"
HELD="landHeld is true only for an approved, unspent cross-role merge decision"
probe kill-b1-patch-drift packages/seat/src/working.mjs \
's/if (appliedId !== patch_id) refuse("patch-drift"/if (false) refuse("patch-drift"/' \
'if (false) refuse("patch-drift"' packages/seat working.test.mjs 1 \
"a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree"
probe kill-b2-against-root packages/seat/src/working.mjs \
's/"merge-base", commit, "refs\/heads\/main"\])).ok) refuse("unrelated-history"/"merge-base", commit, "refs\/heads\/root"])).ok) refuse("unrelated-history"/' \
'"merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history"' packages/seat working.test.mjs 1 \
"once the root shares no history with a landed main, a push is checked against main, not the root"
# (a) REQ-LAND-1: without the refusal, the human-approved gated decision lands.
probe kill-a-gated-refusal packages/bus/src/broker.mjs \
"s/if (cls === 'gated') fail('not-authorized');/if (false) fail('not-authorized');/" \
"if (false) fail('not-authorized');" packages/bus land.test.mjs 1 "$LAND1"
# (b) without the arbiter path, every arbiter-resolved landing refuses not-human.
probe kill-b-arbiter-path packages/bus/src/landing.mjs \
"s/const arbitrated = arbiter && d.class/const arbitrated = false \&\& d.class/" \
"const arbitrated = false && d.class" packages/bus land.test.mjs any "$FIRST"
# Item 5: the arbiter path takes only a cross-role decision, so a gated one an arbiter resolved fails it.
probe kill-5-cross-role-only packages/bus/src/landing.mjs \
"s/const arbitrated = arbiter && d.class === 'cross-role' && /const arbitrated = arbiter \&\& /" \
"const arbitrated = arbiter && d.route_to" packages/bus land.test.mjs 1 "$LAND1"
# land-work's call passes no `arbiter`, so it stays human-only.
probe kill-arbiter-default packages/bus/src/landing.mjs \
"s/{ into, arbiter = false })/{ into, arbiter = true })/" \
"{ into, arbiter = true })" packages/bus land.test.mjs 1 "$FIRST"
# landHeld offers the land op only for a cross-role decision.
probe kill-held-cross-role packages/bus/src/broker.mjs \
"s/if (d.class !== 'cross-role' || this.#raisedThread(d) !== record.thread) continue;/if (this.#raisedThread(d) !== record.thread) continue;/" \
"if (this.#raisedThread(d) !== record.thread) continue;" packages/bus land.test.mjs any "$HELD"
# The whole bus and seat suites once more, on the restored candidate.
for pkg in bus seat; do
start=$(date -u +%H:%M:%S)
(cd "$WT/packages/$pkg" && timeout 900 node --test tests/*.test.mjs) > "$LOGS/$pkg.log" 2>&1
rc=$?
echo "$pkg rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$LOGS/$pkg.log" | tr '\n' ' ')"
[ $rc -eq 0 ] || { echo "STOP $pkg"; exit 1; }
done
echo "ROUND_PASSED $(date -u +%H:%M:%S)"
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,31 @@
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
4c6bcbcfa07ae36887aa25d2cedee3d080aefe75fefa4e939ec274e8e3b0ae8e packages/bus/README.md
be3559db5337f8720f0813c2e4158cc2b0423fc7b57afa955d80e6736416a8a5 packages/bus/src/broker.mjs
9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b packages/bus/src/landing.mjs
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
23d93c7ec180c3ce0b1fa764cda5deb8150943e4b8f8a2fbcb78a7124dc0ab66 packages/bus/tests/land.test.mjs
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
6eb0ebb8b49b1916bd3254a9c2424d5e54a2bef863eec268ce5ad4b98e6b15a8 packages/cli/README.md
8b629a5c18b0c45752e9206ebbd7118b78246abfbe4024584bd167e96e7b34ca packages/cli/src/git-socket.mjs
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
3138cdac761bf1167fc2c6b539e96b5f8059c2f015d9d0ea8462ae2be6703765 packages/cli/tests/git-socket.test.mjs
4bc008fd4c3f2dca1e0795884139889ad2d8bb35554bceeb109c7e3129990384 packages/cli/tests/launcher.test.mjs
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
69c5623e5a7fec9e36ca3877ed0edbb56eceb0e7b5ceea8a8559db8224fecf45 packages/harness/README.md
6b877124b42153842c480006ff2f76379e627df44e50e3581d4933553a77f6ca packages/harness/src/bundle.mjs
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
8d930f3ecc67c8d4b37ebede28323d1a9b9954c6297234384b3b1401608de237 packages/harness/tests/bundle.test.mjs
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
@@ -0,0 +1,43 @@
base 63c82f1c4 start 20:38:29
bus-land rc=0 20:38:29-20:38:31 ℹ pass 11 ℹ fail 0 ℹ skipped 0
bus-hard-waits rc=0 20:38:31-20:38:33 ℹ pass 12 ℹ fail 0 ℹ skipped 0
bus-project-runtime rc=0 20:38:33-20:38:33 ℹ pass 3 ℹ fail 0 ℹ skipped 0
seat-landing rc=0 20:38:33-20:38:34 ℹ pass 8 ℹ fail 0 ℹ skipped 0
seat-working rc=0 20:38:34-20:38:40 ℹ pass 26 ℹ fail 0 ℹ skipped 0
harness-bundle rc=0 20:38:41-20:38:41 ℹ pass 22 ℹ fail 0 ℹ skipped 0
harness-git-tools rc=0 20:38:41-20:38:43 ℹ pass 5 ℹ fail 0 ℹ skipped 0
harness-tools rc=0 20:38:43-20:38:43 ℹ pass 19 ℹ fail 0 ℹ skipped 0
cli-git-socket rc=0 20:38:43-20:38:52 ℹ pass 24 ℹ fail 0 ℹ skipped 0
cli-launcher rc=0 20:38:52-20:39:07 ℹ pass 19 ℹ fail 0 ℹ skipped 0
cli-thread-launch rc=0 20:39:07-20:39:21 ℹ pass 8 ℹ fail 0 ℹ skipped 0
test-land-work rc=0 20:39:21-20:39:34 land-work selftests: 86 passed, 0 failed
kill-b1-patch-drift edit: packages/seat/src/working.mjs line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
kill-b1-patch-drift rc=1 20:39:34-20:39:41 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b1-patch-drift KILLED: "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed, 1 failing
kill-b2-against-root edit: packages/seat/src/working.mjs line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
kill-b2-against-root rc=1 20:39:41-20:39:47 ℹ pass 25 ℹ fail 1 ℹ skipped 0
kill-b2-against-root KILLED: "once the root shares no history with a landed main, a push is checked against main, not the root" failed, 1 failing
kill-a-gated-refusal edit: packages/bus/src/broker.mjs line 815: if (false) fail('not-authorized');
kill-a-gated-refusal rc=1 20:39:47-20:39:49 ℹ pass 9 ℹ fail 2 ℹ skipped 0
kill-a-gated-refusal KILLED: "REQ-LAND-1: a within-role merge grant refuses not-authorized at the land" failed, 2 failing
kill-2-gated-only edit: packages/bus/src/broker.mjs line 815: if (cls === 'gated') fail('not-authorized');
kill-2-gated-only rc=1 20:39:49-20:39:50 ℹ pass 10 ℹ fail 1 ℹ skipped 0
kill-2-gated-only KILLED: "REQ-LAND-1: a within-role merge grant refuses not-authorized at the land" failed, 1 failing
kill-b1-cli-text edit: packages/cli/src/git-socket.mjs line 259: the reviewed diff ${base}..${f.commit}. Resolved ${f.choice} by ${f.by} via the CLI at ${f.resolved_at}.
kill-b1-cli-text rc=1 20:39:50-20:39:59 ℹ pass 23 ℹ fail 1 ℹ skipped 0
kill-b1-cli-text KILLED: "land: an arbiter-resolved landing's squash says the arbiter resolved it through the broker" failed, 1 failing
kill-b-arbiter-path edit: packages/bus/src/landing.mjs line 114: const arbitrated = false && d.class === 'cross-role' && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
kill-b-arbiter-path rc=1 20:39:59-20:40:01 ℹ pass 5 ℹ fail 6 ℹ skipped 0
kill-b-arbiter-path KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 6 failing
kill-5-cross-role-only edit: packages/bus/src/landing.mjs line 114: const arbitrated = arbiter && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
kill-5-cross-role-only rc=1 20:40:01-20:40:03 ℹ pass 10 ℹ fail 1 ℹ skipped 0
kill-5-cross-role-only KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
kill-arbiter-default edit: packages/bus/src/landing.mjs line 91: export function readLanding(q, business, id, { into, arbiter = true }) {
kill-arbiter-default rc=1 20:40:03-20:40:05 ℹ pass 10 ℹ fail 1 ℹ skipped 0
kill-arbiter-default KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 1 failing
kill-held-cross-role edit: packages/bus/src/broker.mjs line 925: if (this.#raisedThread(d) !== record.thread) continue;
kill-held-cross-role rc=1 20:40:05-20:40:06 ℹ pass 8 ℹ fail 3 ℹ skipped 0
kill-held-cross-role KILLED: "landHeld is true only for an approved, unspent cross-role merge decision" failed, 3 failing
bus rc=0 20:40:06-20:40:19 ℹ pass 317 ℹ fail 0 ℹ skipped 0
seat rc=0 20:40:19-20:40:26 ℹ pass 150 ℹ fail 0 ℹ skipped 0
ROUND_PASSED 20:40:26
@@ -0,0 +1,20 @@
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.015798ms)
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (41.839958ms)
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (505.134436ms)
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (271.314022ms)
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (121.950521ms)
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (159.257982ms)
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (160.15131ms)
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (109.758505ms)
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (124.486226ms)
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (112.755751ms)
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (112.876897ms)
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (157.719081ms)
ℹ tests 12
ℹ suites 0
ℹ pass 12
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1937.920951
@@ -0,0 +1,19 @@
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (129.1728ms)
✔ checkLand refuses on the decision and the review (142.47603ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (221.493623ms)
✔ REQ-LAND-1: a within-role merge grant refuses not-authorized at the land (89.537177ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (126.633282ms)
✔ a merge option with no first line refuses no-subject, as land-work does (106.881674ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (277.158806ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (118.38417ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (130.408537ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (126.518588ms)
✔ no run may write the action.allowed for git.merge.protected itself (77.111162ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1605.27556
@@ -0,0 +1,11 @@
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.451709ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (109.468669ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (124.832042ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 328.088602
@@ -0,0 +1,325 @@
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (163.148076ms)
✔ agents: working counts what the holder received and has not read; routed alone is not working (237.904388ms)
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (366.140846ms)
✔ agents: working wins over waiting, and Input needed still shows (200.144038ms)
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (209.908404ms)
✔ agents: state reads only its own business, even for a run name both use (205.781705ms)
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (233.242421ms)
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (260.678731ms)
✔ agents: stranded is oldest first and capped at 50 for a role (961.69181ms)
✔ agents: stranded is per role and per business (611.249164ms)
✔ agents: a message routed to a held role and not yet received is not stranded (164.063026ms)
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (320.827023ms)
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (205.739997ms)
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (294.967115ms)
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (274.702701ms)
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (284.260979ms)
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (423.921854ms)
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (208.937222ms)
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (301.07892ms)
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (313.266719ms)
✔ launch events require a human CLI capability; generic emit cannot forge authority events (183.748752ms)
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (204.949301ms)
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (299.94165ms)
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (212.435173ms)
✔ task action subjects and linked decision trail are complete and ordered (225.27596ms)
✔ launch binding is durable and reconnecting requires the identical trusted record (147.522365ms)
✔ business isolation includes inherited object names and cross-business message references (226.041341ms)
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (322.317386ms)
✔ task projection uses schema current view, skipping earlier and equal-start polls (167.998965ms)
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (361.725884ms)
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (300.519893ms)
✔ both arbiters require human resolution when their cross-role route is themselves (269.987526ms)
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (202.060228ms)
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.190224ms)
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (293.827506ms)
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (374.957988ms)
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (257.442071ms)
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (259.038535ms)
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (280.10122ms)
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (360.436195ms)
✔ REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant gets past the protection (304.104477ms)
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (270.918167ms)
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (335.120645ms)
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (568.418542ms)
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (424.991945ms)
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (640.518965ms)
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1059.972237ms)
✔ comment cursors isolate businesses, move only forward and remain append-only (156.520816ms)
✔ only trusted sync writes validated cursors; events and cursor share rollback (141.675484ms)
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (960.896528ms)
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1717.975958ms)
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (1133.300671ms)
✔ migration refuses mismatched source metadata without changing schema or evidence (913.393225ms)
✔ offline command migrates only the supplied fixture root and reports usage errors (1059.064858ms)
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (147.922318ms)
✔ credentials refuses a role session and any argument (207.753435ms)
✔ credentials reads the status on each request, and a broker without one lists none (247.714756ms)
✔ the broker process answers credentials without a token, path or variable in its output, log or store (241.562219ms)
✔ only validated broker references load; returned data and exceptions cannot expose a known token (2.920226ms)
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (2.439552ms)
✔ expiry refuses use and env references never become client data (0.821163ms)
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.77615ms)
✔ opaque tokens shorter than 16 characters refuse before use (0.387374ms)
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (1.706956ms)
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (548.622486ms)
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (496.3199ms)
✔ chief-executive-officer: another C-suite role isn't on the lists either (443.1721ms)
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (561.588601ms)
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (493.363263ms)
✔ chief-financial-officer: another C-suite role isn't on the lists either (430.992323ms)
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (740.943562ms)
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (543.308742ms)
✔ chief-information-officer: another C-suite role isn't on the lists either (461.94522ms)
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (574.336077ms)
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (547.199774ms)
✔ chief-information-security-officer: another C-suite role isn't on the lists either (453.081652ms)
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (515.63442ms)
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (472.99622ms)
✔ chief-marketing-officer: another C-suite role isn't on the lists either (406.703655ms)
✔ a human resolve sends the raising role one message from the human, and its request is the answer (278.227635ms)
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (263.802282ms)
✔ a human withdraw sends one message with the note (275.487664ms)
✔ a human seen before the close leaves the request on the close's answer, not the seen (321.819233ms)
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (310.353901ms)
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (332.423423ms)
✔ a raising role nobody holds at the close gets the message on the next claim (309.538947ms)
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (270.791253ms)
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (351.049846ms)
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (328.876224ms)
✔ a route the raiser hears from is allowed, checked from the route to the raiser (375.167935ms)
✔ a refused supersede withdraws nothing (326.805401ms)
✔ the assistant's within-role and gated raises still work (355.814125ms)
✔ roles lists open decisions routed to a role, and never the human inbox (256.103153ms)
✔ recent lists closed decisions of every route, newest close first, with how each closed (333.931181ms)
✔ recent gives the closing event as closed when the decision was seen first (332.180355ms)
✔ recent stops at RECENT rows (915.102875ms)
✔ every row is what trail already gives the same session for that id (309.56547ms)
✔ a role session can't list decisions, so it can't read another role's open decisions (457.129828ms)
✔ decisions is a read: one business, strict arguments, nothing written (487.809005ms)
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (167.544327ms)
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (144.815452ms)
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (182.957452ms)
✔ endLaunch leaves a claim another run took alone (208.96425ms)
✔ refuse records action.refused against the caller with the code only (150.727619ms)
✔ launches off refuses role.launch with launch-revoked until launches on (208.4134ms)
✔ broker process: launch ops authorize role.launch, record refusals and end runs (349.093113ms)
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.237128ms)
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (120.774517ms)
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (805.462423ms)
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (454.965751ms)
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (286.721471ms)
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (357.745165ms)
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (291.035324ms)
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (256.861693ms)
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (252.591822ms)
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (469.999248ms)
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (250.476104ms)
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (328.798856ms)
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.516149ms)
✔ process reader gets own kernel identity without exposing environment values (0.411471ms)
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.581397ms)
✔ real pid 1 remains inspectable when its environment is protected (0.240794ms)
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (318.948964ms)
✔ checkLand refuses on the decision and the review (378.213707ms)
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (570.741352ms)
✔ REQ-LAND-1: a within-role merge grant refuses not-authorized at the land (292.67665ms)
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (314.608769ms)
✔ a merge option with no first line refuses no-subject, as land-work does (286.198945ms)
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (727.031741ms)
✔ a ticket outlives the run that asked, and recordLand checks the task again (526.458567ms)
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (334.57817ms)
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (328.365556ms)
✔ no run may write the action.allowed for git.merge.protected itself (268.083886ms)
✔ a message to a stopped role sends launch.by one notice, and the result says so (253.505277ms)
✔ a message to a role outside launch.instances says so in its result and in the notice (187.892963ms)
✔ a message to a running role sends no notice and its result is unchanged (165.768161ms)
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (281.511981ms)
✔ a run launched but not yet claimed counts as no holder (147.166425ms)
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (305.803966ms)
✔ a business with no launch block tells nobody and says there is no launcher (141.275169ms)
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (412.128473ms)
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (242.101973ms)
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (329.598156ms)
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (443.33223ms)
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (229.148577ms)
✔ missing and foreign-business citations refuse and roll back message and grant (203.937679ms)
✔ cross-role sends still need a matching resolved decision and consume it once (292.718323ms)
✔ messages pages all human messages newest first without writes; read state is history (3165.78247ms)
✔ messages refuses role callers, invalid paging and cursors outside this human feed (327.529403ms)
✔ views messages passes only its paging arguments through (0.309737ms)
✔ messages isolates businesses even with a valid foreign cursor (199.057646ms)
✔ the assistant sends to the user and to the chief of staff only (377.224398ms)
✔ an assistant send to any other role, or to the tester, is refused and logged (396.260606ms)
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (405.977601ms)
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (341.300358ms)
✔ a sender-side list alone refuses a send to a role that has no list (573.864792ms)
✔ a target-side list alone refuses a send from a role that has no list (396.523645ms)
✔ the sender list is checked before the target list (357.640301ms)
✔ roles without the field behave exactly as before (532.580106ms)
✔ a business with no role definitions at all is unlimited (373.169576ms)
✔ a malformed messaging field refuses at boot (128.314711ms)
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (433.762247ms)
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (443.603413ms)
✔ review requests and verdicts between roles without the field are unchanged (355.589515ms)
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (230.220442ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (567.694849ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (435.272226ms)
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (245.485961ms)
✔ startup token refusal returns safe code without value or partial listening broker (85.615537ms)
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (249.331932ms)
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (258.806099ms)
✔ trusted host registers later launches; socket clients never have a registration verb (226.907808ms)
✔ runtime excludes declared project roots even when host supplies no repoRoots (80.730391ms)
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (446.674267ms)
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (172.59972ms)
✔ D2: spec.read refuses without content if its role is released during the read (171.71074ms)
✔ D3: spec.read secret check refuses flagged content without content (172.064549ms)
✔ D3: spec.read secret check refuses flagged subject without content (148.160003ms)
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.920558ms)
✔ without a trusted project adapter all three async paths refuse project-not-configured (229.774038ms)
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (239.006477ms)
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (238.142385ms)
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (215.463945ms)
✔ a message with no reply gives an empty list (239.787901ms)
✔ replies come oldest first and stop at REPLIES (992.702235ms)
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (400.298674ms)
✔ strict arguments; a role session gets human-required (444.388995ms)
✔ views passes replies through as one call with the id (0.265001ms)
✔ requirements returns the committed list to a holding role session, and no one else (217.097033ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (182.72472ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (411.682477ms)
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (254.392918ms)
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (500.999304ms)
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (316.048307ms)
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (413.744172ms)
✔ reviewFetch answers only the addressed reviewer, for the request it cites (315.631978ms)
✔ review.verdict answers one request once, to the role that asked (367.317892ms)
✔ task.close on a pushed task needs an approve verdict for the latest push (442.505584ms)
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (302.177749ms)
✔ v3b prototype refusals, views and append-only mutations (1937.741967ms)
✔ gated approval authorizes once, survives store reopen, and fresh approval works (404.728662ms)
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (247.899418ms)
✔ two scheduled callers have exactly one grant and one consumed refusal (182.293296ms)
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (380.341005ms)
✔ class drift gated to cross-role refuses before consumption (292.098134ms)
✔ class drift cross-role to gated refuses before consumption (321.409862ms)
✔ class drift gated to within-role refuses before consumption (258.164702ms)
✔ class drift cross-role to within-role refuses before consumption (293.195396ms)
✔ class drift within-role to gated refuses before consumption (272.188929ms)
✔ class drift within-role to cross-role refuses before consumption (263.9268ms)
✔ message.send consumes approval and prevents a later send or authorize (262.141997ms)
✔ role.revoke consumes approval and prevents a later revoke or authorize (292.476662ms)
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1624.059564ms)
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (290.716934ms)
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (222.130844ms)
✔ two real socket writes to one repository yield one commit and one project-busy refusal (269.533819ms)
✔ client disconnect during await tolerates late reply (218.822322ms)
✔ client disconnect during await tolerates late refusal (225.813042ms)
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (401.483325ms)
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (339.280093ms)
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (356.050995ms)
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (279.667657ms)
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (285.573262ms)
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (295.472839ms)
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (374.292431ms)
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (210.385711ms)
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (479.653617ms)
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (482.927536ms)
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (450.42297ms)
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (254.595048ms)
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (647.518839ms)
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (477.865241ms)
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (268.894233ms)
✔ a business that never switched launches reads allowed with no time and no event (132.876196ms)
✔ launches revoked and then restored read allowed, with the restore time and event id (195.945942ms)
✔ a task closed on the tracker leaves the open list, and total counts the open ones (198.688975ms)
✔ a tombstone is not open (172.947387ms)
✔ the open list stops at the cap and says so; total still counts every open task (186.274275ms)
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (172.727737ms)
✔ a human session reads the same state, with the same cap (169.855179ms)
✔ reading state writes nothing: every table keeps its row count (189.504254ms)
✔ creates private WAL store and excludes a second writer until explicit close (161.411148ms)
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (226.846163ms)
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (206.813294ms)
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (192.041346ms)
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (137.891264ms)
✔ async transactions refuse before invoking their function (116.065752ms)
✔ the session default fits under the reply cap and pages to the end with next (376.404569ms)
✔ the short form: no description, assignees by role, every listed key (289.421831ms)
✔ each filter, alone and together, and total counts every match (394.213353ms)
✔ task_ref reads one task in full, as the whole board has it (318.948724ms)
✔ no arguments is the read the Console and mosaic make, unchanged (272.515029ms)
✔ an unknown argument or a bad value refuses invalid-request (957.157426ms)
✔ tasks rows carry priority and requirement for every session that reads tasks (352.078205ms)
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (379.935404ms)
✔ an empty business and one with snapshots but no task.created read cleanly (160.046072ms)
✔ recordTask keeps sync reads and a role write apart (205.095036ms)
✔ read_at must be one canonical UTC format, so the projection compares strings safely (123.53803ms)
✔ a bad entry refuses the whole record (133.874077ms)
✔ taskView reads the projection for one business (150.411466ms)
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (299.551166ms)
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (449.652036ms)
✔ without an adapter the server refuses every task verb (242.9348ms)
✔ the runtime refuses an invalid adapter and closes a valid one (249.116516ms)
✔ the process loads the S3 adapter from plain-data trackers (348.541987ms)
✔ the tester binds only when the business sets bus.tester to exactly true (964.29863ms)
✔ a business may not name a role tester, so the tester address is never a role (291.772573ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (588.520152ms)
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (234.278026ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (270.049444ms)
✔ the tester reads the human views a reader reads (203.121857ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.236184ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.372197ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.21276ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (123.82079ms)
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (943.547509ms)
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1153.450465ms)
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (882.258139ms)
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (911.948599ms)
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (382.17206ms)
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1307.769388ms)
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (359.960618ms)
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3729.535273ms)
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (104.244874ms)
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (168.788333ms)
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (165.660497ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (187.101128ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (226.645654ms)
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (148.438178ms)
✔ REQ-USER-2: the human verbs refuse another owner's thread (156.660224ms)
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (104.914884ms)
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (160.083176ms)
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (471.541829ms)
✔ socket capability stamps launch identity; shared views use wire, no SQL client (189.90918ms)
✔ two wire claims serialize; a lost reply never automatically retries (212.518821ms)
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (145.029231ms)
✔ client preserves UTF-8 when a response divides a multibyte character (11.785606ms)
✔ committed mutation followed by dropped reply reports unknown and is never retried (162.190362ms)
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (188.086132ms)
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (201.04147ms)
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (250.268316ms)
✔ a broker with no web service refuses a granted role (166.481396ms)
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (224.937869ms)
✔ a session that is not the role holder is refused (140.410663ms)
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (422.56814ms)
✔ web.search with no search source configured is a refused result, not an error (167.173528ms)
✔ a search source that fails with its own refusal, or that throws, is handled (185.216794ms)
✔ a slow search source ends in a refusal at the deadline (222.828173ms)
✔ a secret in the arguments is refused before anything is trailed or fetched (142.058012ms)
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (265.284914ms)
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.265644ms)
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (205.398734ms)
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (171.257668ms)
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (465.66613ms)
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (177.629978ms)
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (200.391696ms)
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (171.338629ms)
ℹ tests 317
ℹ suites 0
ℹ pass 317
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 12956.803442
@@ -0,0 +1,32 @@
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (471.522207ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (468.407737ms)
✔ the size cap refuses a push before any byte (234.304174ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (418.613822ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (278.915332ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (385.31584ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (311.771628ms)
✔ a review of a project the business no longer has refuses unknown-project (300.581069ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (220.56398ms)
✔ close() answers host-closing to a connection still sending its request line (263.301643ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (657.746649ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (563.723136ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (603.389953ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.271585ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (548.565693ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.571511ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.44554ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (458.496818ms)
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (395.725127ms)
✔ land: an arbiter-resolved landing's squash says the arbiter resolved it through the broker (374.613997ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (385.512246ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (354.474371ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (354.936085ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (355.265593ms)
ℹ tests 24
ℹ suites 0
ℹ pass 24
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8841.265183
@@ -0,0 +1,27 @@
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1223.608048ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (441.703173ms)
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (876.215355ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3581.810518ms)
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (358.114296ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (140.568931ms)
✔ a runner that stops at once ends its launch with the runner's reason (212.194641ms)
✔ a Claude Code launch with no session credential refuses before it starts (113.289691ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (198.502793ms)
✔ a runner killed from the host ends its launch as killed, not failed (258.620009ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (119.387455ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1019.259183ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (679.220064ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3628.823248ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (116.098638ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (110.264535ms)
✔ a launch client that never closes its side doesn't hold the host's close (117.117108ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1229.351578ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.152564ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14518.527374
@@ -0,0 +1,16 @@
✔ 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 (5353.35591ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1592.360203ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4257.378976ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2806.766472ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (50.179648ms)
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (145.530318ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (177.805567ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (45.3103ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 14517.987276
@@ -0,0 +1,30 @@
✔ sessionModel: agent vars win, then the system's execution settings (7.773791ms)
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.289075ms)
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.868116ms)
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.931942ms)
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.17696ms)
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.388808ms)
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.04359ms)
✔ the prompt names the project clones in the workspace, and none when there are none (4.15437ms)
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.125247ms)
✔ the prompt explains landing to a role with land_work, and to no other (2.459215ms)
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (4.506136ms)
✔ a bundle is written once: an existing file refuses (0.925215ms)
✔ a path with a single quote can't go into the hook command (1.013132ms)
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (1.384804ms)
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.141717ms)
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.176188ms)
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.085067ms)
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.092107ms)
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (2.855812ms)
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.038448ms)
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (4.078183ms)
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.182927ms)
ℹ tests 22
ℹ suites 0
ℹ pass 22
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 130.530535
@@ -0,0 +1,13 @@
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (172.286056ms)
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (113.05041ms)
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1809.122314ms)
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.690861ms)
✔ land_work sends one land line and resolves the host's started answer (3.101522ms)
ℹ tests 5
ℹ suites 0
ℹ pass 5
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2460.5604
Loaded 100 of 7990 files, more files were not shown because too many files have changed in this diff. Show more