Compare commits

..
Author SHA1 Message Date
jason.woltje b23783f395 Rows 270+271 landing (7328da8ca), 571 landing, MVP rows 293-299: BUILD-LOG phase line and Sage SESSIONS line; docs only 2026-10-22 21:34:23 -05:00
jason.woltje e18ad27115 docs: define mixed-format chapter ordering for conversion 2026-10-22 21:34:23 -05:00
jason.woltje 12f8c3089c queue: rows 293-299 briefed (revs 3399, 3401-3406, sage) and row 293 claimed by gander (rev 3400, gander-293-start); queue only 2026-10-22 21:34:06 -05:00
jason.woltje 253346e3c3 queue: rows 293-299 added (574 #1805, FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 #1804, 573 #1806; mos-1371/1372), 208 after 294; 270 round 3 request c30929 and Duckworth APPROVE c30930; 270+271 done at 7328da8ca (mos-1351); queue only 2026-10-22 21:19:12 -05:00
jason.woltje 7328da8ca4 gizmoduck: row 270 (264c, #1775) gate results: run 3 red on case1-accept P10 band (Vikunja 573) and run 4 red on the checkout.test fixture race (Vikunja 574), both old tests unchanged in the range; run 5 GREEN on 53406f3e4 under mos-1369 and sage-3106, all phases and 38/38 mutants killed; BUILD.md only 2026-10-22 21:07:51 -05:00
jason.woltje 84002f960a gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2 2026-10-22 21:07:51 -05:00
jason.woltje f89aaf57fe gizmoduck: row 270 (264c, #1775) gate run 1 red placed (mos-1272): compactions-launch.test's host wires row 271's five clear ops, as session-clear.test does; the clear test's successor never started without them; kill lines +5 in mutants.py K; BUILD.md run 1 2026-10-22 21:07:51 -05:00
jason.woltje d3a49f301a gizmoduck: rows 270+271 combined gate (C2) record before the first run (sage-3073, sage-3086, mos-1275, mos-1351): blob table, timeout table, GREEN and RED, order; code is ac44d0de9's 2026-10-22 21:07:51 -05:00
jason.woltje 562b05b43c gizmoduck: row 270 (264c, #1775) round 4 for sage-3073 and sage-3078: rows 270 and 271 rebased onto 25c09f19f (row 203 plus the O2 docs); mosaic-config.mjs keeps 203's federation key and both compaction keys; BUILD.md round 4 with the range-diff, the three merged files and C1 after 203; not run 2026-10-22 21:07:51 -05:00
jason.woltje 8c28ee7315 gizmoduck: row 270 (264c, #1775) round 3 for duckworth-0226 B4 (sage-3038): one collection opens at most the system config's compactionStreams stream files in name order (default 1024, 32 to 65536, a bad value takes the default and logs), not-collected past it with no cursor for an unopened stream; the missing-stream check uses a Set; readStreams, cap and launcher tests; mutants M22-M24, M10 anchor moved; docs/TOOLS.md has both keys and C1 (N4); BUILD.md round 3 with stream counts, the 231 KB bound, C1 and N5; not run 2026-10-22 21:07:51 -05:00
jason.woltje bce4917154 gizmoduck: row 270 (264c, #1775) round 2 for duckworth-0223 B1-B3 (sage-3030, sage-3031, mos-1352, sage-3033): pi streams read in 1 MiB chunks under a budget from the system config's compactionReadBytes (default 64 MiB, 1 MiB to 1 GiB, a bad value takes the default and logs), not-collected past it; Claude history from before the ledger is harness-unsupported for good; launcher, runtime reader, clear and legacy tests; mutants M13-M21; BUILD.md round 2 with sizes, schema change, rollback hazard, N1-N3; not run 2026-10-22 21:07:51 -05:00
jason.woltje 01b57f48bb gizmoduck: row 270 (264c, #1775) round 1 for review (sage-3024): mutants.py M1-M12 with anchors at 7d199f033, each matching once, kills read from the tests; run plan with broker.mjs reruns; launcher and runtime wiring named as untested; not run 2026-10-22 21:07:51 -05:00
jason.woltje 54ec0005e0 row 271 (264d, #1776): BUILD.md r3 gate on 9e18a9aaf (sage-3017): cli and bus session-clear.test whole green (5/5, 19/19), cli suite 874/874, M14 killed by the T6 test's first lines() assertion at :365; no first-run red. Doc only. 2026-10-22 21:07:51 -05:00
jason.woltje 61e262b7c0 row 271 (264d, #1776): r3 packet carries mutants.py, M1-M14 with their anchors, as the gate applies them (duckworth-0212 C1). Doc and harness only; no src or test change. 2026-10-22 21:07:51 -05:00
jason.woltje 540b6f16ba row 271 (264d, #1776): r3, T6 per sage-3001. New cli test: a bus unavailable (broker-exited) at the exit proof, then at retirement, holds the clear with no retirement, successor launch or slot handed on, logs once, and resumes when the bus answers. BUILD.md maps the halt case to session-launch.test.mjs:372 and launcher.mjs:824, binds the Q198 hold to row 257 with duckworth-0210's carry, and names M14 (drop clearPass's try/catch) and its kill. No src change. Not run (no CLEAR). 2026-10-22 21:07:51 -05:00
jason.woltje e6a675ee83 row 271 (264d, #1776): BUILD.md gate results on e8af389e6 (sage-2991): 18 touched files, bus/seat/cli suites and every test-*.sh green, M1-M13 killed by assertions in the named tests; the row gate's T6 coverage open to Sage. Doc only. 2026-10-22 21:07:51 -05:00
jason.woltje e77635cebb row 271 (264d, #1776): BUILD.md run limits for the e567f949c gate (mos-1275, sage-2991); mutant lines moved one down past the B1 comment. Doc only. 2026-10-22 21:07:51 -05:00
jason.woltje 3fc8ccef1a row 271 (264d, #1776): duckworth-0201 B1: #ownerRefusal passes 'session.clear' to #granted, so the project and instance sit in their own slots and a live collaborator grant passes the retirement recheck. N4 setup shared; a second N4 test keeps the grant and expects retired plus the successor; M13 restores the defect. 264e carry noted at the N4 tests. Not run (no CLEAR). 2026-10-22 21:07:51 -05:00
jason.woltje 27d3266fff row 271 (264d, #1776): BUILD.md records mos-1336, Mos's approval under mos-1292 of the later3l, rows() and thread-shares migration test changes on the 3m to 3n rebase, with its conditions 2026-10-22 21:07:51 -05:00
jason.woltje 6bd67225b5 row 271 (264d, #1776): BUILD.md states the post-rebase '3m' grep result as measured 2026-10-22 21:07:51 -05:00
jason.woltje 14715d644a row 271 (264d, #1776): r2 on 0cbe2e9b3 (sage-2968): 3m to 3n migration and 3m engine tests from fixtures/schema-3m.sql; BUILD.md records the label change, the old-test changes (later3l, rows() and the thread-shares migration test outside the mos-1315 list, for Mos) and the mutant lines on the rebased tree 2026-10-22 21:07:51 -05:00
jason.woltje f9a9c9b5a0 row 271 (264d, #1776): BUILD.md defines M1-M12 with their expected kills 2026-10-22 21:07:51 -05:00
jason.woltje 34388223d8 row 271 (264d, #1776): launcher uncertain-path test with test-driven ticks and a stopped runner; start() takes stopTimeoutMs 2026-10-22 21:07:51 -05:00
jason.woltje 3adb391b57 row 271 (264d, #1776): N4 failed-clear test on a user's thread with raw first rows; BUILD.md notes the failed path has no verb route yet 2026-10-22 21:07:51 -05:00
jason.woltje 4da907cd5e row 271 (264d, #1776): T4 tests round 1, not run (slot held). Bus session-clear.test.mjs (15), cli session-clear.test.mjs (3, bwrap) with clear-adapter.mjs; BUILD.md maps each T4 item and names what is still open (failed clear, launcher uncertain path, mutants) 2026-10-22 21:07:51 -05:00
jason.woltje aa8fc490f5 row 271 (264d, #1776): clear context build round 1, not run (slot held). Broker: session.clear, session.cancel and session.operation, the fence on send/open/claim, cancel at arrival for routed messages, the drained receive and the end drain, trusted ops sessionClears and sessionClearExited/Uncertain/Retire/Start. Launcher: clearPass before the threads loop (stop, proof, retire, successor start through check()/start()), waiting on a live row 269 survivor. Old tests per mos-1315, rebased on row 206 (sage-2968): label 3m to 3n, future step 3n to 3o, 3m-3n.sql in the engine copies and file lists, ready lines, later3l and the rows() exclusions gain both tables as 206 did for thread_shares (mos-1292, approved in mos-1336), schema.test counts 25 tables and 96 triggers, COUNTED and T45 LISTED gain both tables after thread_shares (mos-1318, mos-1319), TESTER_VERBS pin (mos-1325), fixtures/schema-3m.sql 2026-10-22 21:07:51 -05:00
jason.woltje a9884dc75c row 271 (264d, #1776): schema step 3m to 3n (rebased on row 206's 3l to 3m, sage-2968), session_ops and message_cancels with 7 triggers; successor id pinned as a lowercase version 8 UUID for Huey (gizmoduck-0274) 2026-10-22 21:07:51 -05:00
jason.woltje 25c2c1a560 gizmoduck: row 271 design: duckworth-0171 C1 (start stages keyed on a report counter, work attempt in its own column) and C2 (cancelled in the stage CHECK at attempt 0 and closing the op, claim and cancels untouched by a pre-retire cancel, post-retire successor reading stated, race and held tests); N1 grep at build 2026-10-22 21:07:51 -05:00
jason.woltje 4f827a5e81 gizmoduck: row 271 design: session.cancel and the cancelled stage built in 271 (sage-2828 re-rules Q3 per D7:263-264), pre- and post-retire paths, cancel tests and the fence-release mutant; N2 refuses session-name-too-long at accept 2026-10-22 21:07:51 -05:00
jason.woltje 7dc8ff1bfa gizmoduck: row 271 design: T45 LISTED gains session_ops and message_cancels to match COUNTED (mos-1319) 2026-10-22 21:07:51 -05:00
jason.woltje 61df3061ed gizmoduck: row 271 design: duckworth-0170 B1-B4 folded (cancel at arrival for routed messages, claim refused while clearing, op namespace both ways, attempt key on start stages) and N1-N8 answered; cancel recorded as a departure from D7:263-264 2026-10-22 21:07:51 -05:00
jason.woltje b212182ed1 gizmoduck: row 271 design: both new tables join COUNTED in stack-release.sh, so T46 passes unchanged; schema.test count pins name the 2 tables and 7 triggers; T45 LISTED question to Mos (mos-1318) 2026-10-22 21:07:51 -05:00
jason.woltje dac64ff311 gizmoduck: row 271 (264d) design draft 2: drained acknowledged by the run's own receive at a turn boundary (a landing turn has unread 0 with a child running), SIGTERM only after it; successor <old>-N bound at request with a deterministic id; no cancel (sage-2826); pre-existing test change list per mos-1315 2026-10-22 21:07:51 -05:00
jason.woltje b329ad69f5 gizmoduck: row 271 (264d) design draft 1 in the packet: the threadIdle fence as the drain, the idle stop as the only signal, a session_ops journal and message_cancels in one schema step; Q1-Q4 for Sage and Mos 2026-10-22 21:07:51 -05:00
jason.woltje 8d4d4ec598 gizmoduck: row 270: the bus legacy test inserts its legacy thread by hand (sessions is append-only) and the test business has the assistant thread.create needs; not run 2026-10-22 21:07:51 -05:00
jason.woltje 5ddc36ca97 gizmoduck: row 270 (264c, #1775): completed Pi compactions counted into a host ledger beside the session store, keyed (entry id, timestamp) store-wide (sage-2806, sage-2814); launcher collects at run start and end under the workspace lock; session.list rows gain compactions through a runtime-injected reader; not run (slot held) 2026-10-22 21:07:51 -05:00
jason.woltje f510d73676 gizmoduck: rows 270 and 271 packets: the 264c count and 264d clear contracts pinned for row 272 (Huey), and the Pi 0.85.1 compaction source contract 2026-10-22 21:07:51 -05:00
jason.woltje 767bb62c7d docs: close remote credential and private review access findings 2026-10-22 21:06:29 -05:00
jason.woltje 6345aae3d8 docs: align editor graph, Markdown transition and archive with PRD d6 2026-10-22 21:06:29 -05:00
jason.woltje ee5f7b9ef8 docs: align O2 chapter conversion and Case 2 access with owner rulings 2026-10-22 21:06:22 -05:00
jason.woltje 0b923a2759 MVP readiness briefs (mos-1371/1372): FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 grant scope #1804, 574 #1805, 573 #1806; docs only 2026-10-22 20:32:37 -05:00
jason.woltje b0a6838ca6 SESSIONS: Filbert Q195 O2 S0 review (#1798, c30914); doc only 2026-10-22 19:05:06 -05:00
jason.woltje 0626464874 Q195 O2 W4 (#1799): log lines for the W4 design and review landing, row 203 and O2 landing; docs only 2026-10-22 18:55:11 -05:00
jason.woltje 66299eeef7 Q195 O2 W4 (#1799): Megavolt's round 4 review of 994c3f7fb (blob 2af460ab7): APPROVE, R3-B1 and R3-B2 closed, R4-N1 (re-migration after a pre-W4b restore) non-blocking for W4b; doc only 2026-10-22 18:54:51 -05:00
jason.woltje 569bb6b177 Q195 O2 W4 (#1799): Megavolt's round 3 review of 54246cb32 (blob 0c4f55826): CHANGES, R2-B1 projection and R2-B2 closed, R3-B1 (reserved notes keyed on negative IDs) and R3-B2 (fence initial state and confirmation scope undefined); doc only 2026-10-22 18:54:51 -05:00
jason.woltje fb404c909d Q195 O2 W4 (#1799): Megavolt's round 2 review of 019a0ea5b (blob 14dfe92d9): CHANGES, B1-B9 and M1 closed, R2-B1 (paragraph-mark revisions, reserved-note leaves) and R2-B2 (release backup/restore keeps O2 text and revives revocations); doc only 2026-10-22 18:54:51 -05:00
jason.woltje 4c0a2c4fd4 Q195 O2 W4 (#1799): Megavolt's review of the DOCX citation design at 15e91538f (blob 662abdb7c): CHANGES, B1-B9 and M1 (Case 2 narrowing in O2-context turns goes to Mos/Jason); doc only 2026-10-22 18:54:51 -05:00
Rocko 2f06aad3f0 docs: define reserved notes and initial O2 restore fence 2026-10-22 18:54:51 -05:00
Rocko 6863d4c852 docs: specify O2 projection marks and restore revocation fence 2026-10-22 18:54:51 -05:00
Rocko 9ef5798acb docs: close W4 locator and access review gaps 2026-10-22 18:54:51 -05:00
Rocko 4897520c31 docs: define committed DOCX citation and access contract 2026-10-22 18:54:51 -05:00
jason.woltje 4ca2703079 queue: revs 3360-3368. Row 203 (#1701): Sage brief re-pin to 8adfb261f (3360, Webby N2), Quackerjack claim, in-review r2 and outcome (3361-3363), Sage request as jarvis (3364-3365), Webby approve record (3366), Sage landing note and done (3367-3368). 2026-10-22 18:54:10 -05:00
jason.woltje 25c09f19fe docs: name save-group settings and enforce adoption gates 2026-10-22 18:51:33 -05:00
jason.woltje a6da8718c4 docs: fix O2 review gates, shipping and save semantics 2026-10-22 18:51:33 -05:00
jason.woltje ee26cfbada docs: redesign Q195 for full WordCraft O2 editor 2026-10-22 18:51:33 -05:00
jason.woltje a4da4e6df4 row 203: gate results on the rebased tip (c7b754d7b): stack-release 219/0, test-config 51/0, mutants 17/17, cli 895/0, ten scripts green with named skips; code tree unchanged from 7309260ae 2026-10-22 18:39:28 -05:00
jason.woltje 7309260aeb row 203: gate record on the rebased tip (c7b754d7b): blob table and timeout table, written before the first run 2026-10-22 18:01:35 -05:00
jason.woltje 7c543fd4a1 row 203 FED R2: cases for missing self, peer id and label (webby-0191 B3)
The pattern test coerces an absent value to the string 'undefined', which
matches, so the typeof halves are the only refusal for a missing value. Adds
a case for each, and M15-M17 in BUILD.md; keeps the config-console-key check
name on purpose. Not run yet.
2026-10-22 17:57:25 -05:00
jason.woltje 284d55cf2c row 203 FED R2: stack-release probe reads federation; a refusal case per federation check
stack-release config_checks refuses a target whose loader refuses a key the
config holds; it looked only for console, so a federation-only config passed
to a pre-203 copy. The probe now reads console or federation. The fixture's
B loader replace follows the new rejectUnknownKeys list, which the federation
key changed.

Adds a test for each federation refusal in test-config.sh (six uncovered,
plus trailing slash and duplicate peer id), and one stack-release test for
the target-loader refusal. Mutants M7-M14 in BUILD.md. Not run yet.
2026-10-22 17:57:25 -05:00
jason.woltje 93a491d732 row 203 FED R2: federation key in the system config (#1701)
The loader validates an optional federation block: self and peers[].id
labels, peers[].origin as an https origin with no path, query or userinfo,
peers[].label non-empty and at most 80 characters, peer ids unique and
distinct from self. Unknown sub-keys refuse. Labels and URLs only; the key
grants no trust. Absent key: config loads with no federation output.

Tests in scripts/test-config.sh cover each refusal and the no-key case.
Notes and mutants M1-M6 in agents/quackerjack/work/queue-203/BUILD.md.
Not run yet: the gate runs on CLEAR.
2026-10-22 17:57:25 -05:00
jason.woltje c7b754d7b1 queue: revs 3339-3359. Row 292 (#1797, Gander) added and briefed (Sage, 3339-3340). Row 291: Gosalyn claim and in-review r1 (3341, 3344-3345), Sage request as jarvis (3353-3354), Webby approve record (3357). Row 207: Megavolt in-review (3342), Sage abandon and request as jarvis, resolved on c30841 (3347, 3349-3350), Duckworth approve record (3356), Sage landing note and done (3358-3359). Row 270: Gizmoduck claim and in-review r3 (3343, 3346), Sage abandon and request as jarvis (3348, 3351-3352), Duckworth approve record (3355). 2026-10-22 17:53:26 -05:00
jason.woltje a94c95522f docs: row 207 landing records (SESSIONS, BUILD-LOG, Megavolt's lines), DEFERRED 207 N1 (duckworth-0230) and 270 N6 bound to row 272 (duckworth-0228) 2026-10-22 17:51:32 -05:00
jason.woltje c4f77373f9 row 207 (#1705): BUILD.md Runs records the gate on 712f79c0a (sage-3041): access.test 31/31, M1-M8 killed on their named tests, cli 894/894, ten scripts green under the mos-1275 limits, and the stopped first run's kill-check correction; doc only 2026-10-22 17:28:04 -05:00
jason.woltje c7e77202d6 row 207 (#1705): BUILD.md records sage-2810 (Q1 no reload, cited to broker.mjs:384; Q2 refuse with user-has-grants) and the usage/help pin sweep: access.test.mjs is the only reader, no hash pin; doc only 2026-10-22 17:28:04 -05:00
jason.woltje a0094633f6 row 207 (#1705): access.test.mjs T1-T9 for user add|remove; BUILD.md pins M7/M8 as edits and records the row 275 path check (bus only, morgana/row275 empty); not yet run, waits for Sage's CLEAR (sage-2790) 2026-10-22 17:28:04 -05:00
jason.woltje 721268b084 row 207 (#1705): mosaic access user add|remove on R5's path (proof, lock, revision, checkAccess, receipt user.add/user.remove); remove refuses user-has-grants; --level viewer already in R5; BUILD.md records Q1-Q5 (no access.reload, R4's) and the tests and mutants; tests held for the row 275 manifest check (sage-2790) 2026-10-22 17:28:04 -05:00
jason.woltje f0e3dcdf41 plans: brief for the config_checks follow-up (row 270 rollback hazard, duckworth-0226, sage-3038) 2026-10-22 17:11:21 -05:00
jason.woltje 01983cd3f1 queue: rev 3338. Row 224 waits on row 216 (Sage, mos-1351: della/row224 carries row 216's commit 4f3fbc25a). 2026-10-22 17:06:42 -05:00
jason.woltje 626c19e78c queue: revs 3325-3337. Row 271: Gizmoduck claim and in-review r3 (3325-3327), Sage review request as jarvis (3328-3329), Duckworth approve record (3330). Row 276: Gander in-review r1 (3331-3332), Sage review request as jarvis (3333-3334), Duckworth approve record (3335), Sage landing note and done (3336-3337). 2026-10-22 17:04:08 -05:00
jason.woltje f32b867f34 docs(row276): record green run5 gate and all seventeen assertion kills 2026-10-22 16:59:44 -05:00
jason.woltje 826e8fd7ff docs(row276): refresh mos-1350 baseline cleanup packet and limits 2026-10-22 16:59:44 -05:00
jason.woltje e06130fc01 test(case): require baseline session cleanup per mos-1350 review 2026-10-22 16:59:44 -05:00
jason.woltje 466562ba03 docs(row276): pin mos-1350 baseline candidate and timing audit 2026-10-22 16:59:44 -05:00
jason.woltje 931fab079a perf(case): remove duplicate head validation per mos-1350 2026-10-22 16:59:44 -05:00
jason.woltje 135bb8fae2 test(case): isolate P10 timing with per-mode baseline per mos-1350 2026-10-22 16:59:44 -05:00
jason.woltje cf228eabc9 docs(row276): record run4 stop and mos-1349 timing pairs 2026-10-22 16:59:44 -05:00
jason.woltje 41f8bd1972 docs(row276): packet stdout spool and M17 per mos-1345 2026-10-22 16:59:44 -05:00
jason.woltje 47906e4fde fix(case): isolate legacy stdout after outer timeout per mos-1345 2026-10-22 16:59:44 -05:00
jason.woltje c2b845c76d docs(row276): preserve run3 whole-file stop for placement 2026-10-22 16:59:44 -05:00
jason.woltje 74635fc608 fix(row276): correct multi-file driver path per mos-1337 review 2026-10-22 16:59:44 -05:00
jason.woltje 257003ba1a test(row276): record mos-1337 N5 delta and both-copy mutant 2026-10-22 16:59:44 -05:00
jason.woltje 537ce2dd4a fix(case): silence vanished stat opens per mos-1337 N5 2026-10-22 16:59:44 -05:00
jason.woltje 3b90428021 docs(row276): record run2 stop for Mos placement 2026-10-22 16:59:44 -05:00
jason.woltje 859ae37083 docs(row276): void setup-red run and pin first fixture correction 2026-10-22 16:59:44 -05:00
jason.woltje 88179d6de4 test(row276): define read helper for new legacy fixtures 2026-10-22 16:59:44 -05:00
jason.woltje ccfa17eefc docs(row276): integrate schema3m base and record dependency drift 2026-10-22 16:59:44 -05:00
jason.woltje b5d9efa1ba docs(row276): pin integration on 94c33a43c and preserve upstream docs 2026-10-22 16:59:44 -05:00
jason.woltje 69979bb8a8 docs(row276): record static approval and upstream deferred drift 2026-10-22 16:59:44 -05:00
jason.woltje 155f643224 docs(row276): pin supervised-call candidate and fifteen mutants 2026-10-22 16:59:44 -05:00
jason.woltje b96b4e303d fix(case1): supervise legacy user calls across sudo sessions 2026-10-22 16:59:44 -05:00
jason.woltje f2735bb6a1 queue: revs 3317-3324. Row 206: Launchpad claim and in-review (3317-3319), Sage review request (3320-3321), Duckworth approve record (3322), Sage landing note and done (3323-3324). 2026-10-22 15:14:46 -05:00
jason.woltje 0cbe2e9b35 row 206 (#1704): BUILD.md Runs, gate GREEN on 9538e0fc8 (bus 850, cli 869, shell suites, M2-M9 and Q2 killed) 2026-10-22 14:40:53 -05:00
jason.woltje 9538e0fc86 row 206 (#1704): thread-shares trail test threads the reply into A's default session, not the thread id (first-run red, mos-1272) 2026-10-22 14:19:00 -05:00
jason.woltje 1a228f395f row 206 r4 (#1704): BUILD.md records the slot rebase onto 17f415792 (269, 282 landed) and the drift sweep 2026-10-22 14:16:21 -05:00
jason.woltje 8295622600 row 206 (#1704): BUILD.md records duckworth-0179/0180, C3 met on the pushed tip 670658dd1 2026-10-22 14:15:48 -05:00
jason.woltje ac0e4dc9bc row 206 r3 (#1704): BUILD.md records the C3 rebase onto 275 at 3410df7c3 on 253's 48e450ce8, and the sweep 2026-10-22 14:15:47 -05:00
jason.woltje c49fdb2692 row 206 (#1704): BUILD.md records duckworth-0175 (round 2 meets C1/C2, APPROVE carries) and C3 2026-10-22 14:15:47 -05:00
jason.woltje cfb86f1bd7 row 206 r2 (#1704): rebased on 275 r3 957a9bfe0; share verbs need collaborator, viewer reads a share (duckworth-0169 C1, C2) 2026-10-22 14:15:47 -05:00
jason.woltje 178eefd5c4 row 206 (#1704): BUILD.md records Duckworth's manifest APPROVE (duckworth-0169), C1/C2 for the 275 round, N1-N4 2026-10-22 14:15:47 -05:00
jason.woltje 8a29f94771 row 206 (193b2, #1704): sage-2818 rulings, only a human principal matches a share
#readable returns false for an agent session, so a `*` share no longer shows a user's message
in an agent's trail. New tests: a sharee's session.list refuses (Q1), and an agent bound to the
shared thread, a chief run and the tester match no share (Q2). BUILD.md records the Q1
follow-up, Q2-Q4 and the live --migrate as Mos's go under Q173. README names the agent rule.
2026-10-22 14:15:47 -05:00
jason.woltje d78a9cc83c row 206 (193b2, #1704): thread shares, schema 3l→3m
thread_shares (row 193 design 5.2) with its index and append-only triggers; the
3l-3m step only adds them. thread.share, thread.unshare and thread.shares for a
thread's owner; #readable holds design 5.4's four rules, #threadRead serves
thread.messages only, and thread.list {shared:true} adds owner. replies and
trail show shared user threads to the owner and readers. COUNTED, LISTED,
timedTables and the clock list take the table. Tests: thread-shares.test.mjs
and the 3l→3m pins. Packet agents/launchpad/work/queue-206/BUILD.md. Not run
yet: node waits for Sage's CLEAR (sage-2789).
2026-10-22 14:15:47 -05:00
jason.woltje 17f4157920 queue: revs 3217-3316. Q226 gap (rows 216-229, 265-267 re-pins; 217 unblocked; 223 blocked; rows 282-290 added), rows 253, 275, 269 and 282 reviews, notes and done moves, row 291 (PRD 1.16, #1796) added, claims and in-review moves for 173, 207, 211, 214, 224, 239, 252, 258, 276 (sage, darkwing, della, dewey, gander, herb, honker, megavolt, scrooge, ludwig, gizmoduck, gosalyn, webby, duckworth, morgana); review requests posted as jarvis by Sage 2026-10-22 14:13:04 -05:00
jason.woltje 647424442f gosalyn: PRD 1.15 round 2 for Webby webby-0158 B1: requireCitation makes every reply carry a citation except the runner's four fixed notices, as the design keeps them passing, and the REQ-LIB-1 rewrap joins organization file to its sentence (N1) 2026-10-22 14:06:25 -05:00
jason.woltje 71fed6281c gosalyn: PRD 1.15 rewrites REQ-LIB-6 to Q223 and Q226 (mos-1320 item 8): agents never write story and write .md files only in supporting folders a human marks, each as a commit by their own Gitea account with a notice she can revert, chat is free text, any citation is checked, and requireCitation is a human-only setting off by default. REQ-LIB-1 and REQ-LIB-2 gain supporting folders and the canon-cite rule. The 1.12 note's residual becomes the supporting-doc residual, and the 1.15 note records the old texts and lists REQ-LIB-3, 4, 5 and 7 as unchanged. requirements.json version 1.15 with three titles changed, and the test's version pin. The id count stays 85 2026-10-22 14:06:25 -05:00
jason.woltje 86a665bdf0 docs: PRD 1.16 brief, library.write routes under REQ-LIB-6 (#1796, mos-1328) 2026-10-22 13:51:55 -05:00
jason.woltje efcc9ea8dd row 269 (264b, #1774): BUILD.md M11 kill line is the survivor log assertion at session-launch.test.mjs:309, not the outcome assertion (mutant run 17:49Z, duckworth-0181) 2026-10-22 13:37:34 -05:00
jason.woltje f39508c24f row 269 (264b, #1774): the M6 halt test halts after mayLaunch answers
A halt inside the op reaches the bus's own fence first (runtime.mjs:564-566,
processingWork at :352-356), so the launcher refused limit-check-failed
(launcher.mjs:389-391) before its recheck admission() at :397. First-run red of
a new test on 6d9ab3503 early signal, placed under mos-1272.
2026-10-22 13:37:34 -05:00
jason.woltje d20ef317fc row 269 (264b, #1774): BUILD.md names the sessioned-survivor residual in Q2 and records N1's mos-1292 allowance (duckworth-0159 N3, N4) 2026-10-22 13:37:34 -05:00
jason.woltje 6e50bd6304 row 269 (264b, #1774): BUILD.md Q2 notes that a survivor's released claim doesn't prove its run has exited, and the per-leftover 5 s wait (duckworth-0158 N1, N2) 2026-10-22 13:37:34 -05:00
jason.woltje 6c80b12904 row 269 (264b, #1774): BUILD.md answers sage-2750 on the recover() change; the survivor log names its pids
The section "recover() change, for a design read" covers three things, with
file:line against aca16404c. Every leftover is still bound and ended as
host-lost, and a survivor only refuses legacy-run-live while it lives. The
5 s wait applies only in the bwrap kill branch. No old test's expected value
changes. The fallback is to revert to the base recover() and leave the
refusal untested. The survivor log line now names the outer and runner pids
so an operator can clear it, and the new test's log assertion matches.
2026-10-22 13:37:34 -05:00
jason.woltje 42fd3edd45 row 269 (264b, #1774): legacy-run-live gets its test (duckworth-0156)
recover() kept a survivor only when a bwrap outer pid outlived SIGKILL, so
the Q2 refusal (BUILD.md:177-179, t1-sessions.md:109) had no test. A leftover
whose runner still ran after its outer pid was gone was ended and dropped.
Now recover() waits on the outer pid and the runner, keeps any leftover where
either still runs, and logs that it still runs. check() reads only the
survivors that still run.

session-launch.test.mjs adds a test where a sessionless leftover's runner is
a sleep child and its outer pid is gone. It asserts the legacy-run-live
refusal with no launch and no session workspace, then one launch once the
child exits. BUILD.md adds mutants M10-M12 and replaces the "no test" note.
2026-10-22 13:37:34 -05:00
jason.woltje dc5836c7df row 269 (264b, #1774): refusedOnce in sessions.test.mjs pins actor_run, closing Duckworth N1 (DEFERRED.md:474-480)
Allowed by Mos in mos-1292 (copy mos-1294) on mos-1285's terms. The SELECT
reads actor_run, the expected row gets the run-name literal, and the three
callers pass `${name}-run`. Nothing else in the test changes. The old
expected row was:

  [['action.refused', { code: 'not-holder' }]]

DEFERRED.md gets a closing line on the entry naming row 269.
2026-10-22 13:37:34 -05:00
jason.woltje 2133c5a0c6 row 269 (264b, #1774): per-session store, workspace and single-writer lock
threadsState gives one row per session with `session` and `legacy`; threadIdle
idles a run against its bound session. Each session gets its own store
(threads/<b>/<t>/sessions/<s>/, or the thread's old store for a legacy-3l
session) and its own workspace (session-workspaces/<b>/<i>/<s>/), held by an
O_EXCL <ws>.lock from before the clones to the run's proven exit. A legacy
session's workspace binds in-sandbox at the old instance path. sessions.json
is v2 and reads v1. New tests: cli session-launch.test.mjs, seat
session-workspace.test.mjs. Not yet run: tests wait for Sage's CLEAR.

Two old assertions change as exact updates:
- mos-1285: end-launch.test.mjs threadsState deepEqual. The old row shape was
  { thread: 'th-1', instance: 'coder', pending: 0, unread: 0, lastMessage: null,
  lastOpen: '2026-10-15T00:00:01.000Z', lastClaim: null, holder: null }; the
  row keeps every key and value and adds session: 'th-1', legacy: true.
- mos-1289: thread-launch.test.mjs:182, old line
  `const store = join(f.dataRoot, "threads", "acme", A);`
  now reads A's default session id from threadsState's `session` key; :183-185
  unchanged; one added assert that threads/acme/<A>/session is absent.
2026-10-22 13:37:34 -05:00
jason.woltje 194dec83d6 row 269 (264b, #1774): BUILD.md lists thread-launch.test.mjs:182 as a second old assertion that changes. A thread.create thread's default session isn't legacy-3l, so its store takes D2's layout (t1-sessions.md:100, :294). Proposed as an exact path update, for Mos through Sage 2026-10-22 13:37:34 -05:00
jason.woltje 84b32e3903 row 269 (264b, #1774): BUILD.md drops the planned bindLaunch session-running refusal. Two old tests bind a second unended run to one session and expect the claim refusal (threads.test.mjs:88-89, sessions.test.mjs:119-120), so the broker half of the fence is the existing per-session claim, thread-already-held (broker.mjs:4815) 2026-10-22 13:37:34 -05:00
jason.woltje 9d241fdcc2 row 269 (264b, #1774): design notes for Duckworth's early look (duckworth-0150). C1 adds the Console and R-guard sessions.json readers, the 264a refusals a v2 file causes, the /proc live check and the Console restart; C2 pins M6 to a generation change after check() with all eight start() admission calls named; C3 gives the realpath compare its own code and a symlinked workspaces root as M4's input; C4 lists the old threadsState assertions, end-launch.test:193 the only change, under mos-1285 2026-10-22 13:37:34 -05:00
jason.woltje 76a6524cfe row 269 (264b, #1774): design notes for sage-2717. Rollback names the four steps past the 264a exit-3 refusal and the re-pin plan section that carries them; new M8 binds a non-default session at the legacy path, old M8 becomes M9; Duckworth's legacy-bind check 2026-10-22 13:37:34 -05:00
jason.woltje 693f7e745e row 269 (264b, #1774): design notes. D9 audit of every sessions.json reader at 84f53540d and of threadsState's consumers; sessions.json goes to v2 because recover() rebinds without session; pi 0.85.1 resumes by cwd, so the legacy session keeps its in-sandbox path; mutants M1-M8 and run limits (sage-2707) 2026-10-22 13:37:34 -05:00
jason.woltje 94c33a43c0 docs: row 275 landing line; Researcher session line 2026-10-22 13:13:47 -05:00
jason.woltje a870fd85bb docs: seat log lines for rows 281, 224, 219, 214, 211 and 258, the row 253 landing line, Sage's SESSIONS line, and DEFERRED for the 224 residual and the 206 sharee list 2026-10-22 13:10:27 -05:00
jason.woltje 5b1f1dc885 docs: DEFERRED gains row 253 N1 (Vikunja 532, mos-1297), row 198 N2 (/api/seen 400, sage-2867) and the stale row 203 text in access.mjs (Quackerjack) 2026-10-22 13:10:27 -05:00
jason.woltje 8c638b6f66 agents: register Della, Scrooge, Huey, Louie and Ludwig as seats so the queue can name them as row owners (Q220, mos-1301) 2026-10-22 13:10:27 -05:00
jason.woltje a700992cd4 docs: 193b2 brief, the live --migrate window needs Mos's go under Q173, not Jason (mos-1310 item 4) 2026-10-22 13:10:27 -05:00
jason.woltje d30f35e292 docs: SESSIONS line for Gizmoduck, rows 264a and 268 after-landing docs and the row 269 plan 2026-10-22 13:10:27 -05:00
jason.woltje e5b7d1d083 row 268 (#1773): BUILD.md Runs records the r2 gate on ecd9b35eb and the r3 and r4 carry reruns with every count and skip; doc only (sage-2455) 2026-10-22 13:10:27 -05:00
jason.woltje 836b2f25ca docs: preserve email hard-wait approval and tune parser limits 2026-10-22 13:10:27 -05:00
jason.woltje 73516da853 docs: apply Q217 and Q222 to email source settings 2026-10-22 13:10:27 -05:00
jason.woltje 95e3f71661 docs: address Q195 editor design review findings 2026-10-22 13:10:26 -05:00
jason.woltje cde0cd0832 docs: Q195 writing editor design and Q196 options 2026-10-22 13:10:26 -05:00
jason.woltje 100f018af3 gosalyn: row 229 design round 2 for Webby webby-0148: the settings.json allowlist is three keys a fresh /login writes, written in Mosaic code with httpProxy and the path and command keys refused by name and a sha256 bump test on pi's setter names, models-store.json and keybindings.json now refuse, auth.json.lock is the only allowed dir, pi-login runs --offline and --no-session in an empty temporary cwd with a 229b allowlist test, the contents check runs before preflight, and creativeHumanOnly covers the fallback (R1, R2, N1-N5) 2026-10-22 13:10:26 -05:00
jason.woltje 4a8215e3a1 gosalyn: row 229 design draft 1 after mos-1306: Chet's route has no fallback by default with a human-only fallback still possible through routes, and the dates note records that the live check gates every build row, not the design 2026-10-22 13:10:26 -05:00
jason.woltje 669e680368 gosalyn: row 229 design draft 1, a per-instance pi agent dir for Chet's Codex login: the host-made 0700 store per instance, a same-path rw bind with PI_CODING_AGENT_DIR through the pi module env, a contents allowlist since pi reads models.json and settings.json there, a refusal for roles with bash, a no-refresh auth check preflight, no fallback for Chet, a fresh-grant mosaic pi-login, the live check that gates the build, and rows 229a and 229b (#428, #1730) 2026-10-22 13:10:26 -05:00
jason.woltje c06ccc9ba4 gosalyn: Case 2 C2-03b round 3 for Webby webby-0156 R4: the fetch fallback reads the append-only events table for any GRANT_EVIDENCE event with method gitea and agent the chief, never gitea_grants, whose row a revoke and a grant-lost delete. It names no project, since grant.applied and grant.revoked carry none, so a chief grant on any project ends the fallback and fails safe. The revoked and fired tests go through grants.revoke and instance.fire and assert the row is gone before the fetch 2026-10-22 13:10:26 -05:00
jason.woltje 136e5c1ca3 gosalyn: Case 2 Q226 row briefs with Webby's round webby-0151, Mos's mos-1320 and Sage's sage-2833 folded in. C2-06 rewritten and taking in C2-07: an unreadable business file resolves requireCitation to true (R2), a send over 64 KiB gets the one retry and then a fourth fixed text (R1). C2-03b falls back to slot library-gitea only while no chief grant record has ever existed and refuses library-fetch-no-grant after (R3), with library-human-missing for her save and revert. C2-02 after C2-05c, revert and save by her editor (N1). C2-21 cites mos-1320 item 2 and keeps the host-creative-role refusals, and records two Gitea facts that don't gate it (N4, item 5). C2-08b names what the chief's credential needs (N5). C2-05b restored to the brief row 224 built, which lands as built, and new row C2-05c carries the supporting scope and blob. A PRD row brief for REQ-LIB-6 (mos-1320 item 8). New briefs C2-01d, 05c, 08b, 03b, 21, 02, 11b and 12b 2026-10-22 13:10:26 -05:00
jason.woltje cf17ab387b gosalyn: C2-06 brief Q222 round 2 for Webby webby-0144: M11 compares against the on-disk human and replyLimits on document and written and refuses agent actor shapes, an unreadable business file checks at the defaults, keys read by Object.hasOwn and Number.isInteger, the verb refuses unknown keys, the new tests, the residual line, cites at aca16404c, and the hold moves to Q30 (mos-1305, design f164dcef8) 2026-10-22 13:10:26 -05:00
jason.woltje 09948da187 gosalyn: C2-06 brief makes every M5 limit a replyLimits setting with Q219's numbers as defaults, the human's library.limits.set and mosaic limits replies, the M11 writer check, read at check time with per-key fallback to the default, the setup sheet's settings line, the settings and M11 tests, After C2-04, and the build held for Q29 (Q222, mos-1302, design df29550c9) 2026-10-22 13:10:26 -05:00
jason.woltje 35615b01b7 gosalyn: C2-06 brief cites the setup sheet's reply limits paragraph at :115-118 (webby-0140 N4) 2026-10-22 13:10:26 -05:00
jason.woltje 3f1f4e44fa gosalyn: C2-06 brief owns the setup sheet's reply limits paragraph, which says 3 ideas of up to 120 characters and drops the lower-limits offer, and the tests paragraph is rewrapped (webby-0139 N1, N2, Q219) 2026-10-22 13:10:26 -05:00
jason.woltje 65b8c8a9bd gosalyn: C2-06 brief takes Jason's idea caps, 3 items of 120 characters per reply, tested one past each boundary, and the idea-text residual line reads 360 characters closed in Q219 (mos-1299, design 2852348d2) 2026-10-22 13:10:26 -05:00
jason.woltje 271cef205c gosalyn: Case 2 design round 3 for Webby webby-0156 R4: the fetch fallback reads GRANT_EVIDENCE events with method gitea and agent the chief in the append-only events table, never gitea_grants, and names no project, so it survives a revoke, a grant-lost and a fire and fails safe. The ruling paragraph, 7.2 and section 10 steps 4 and 4b say so, cited at aca16404c 2026-10-22 13:10:26 -05:00
jason.woltje 3e5db651b7 gosalyn: Case 2 design ruling after r11, agents never write story (Q223, Q226, mos-1309), with Webby's round webby-0151 and Mos's mos-1320 folded in. Supporting prefix lists agents may write .md files under through library.doc.write and library.doc.delete, fenced by M12 supportingPath, plumbing commits pushed fast-forward only with a Mosaic-Agent trailer, a notice and a human revert authored by her editor on slot library-human. Chat is free text with optional citations, replyLimits keys requireCitation and citationsPerReply, and an unreadable business file resolves requireCitation to true (R2). A send over 64 KiB gets the one retry and then a fixed text (R1). The fetch falls back to slot library-gitea only while no chief grant record has ever existed, and Jason deletes the slot once status shows the chief's grant (R3). A missing editor or slot refuses before any git call (N1), runner and tools cites fixed at aca16404c (N2, N3), two record-only Gitea facts at C2-21 (N4, mos-1320 item 5), mos-1163 narrowed to gitea library projects (mos-1320 item 2), M3 at eight or ten (mos-1320 item 4). C2-05b is row 224 as built and C2-05c carries the supporting scope and blob (sage-2833). New rows C2-01d, C2-05c, C2-08b, C2-12b and C2-21 2026-10-22 13:10:26 -05:00
jason.woltje e1c9c09935 gosalyn: Case 2 Q222 round 2 for Webby webby-0144: the M11 fence compares against the on-disk human and refuses agent actor shapes, checks document and written as M9 does, a failed business file read checks at the defaults and never skips, the fallback reads keys by Object.hasOwn and Number.isInteger with booleans, arrays and objects named, the verb refuses unknown keys, the ceilings residual line, and cites at aca16404c (R1-R3, N1-N3, N5, N6) 2026-10-22 13:10:26 -05:00
jason.woltje aaaf45576a gosalyn: Case 2 design ruling after r11, reply limits are settings: every M5 limit is a replyLimits key in the business file with Q219's numbers as defaults, changed only by the human's library.limits.set and fenced in organizationWriter.write as M11, read at check time, with a missing or invalid value using its default. C2-06 carries it and waits on Q29 (Q222, mos-1302) 2026-10-22 13:10:26 -05:00
jason.woltje cf6abca9c0 gosalyn: Case 2 design ruling after r11, idea items capped at 3 of 120 characters: M5, the B5 note, the 5.1 residual (now 360 characters per reply) and 10 step 8 closed by Jason; the rest of M5 unchanged, C2-06 builds and tests the new boundaries (Q219, mos-1299, Vikunja 465, ludwig-0014 Q4) 2026-10-22 13:10:26 -05:00
jason.woltje 3410df7c3b morgana: row 275 r3 (duckworth-0166): B1 bob asks create only, open and send on alice's own thread; N1 thread B holds a message and the viewer read asserts its id 2026-10-22 12:46:09 -05:00
jason.woltje 1e3db53436 morgana: row 275 r2 (mos-1311): downgraded viewer keeps send and open refusals with nothing stored in the R3 test; BUILD.md lists each changed assertion, old and new, with design 4.3 lines 2026-10-22 12:46:09 -05:00
jason.woltje 4dd85c6716 morgana: row 275 (193b1b, #1780): viewer verbs and board refusals. VIEWER_VERBS at any grant level, collaborator for thread.create/open/send per verb, BOARD_VERBS exported and refused to users, user-side governance pin, mutants 6 and 10; FED R3 viewer-refused assertions reversed per design 4.3 2026-10-22 12:46:09 -05:00
jason.woltje 48e450ce8f docs(row253): pin mos1298 session assertion candidate 2026-10-22 10:53:50 -05:00
jason.woltje 14e4600617 test(row253): assert direct query PID equals SID (mos-1298) 2026-10-22 10:53:16 -05:00
jason.woltje a6c71e6d99 docs(row253): preserve fresh gate stop at M38 survivor 2026-10-22 10:49:46 -05:00
jason.woltje e1bc766d87 docs(row253): pin mos1297 fixture repair for review 2026-10-22 10:34:06 -05:00
jason.woltje 362ec674c9 test(row253): expose peer failures and pin reasons (mos-1297)
The peer-output fixture execs isolated system Python to write its exact bytes
and exit with peer-status. This avoids masking parser/status faults behind the
supervisor session check. All17 faults assert an exact reason with a delimiter;
every existing assertion remains. No product change or timing delay.

Old packages/cli/tests/case1-accept.test.mjs💯
const PYTHON_STUB = `[ -f "$HC/peer-output" ] && { cat "$HC/peer-output"; exit "$(cat "$HC/peer-status")"; }

Diagnostic under sage-2752 found probe-inner-session for malformed output and
nonzero exit. Mos confirmed the fixture mask and authorized this repair.
No tests ran after the repair; Duckworth review and fresh whole gate follow.
2026-10-22 10:32:29 -05:00
jason.woltje f5ef1c33a3 docs(row253): preserve single P10 diagnostic and reason mismatches 2026-10-22 10:27:24 -05:00
jason.woltje 2bef9124c4 docs(row253): preserve M21 survivor stop and static call trace 2026-10-22 10:10:42 -05:00
jason.woltje 34401e7c90 docs(row253): record green 27-file run and measured timeout basis 2026-10-22 09:46:35 -05:00
jason.woltje 0604d91fcf docs(row253): pin final aca1 integration and focused file bounds 2026-10-22 09:28:15 -05:00
jason.woltje ed3bb376cd docs(row253): preserve doc sweep appends on corrected interim base 2026-10-22 09:26:31 -05:00
jason.woltje cd269e7337 docs(row253): record schema3l integration before final base correction 2026-10-22 09:26:31 -05:00
jason.woltje e75ef1b19f docs(row253): integrate 385a base and record dependency drift and bounds 2026-10-22 09:26:31 -05:00
jason.woltje 72b17562d9 docs(row253): integrate row191 base and refresh manifest 2026-10-22 09:26:31 -05:00
jason.woltje ad67d95955 docs(row253): record integration onto refactor 378a76b85 2026-10-22 09:26:31 -05:00
jason.woltje 3b142c9c69 docs(row253): record static approval and pre-confirmation residual 2026-10-22 09:26:31 -05:00
jason.woltje 950cf47f3e fix(row253): bound cleanup retries after initial inventory 2026-10-22 09:26:31 -05:00
jason.woltje cca9367168 fix(row253): supervise socket queries across sudo sessions 2026-10-22 09:26:31 -05:00
jason.woltje c8cca3a688 docs(row253): store repair patch without context whitespace 2026-10-22 09:26:31 -05:00
jason.woltje 62de848820 docs(row253): freeze C4 repair for static review 2026-10-22 09:26:31 -05:00
jason.woltje 6f320b4b0c docs: propose row253 C4 session supervisor and draft hop fake 2026-10-22 09:26:31 -05:00
jason.woltje 643d16528b test: prepare row253 socket fixtures and fix gate collisions 2026-10-22 09:26:31 -05:00
jason.woltje 730a78aa91 gander: design tester socket migration for host scripts 2026-10-22 09:26:31 -05:00
jason.woltje aca16404cf queue: revs 3195-3216. Rows 278, 281 and 264a reviews, notes and done moves (sage, gizmoduck, megavolt, gander, webby, dewey, duckworth); row 264 round 1 request posted as jarvis (sage-2693, #1769) 2026-10-22 09:25:48 -05:00
jason.woltje f7e4ec3df5 row 264a (#1769): BUILD.md records the r13 gate on 2cc34aef8 (phases 1-3 green, M2 thrown at the trigger) and the r13p4 rerun at 84f53540d (M1-M4 killed on assertions, M2's four edits and kill rule), and the limits row gets the measured probe time; doc only (mos-1280 item 1, sage-2701) 2026-10-22 09:23:39 -05:00
jason.woltje b789188504 docs: row 264a landing sweep. BUILD-LOG gets Rocko's V502 rerun line and Sage's V502, rows 278/281 and row 264a landing lines; SESSIONS gets Dewey's, Rocko's and Sage's lines; DEFERRED moves the fire-keeps-grants gap to Done (row 281) and opens row 281 N1/N2 and row 264a N1 (actor_run, binds row 269) and N2 (esbuild skip) (sage-2695, #1769) 2026-10-22 09:22:05 -05:00
jason.woltje 84f53540dd row 264a r13 (#1769): BUILD.md writes M2's four edits before phase 4 reruns: the receive filter, delivery_same_session dropped from 3k-3l.sql and schema.sql, and store.mjs's SCHEMA_SHA256 set to the mutated schema; a kill counts only as a receive-test assertion; doc only (mos-1279, sage-2688, sage-2690, duckworth-0143, duckworth-0144) 2026-10-22 09:08:25 -05:00
jason.woltje 2cc34aef87 row 264a r13 (#1769): threads.test :341 takes the 3l trigger's text, 'only to its session's holder' (delivery_same_session, 3k-3l.sql:153); BUILD.md raises the stack-release limit to 1800 s from the survey's 575 s and records the r10 and r11 reds and the r12 survey with M1 in Runs; test only (mos-1278, sage-2682) 2026-10-22 08:36:56 -05:00
jason.woltje 93f4af12bc row 264a r12 (#1769): sessions.test T2's refused() keeps every table but events equal and pins one action.refused {code: not-holder} event per refused call in call order; the old every-table check could never pass since request()'s catch (broker.mjs:4242) writes the refusal through #refused; BUILD.md records Mos's reading of sage-2257; test only (mos-1277, sage-2676) 2026-10-22 08:21:41 -05:00
jason.woltje 75f049ed23 row 264a r11 (#1769): later3l in account-, gitea- and grant-migration names threads_id_not_session, the 3l trigger on threads (3k-3l.sql:104) the sqlite_master compares missed; test only (mos-1276 option A, sage-2672) 2026-10-22 08:14:15 -05:00
jason.woltje 54f65f9abd row 264a r10 (#1769): rebase on landed 281 (e479521d3), all 16 =; broker.mjs overlap read; cli limit 1800 s from 281's 591 s run (sage-2665, sage-2668, sage-2647) 2026-10-22 08:08:28 -05:00
jason.woltje 7451878b66 row 264a r9 (#1769): rebase on landed 278 (385a7194c), all 15 =; webui read check; run limits at 3x the longest recorded run (sage-2647, mos-1275) 2026-10-22 08:07:43 -05:00
jason.woltje 16889a46be row 264a r8 (#1769): build notes correction for the r7 red (account-migration, sqlite_sequence rows from the 3k-3l inserts), the whole-snapshot audit of every migrating test, the r7 run in Runs (sage-2621, duckworth-0129) 2026-10-22 08:07:43 -05:00
jason.woltje c3f43960eb row 264a r8 (#1769): the six migration tests that compare a whole store with sqlite_sequence after the 3k-3l step leave out the sessions and session_defaults sequence rows and assert them exactly, so any other new row still fails; usage-migration reads sqlite_sequence by name (sage-2621, duckworth-0129); unrun 2026-10-22 08:07:43 -05:00
jason.woltje 0431778465 row 264a r7 (#1769): build notes for the rebase onto landed 277 (980cec88c, sage-2608) and the per-session thread.claims; DEFERRED entry binds row 272 to make 274's user reply check session-scoped (sage-2591) 2026-10-22 08:07:43 -05:00
jason.woltje f3e9b6512c row 264a r7 (#1769): thread.claims reads each session's latest claim, so a thread with two held sessions lists both (sage-2591, duckworth-0124 C4); thread-claims.test threads get their default session and its T5 message names it (C5), T6 two held sessions; unrun 2026-10-22 08:07:43 -05:00
jason.woltje b7a05482bb row 264a r6 (#1769): build notes for the rebase onto landed 274 (0165be266, sage-2588): the four user-principal conflicts, users stay at the ruled seven verbs, and why 274's thread-scoped reply check needs no session clause yet 2026-10-22 08:07:43 -05:00
jason.woltje 4beb6433a4 row 264a r5 (#1769): build notes correction, rounds 1-4 never parsed three test files and no run claimed them; the round 5 gate runs every touched suite (sage-2581) 2026-10-22 08:07:43 -05:00
jason.woltje fbfaab3655 row 264a r5 (#1769): build notes for the rebase onto landed 236 (47a35bf43, sage-2579): the 194 conflicts, message-filter.test as the 19th test file, and the escaped quotes in three DEFAULT_SESSION blocks 2026-10-22 08:07:43 -05:00
jason.woltje 9ff668550f row 264a r5 (#1769): build notes name the op rename to legacy-3l and migration-3l by the step's target version (sage-2415) 2026-10-22 08:07:43 -05:00
jason.woltje 5baaaa447b row 264a r5 (#1769): build notes for the 3k-3l step on row 236 (8f51900b5, sage-2412): the renames, the merged pins and lists, gitea-migration reading both steps, and the in-memory dry run on 236's schema; README op value legacy-3l 2026-10-22 08:07:43 -05:00
jason.woltje c4a12de3d8 row 264a r3 (#1769): build notes say the generation fence is equivalent to the holder_run check it replaced, and M1 shows the refusal is tested (duckworth-0108, sage-2270) 2026-10-22 08:07:43 -05:00
jason.woltje 72fc5a330b row 264a r2 (#1769): generation fence for thread runs, a retired generation's approval, delivery and read refuse and write nothing (sage-2257); #route refuses an unknown session, README default-op note, Row 155 comment reworded, mutants M1-M3 in the build notes (duckworth-0107) 2026-10-22 08:07:43 -05:00
jason.woltje d6301dffce row 264a (#1769, T1 item 7): bus schema 3k to 3l, sessions below a thread
sessions and session_defaults are new and append-only. thread_claims, message_threads and
thread_opens are rebuilt in place with a session column, and thread_claims gains a generation
counted from claim rows. Each existing thread gets a default session with the thread's id; new
threads get a random one. Holder, per-run, release and delivery triggers key on the session,
and two id triggers keep session and thread ids apart (Duckworth checks 1-7, duckworth-0106).

The broker binds a thread run to a session (the default when the record names none), and
thread.open, thread.send and thread.messages take an optional session. New verbs session.list
and session.create (idempotent on op). Tests: sessions.test.mjs for T1 bus half, T2 and T7 with
a pinned 3k fixture; count, version and verb pins; hand-made test threads write the legacy
default session.

Built on row 236 (8f51900b5), which takes 3j-3k, so this step is 3k-3l by landing order
(row264 Q2, sage-2412). The op values are legacy-3l and migration-3l. gitea-migration.test reads
its store after both steps. Not run yet: every run waits for Sage's CLEAR.
2026-10-22 08:07:43 -05:00
jason.woltje ae525c4095 gizmoduck: row 264a bus design in the build notes: sessions and session_defaults, thread_claims, message_threads and thread_opens rebuilt with a session (legacy default id = thread id), generation, broker lookups by session, verbs, tests and pinned lists 2026-10-22 08:07:43 -05:00
jason.woltje b5630ca198 gizmoduck: row 264 build notes record Sage's Q1-Q7 rulings (sage-2235, 5f5b51dd6) 2026-10-22 08:07:43 -05:00
jason.woltje 26380e3f0b gizmoduck: row 264 phase A build notes, code at da9555ca2, consumer audit first pass, five proposed slices and Q1-Q7 to Sage (sage-2233, #1769, Vikunja 463) 2026-10-22 08:07:43 -05:00
jason.woltje e479521d3a row 281 build notes: the manifest-round slot on 7979fb41e is green; Runs has the base, anchors, M1 exit check, dewey-0840 files, bus/business/cli whole and the shells with their limits and named skips; Mutants has M1-M22, 22 killed, M22 fails only T14 (sage-2661, dewey-0845, #1786) 2026-10-22 08:00:45 -05:00
jason.woltje 7979fb41eb row 281 build notes: the gate plan for row281-e, with each scripts/test-*.sh under a limit of at least 3x its longest recorded run (sage-2649, dewey-0840, mos-1275, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 54ebc5d71c row 281 b5: T14 pins that the human's no takes a declined host decision out of the set, after hosts.remove left it with no host (N1); M22 drops the closed check and T14 kills it; test only, not yet run (sage-2653, dewey-0844, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 5e05e21794 row 281 build notes: the mutant table names section 9's killing test and each mutant's failing tests from its log; every mutant fails its named test (dewey-0841, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 6b6eb533e8 row 281 b4: T6b pins step 0's four Gitea reads in order and says 'before any Gitea write'; M1-M21 all killed on b4a 3f29375a8 with the M1 exit check, table in the build notes (dewey-0839, sage-2627, sage-2643, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje f9fcf5d7b3 row 281 b4a: the M1 hang was T6c's held web1:add loop, which only the fire's abort ends; setup's t.after clears held and failing, and T6c and T10 release their Gitea gate; test only, no code change (mos-1273, sage-2636, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje c055dddf44 row 281 b3: the first base run's five red tests were test faults, no code change; T4b reads the manual's revoke id from its event, T5b expects gitea-left:<id>,tokens (N10), T6b allows step 0's GET checks, gitea T8 leaves the call log out, cli T10 makes the 0700 store root; rebase onto 980cec88c noted (sage-2605, sage-2615, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 6d62ef04e0 row 281 build notes: rebase onto 46dedf925 after row 256, range-diff all =, 256's actor threading doesn't change what a delete calls (sage-2597, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 4982fa0adf row 281 b2: T1-T13 tests (fire-revokes-grants, lifecycle-revoke T1, T8 tester refusals, cli T10 pass) and the test choices in the build notes (#1786) 2026-10-22 07:42:10 -05:00
jason.woltje 7c2c876319 row 281 b1: step G in the broker (fire and delete jobs, the grant set, the lock, boot's interrupted check) and build notes (#1786) 2026-10-22 07:42:10 -05:00
jason.woltje 7d5f16ef95 row 281 build notes: Dewey's d6 approval with N7 (T12's step B cause survives step G) and N8 (no decision-consumed for a within-role fire) (dewey-0829, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje a7b4f6785c row 281 design d6: the job's step C without the chief's claim, fire.failed for a step B or C failure, boot closes interrupted jobs, Q1 lines in the set (dewey-0825, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 938378455d row 281 design d5: two requests per granted delete with its five conditions, a job id on every answer, event and message (sage-2575, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 5f4cd2faa6 row 281 design d4: step G detached from the verbs, open decisions and a fired-agent raise check, one step G per agent (dewey-0823, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 6faa0f1479 row 281 design d3: a grant decision approved before a fire and executed after it, tests T6/T6b/T6c (sage-2574, #1786) 2026-10-22 07:42:10 -05:00
jason.woltje 9867a6f322 row 281 design d2: Q1/Q2 rulings (sage-2573), the finding in the Why, T3b/T4b and M8/M9 (#1786) 2026-10-22 07:42:10 -05:00
jason.woltje 15ab01c0c3 row 281 design d1: a fire or a delete revokes the instance's host and Gitea grants (sage-2568, #1786) 2026-10-22 07:42:10 -05:00
700 changed files with 64553 additions and 889 deletions

No files matched your search

+70
View File
@@ -5303,6 +5303,14 @@ Before: managed project/thread verbs had no Console conversation area. After: fi
### 2026-10-22 | Gander | row278 gate run3
Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
2026-10-22 11:29:09 UTC | Rocko | V502 carry/rerun on980cec88c: source407c8d7be and packet04a86cf33 match approved8e3c6a79b/9bf4683c6 patch-ids, no conflicts. Dewey0834 carry conditioned on rerun, satisfied under sage2616: stop-run13,processingHTTP6,bustasks9 allgreen (Node28/28),Python4/4,0skips/timeouts. Manifest5758d699,source5/5restored,cwdsweep[]. Doc rerun packet6af85df4b explicitly pushed to rocko/vikunja502-980c-20261022; no live action.
2026-10-22 11:30:17 UTC | Sage | Vikunja 502 (row 191 follow-up, no queue row) LANDED 6af85df4b, a fast-forward from 980cec88c. Before: the processing failure diagnostics and cleanup in stop-run, processing HTTP and bus tasks tests were Dewey-approved on the pre-194 base only (8e3c6a79b/9bf4683c6). After: Rocko's picks 407c8d7be/04a86cf33 carry the same patch-ids (37135ebe/0dbcda54), plus a doc-only rerun record 6af85df4b. The rerun on the new base was green: stop-run 13/13, processing HTTP 6/6, bus tasks 9/9, Python 4/4, 0 skips. Dewey carried the approve (dewey-0836). mosaic-task.mjs is unchanged, so N7 (runs suite) didn't trigger. Overlap with in-review rows 13 and 257 was clean. LIVE is still 86f95bb27.
2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
### 2026-10-21 row253 implementation prepared, gate pending
@@ -5310,3 +5318,65 @@ Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-script socket migrations, fake fixtures, updated retirement docs and 33 unique change checks. Static syntax/diff and source inventory checks pass; behavioral tests have not run. Sage-2191 queues the requested full scope and will send CLEAR. No host, unit or live config changed.
2026-10-22 02:13:30 UTC | Gander row253 C4 committed candidate, gate pending | Sage-2335 explicitly directs committing runnable source and tests before the whole gate. The repair implements the approved after-uid supervisor with separate inner/outer bounds; the static packet is b64aa316a. Current repaired bytes have run no syntax check, test, probe or host experiment. Earlier static syntax results apply only to the old build. Results from 8a8df4171 are historical and do not carry. Duckworth static verdict and Sage CLEAR precede all gate execution. F5 is row276 / #1781 in DEFERRED.md.
2026-10-22 14:45 UTC | Gander row253 focused27 on finalaca16404c base | Fresh0604d91fc / manifest573c51cf:27 whole files604/0/0, no timeout/retry, case134/0 in99.281s, case243/0 in66.418s, stack-release includingT46221/0 in583.453s. N9 sandbox bind ran and passed, no focused skips. Seven source blobs unchanged; sweep0 run-created leftovers, pre-existing infrastructure receipts retained. Whole gate and M1-M40 await separate Sage CLEAR after Duckworth rebase check. No live action.
2026-10-22 14:46 UTC | Gander correction to the row253 focused27 entry immediately above | stack-release whole was218/0/0, not221/0. The27-file sum604/0/0 and duration583.453s are unchanged; raw files/results.json and SUMMARY.json give the exact per-file totals.
2026-10-21T16:04:23Z | Q195/Q196 writing editor design, #1752 / Vikunja #448 | Before: row 154 edits Markdown in a separate Docs view, with no selected-word thesaurus or document pins. After: design draft on gyro/editor-design compares three editor approaches, records WordNet source/license/size, folds the pane/pin model and specifies guarded context/proposal APIs, DesignCraft handoff and seven proposed briefs. Q196 changes the basis to a Word-like interface. Verification so far: editor/provenance checks 10 pass, 1 explicit rebuild skip (pinned esbuild absent); brief fields, unique headings and 11-line checklist checked. Product, queue and live state unchanged. WordCraft scratch evaluation is being incorporated before publication. Review and Jason choices remain open.
2026-10-21T16:22:36Z | Q195/Q196 design verification, #1752 / Vikunja #448 | Folded Fenton 7caf8008b and Louie 880ef19e0. Recommend bounded O3: Word-like DOM editor plus isolated headless DOCX export, with explicit feature cut and semantic loss checks. WordCraft web 44,179,239 bytes, identical twice; measured comment/footnote conversion limits recorded. Seven briefs and 12-line checklist validated. Fresh editor/provenance: 10 pass, 0 fail, 1 explicit rebuild skip (esbuild 0.28.2 absent). CI queue guard identity gyro/purpose push returned documented degraded-pass (exit 0), CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no fallback or CI-green claim. Documentation-only candidate for Mos/Fenton review, no source, queue or live changes.
2026-10-22T16:06:34Z | Q195/Q196 design review fixes, #1752 / Vikunja #448, mos-1300 / fenton-0004 | Before: draft 105811400 had owner-only thread wording, stale source positions, two mismatched seat/model assignments, an assumed library save boundary and 12 owner questions. After: grant-aware pin validation and stale/revoked access redaction; references refreshed against aca16404c, including public/bus.js and README offsets; Sage assigns model-only seats; unimplemented library.file.save/C2-11b brief blocks book editing; tabs explicitly cover 62-76rem; J7 stricter context choice recorded; pronouns removed; six owner questions. Static docs/source-anchor checks only, no builds, product suites, MVP gate slot or live action. Fenton re-check pending; O3 and both companion folds retained.
2026-10-22T16:09:56Z | Della mos-1303 / Vikunja 460 Q217/Q222 revision | Before: Q1/Q2 open and Q3-Q7 phrased as Jason questions. After: Jason-created InMotion/woltje.com ingress recorded; per-source mailboxScope defaults none with human-only CLI then Console writer and named default/change/agent-refusal tests. Q3-Q7 settings/defaults/owners documented; no new external decision required for default development, conditional provider/spend/exposure list retained. PRD/grant/data.delete/live gates preserved. Docs only, no product suite or live operation. Earlier uncommitted append-only PRD review session receipts are preserved in this docs commit. Ludwig reviews before Sage landing.
2026-10-22T16:12:26Z | Della ludwig-0035 / mos-1303 / Vikunja 460 focused corrections | Verified REQ-WAIT-2/3 at db1e7732a: Jason approval is required to route mail.access out of hard waits. Restored explicit Jason-approved PRD gate; no Q211 waiver inferred. Named tunable parser/attachment settings, defaults and schema/test review ownership of resource bounds; E04 checks changed values and bound refusals. Clarified Q8 extraction stays Jason choice. Docs-only checks, no product/live action; focused review before Sage handoff.
2026-10-22 13:06 UTC | Megavolt | Row 281 (#1786) build. Before: a fire or delete left host_grants/gitea_grants rows, the host line and the Gitea token live. After: step G in broker.mjs revokes them in a detached job per agent (the host line first, then Gitea local-first with an admin preflight); a refusal is grant.revoke.refused plus a human message; open grant decisions are in the set; a raise for a fired agent refuses instance-fired. Tests T1-T14 (bus fire-revokes-grants, lifecycle-revoke, grant-executor, gitea-grant; cli lifecycle). Gate on 7979fb41e: base 121/121 + 24/24, 29 anchors, M1 exit check rc1/17, M1-M22 22/22 killed, dewey-0840 files 76+14+23, bus 819, business 231, cli 837, ten shells rc 0 under the mos-1275 limits; skips: test-task row 244 live-provider pair, test-queue canonical-root check. Corrections: the first base run on c174f37ac went red on five first-run test defects (b3, test only); the first mutant run on 06ee5ed6b hung on M1 because T6c's held loop never ended (b4a fixed the teardown, and the runner now has timeout -k 10 180 and an exit check without --test-force-exit).
2026-10-22T16:36:30Z | Della row224 C2-05b #1725 preparation | Before: C2-05a queries exist at 4f3fbc25a but no broker lookup verbs or typed tools. Scope: broker/tools plus Sage-authorized runtime/bundle integration, tests and docs. Existing human-only library reads retained; five agent queries require a live holder and trusted configured source. Code/docs only under row253 gate; no Node/test/push/claim. Runtime ownership coordinated with Rocko219/Huey272.
2026-10-22T16:52:55Z | Rocko | Row219 prepared under sage2793/2807; explicit creative thread/default-session selection, narrow metadata route/picker U1–U5,22 static mutant sites; unrun while253 holds.
2026-10-22T17:42:16Z | Sage | Row 253 (#1758, Gander, Duckworth) LANDED 48e450ce8. Before: refactor at aca16404c; case-sudo calls had no supervised session check and the M21 survivor hid behind a fast-exit fixture (mos-1297). After: a fast-forward of 22 commits; manifest 591020a1 rechecked with 0 mismatches; run 5 whole gate green with M1-M40 killed, the M38 PID equals SID assertion added under mos-1298; Duckworth APPROVE rev 3252, note rev 3253, done rev 3254; #1758 comment 30701 and closed; P19 416 comment 719. N1 (fast child reported as exit 85) is DEFERRED as Vikunja 532.
2026-10-22T18:11:57Z | Sage | Row 275 (#1780, Morgana, Duckworth) LANDED 3410df7c3. Before: refactor at 48e450ce8; viewers had no verb list of their own and board reads were not refused to users. After: a fast-forward of 3 commits; manifest 39847b15 (4 paths) blobs match; gate 17:52:12Z-18:05:00Z green (whole files 7/22/6, bus 834, cli 861, harness 151, business 231, seat 167, 10 scripts with 3 named skips), M6 and M10 killed; Duckworth APPROVE rev 3260 (comment 30717); note and done by sage-2897; #1780 comment 30728 and closed. N1 (board refusal test as a loop over BOARD_VERBS) is non-blocking.
2026-10-22 18:11:58 UTC | Gander row276 #1781 prepared, gate pending | Before: row253 left5legacy Case1 AS_USER calls unsupervised across sudo pty sessions. After: candidate uses its unchanged supervisor with per-call inner/outer budgets, separate streams, strict display-only failure trailer, fake-only paired process-model cases and15unique mutants. Duckworth0182 B1 corrected the plan before product code;0183 cleared build. Parse-only Bash checks pass; no Node, behavioral test, host, unit or config action. Runtime gate and publication await Sage.
2026-10-22T22:51:32Z | Megavolt | Row 207 (193c, #1705): rebased onto 01983cd3f as 712f79c0a; gate green under sage-3041 (access.test 31/31, M1-M8 killed on named tests, cli 894/894, ten scripts under mos-1275 limits). Correction: the first run's kill check grepped TAP "not ok" against node's spec output and was stopped and rerun. Runs note in 9bb406c6c.
2026-10-22T22:51:32Z | Sage | Row 207 (#1705, Megavolt, Duckworth) LANDED c4f77373f. Before: refactor at f0e3dcdf4; mosaic access had no user verbs. After: fast-forward of 4 commits, a cherry-pick of the gated 01983cd3f..9bb406c6c (range-diff 4/4 equal, patch-ids equal, the 4 manifest blobs equal; the base moved only by the #1797 brief, which no test reads; no open branch touches the manifest). Duckworth APPROVE c30849 rev 3356; done rev after the note. N1 (any-business refusal untested) DEFERRED. No live change. Correction: my first 207 review request ran under timeout 120, which killed it while it wrote the outcome; the comment (c30841) had posted, so I removed the dead lock and resolved it at rev 3350.
2026-10-22T23:03:39Z | Gyro Q195 O2 rewrite, #1752 / Vikunja #448, mos-1356 | Before: landed O3 design 95e3f7166/blob 4cb59999. After: Q231/Q233 full WordCraft O2 design on gyro/editor-o2 from refactor c4f77373f; canonical git DOCX, original Markdown/wiki preservation, human cadence default 0 with instant accepted-save commits, full rich-feature first slice. Ten briefs include independent source/dependency security clearance before any build queue entry, exact editor-only CSP approval gate, restricted source/build/bridge, separate reviewed DOCX citation gate and flags-only agent access. Existing Case 2 semantics unchanged; any integration requirement change goes through Mos to Jason. Static checks: ten briefs/seven fields, independent reviewers, unique anchors, current source/base/blob pins, docs scope and append-only logs pass. No builds, browser/worker runs, code, queue or live changes. Fenton review pending; CSP and implementation gates remain closed.
2026-10-22T23:03:53Z | Gyro Q195 O2 push guard | CI queue guard identity gyro / purpose push returned exit 0, documented degraded-pass: CANNOT_ASSERT credential-unresolvable. Audit: /mnt/storage/scratch/gyro-q195-ci-queue-audit.jsonl. No credential fallback or CI-green claim.
2026-10-22T23:09:38Z | Gyro Q195 O2 fenton-0006 fixes | Before: e012bab0b left stale-source ambiguity, incomplete migration/shipping ownership, undefined typing transactions and an unmeasured CSP gate. After: D12 explicitly routes superseded-source/C2 reply notices to Mos/Jason and refuses adoption before W4b/notice path; Q2 remains open. F2-F6 add schema-edge placeholders and restore-accounting files, shipped runtime data/writing closure with no sandbox store mount, per-chapter DOCX and 2s-pause/15s-span save groups, volume/latency/growth gates, split-run clickable wikilinks and historical Obsidian graph warning, and S0 isolated existing-artifact CSP measurement before exact-header approval. Static ten-brief/ownership/settings/checklist checks pass. No build/browser run, product/queue/live change. Independent re-check pending.
2026-10-22T23:09:50Z | Gyro fenton-0006 push guard | identity gyro, purpose push, exit 0 documented degraded-pass CANNOT_ASSERT credential-unresolvable; audit gyro-q195-ci-queue-audit.jsonl. No fallback credentials or CI-green claim.
2026-10-22T23:10:14Z | Gyro mos-1358 ruling recorded | Q36 / Vikunja 562 keeps C2 superseded notices OPEN with Jason. Markdown adoption refusal until W4b PASS is now a separate settled Mos build-order ruling, not a Jason question. D12 and Q2 distinguish them; no notice build authorized.
2026-10-22T23:13:27Z | Gyro Q195 O2 fenton-0007 F7/F8 | Named human-only editor.saveGroupPauseMs=2000 and editor.saveGroupMaxMs=15000 with integer/range/cross-field validation and W3a UI/CLI refusal tests. W3b owns production adoption refusal until W4b; isolated fixture conversion remains testable without request-flag bypass. W4b owns adoption module/API tests and reviewed lifting only with committed-reader/citation readiness and, if Q36 approves, the separate notice row PASS. Q36 unresolved stays closed. Static ten-brief, setting-key/bounds, refusal/lift ownership and two-question checks pass. Docs only; no build, browser/worker run, product/queue/live change. Fenton checks F7/F8 on next push.
2026-10-22T23:13:48Z | Gyro mos-1359 / r3 push guard | D13 records save-group timing as Mos's accepted reading of Q226 F41, not Jason's ruling; both defaults remain human-only settings. Push guard identity gyro/purpose push: exit 0 documented degraded-pass, CANNOT_ASSERT credential-unresolvable; audit gyro-q195-ci-queue-audit.jsonl, no credential fallback or CI-green claim.
2026-10-22T23:23:42Z | Rocko, W4 #1799 | Before, D24-D26 had no separate exact DOCX citation/access contract. After, 15e91538f proposed a versioned schema, parser/story/view/refusal rules, live authorization/sharing and generic/git/session bypass closure, compatibility gates and 22 acceptance rows. Two JSON examples parse, diff check clean; no code or implementation acceptance. Megavolt review pending.
2026-10-22T23:55:11Z | Sage, W4 #1799 docs landing | Megavolt reviewed four rounds (CHANGES 15e91538f, 019a0ea5b, 54246cb32; APPROVE 994c3f7fb, #1799 c30868/c30870/c30876/c30884). Landed here as cherry-picks: docs/plans/2026-10-22_q195-docx-citations.md blob 2af460ab7 and docs/reviews/2026-10-22_q195-docx-citations.md blob bedde1716, both new files. 32 acceptance rows go to W4b; R4-N1 (re-migration after a pre-W4b restore keeps the rotated fence and needs owner confirmation) goes into W4b's brief and A32. W4 is design-approved only: its gate still needs Sage's W4b implementation brief, which waits for S0 (#1798) PASS. Q36 open, adoption closed. Docs only, no test reads these files.
2026-10-23T00:52:58Z | Gyro Q235-Q237 policy rewrite started, Vikunja 571, mos-1366/1367 | Before: approved O2 e36bce352 keeps Markdown originals at their paths and Q36 notices open; landed W4 2af460ab7 has the same boundary. Imported that byte-identical W4 baseline as 1ac76a417, from refactor 062646487, to make the policy-only revision diff explicit. Prepared P1-P6/B1-B4: human one-way per-story import, human-set source-repo archive, DOCX current reader, scoped format map/archived non-canon reads, W7 conversion publication after W4b/approved PRD/10-27 and Jason first-real-book go. Q234 exact CSP, mos-1363 and S0 M1-M14 retained. W4 locator/extractor, shares and restore-fence blocks compare byte-identical to the approved baseline. Scope/source review ongoing; Mos impact map must be folded before Fenton handoff. No build/browser/worker run, code, queue, private-book or live action.
2026-10-23T01:37:07Z | Gyro Vikunja571 final impact-map / mos-1372/1375 fold | Prepared parent/W4 rewrite against brain-redux d183246 impact map at stack 062646487. P1-P6/B1-B4 and engineering Q1-Q16 are mapped to eleven briefs. D9 replaces the earlier private O2-only context/per-document/share model: normal Case 2 access in any authorized thread/room, supporting writes intact, changed policy awaits PRD 1.17 approval. New DOCX story creation has the same opening gate as human per-story import. Host-only push to human-set off-host remote replaces the no-remote ban; remoteURL defaults unset and same-host bare is disallowed. W7 gates on Hermes #423 step5, W4b, PRD approval, post-10-27 and first-real-book go; owns conversion events COUNTED/--events/pre-conversion restore reconciliation, manifest order/next_chapter, creative role cite wording, archive/old-path edits and format/link/citation routing. Store+off-host acknowledgment precedes archive commit/push, then catalogue publication; post-push failures remain resumable pending with pinned source. Current checks pass: complete brief fields, policy/map coverage, exact Q234 CSP, locator/projection mechanics byte-equivalent except explicit authority wording, A01-A35 IDs, immutable map pin, four-doc scope and append-only logs. W4 authority/remote/recovery sections reopened for Fenton; older APPROVE not reused. No product/build/browser/worker/private-book/queue/live action. Earlier entry describing preserved shares/fence applies only to the pre-D9 intermediate draft; D9 now withdraws those unimplemented structures.
2026-10-23T01:37:55Z | Gyro 571 push guard | identity gyro/purpose push: exit 0 documented degraded-pass CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no credential fallback or CI-green claim.
2026-10-23T01:41:59Z | Gyro sage-3121 A1-A3 PRD alignment | Before: 8d209016b adds a current Connections graph, excludes new Markdown stories in converted books and defaults archiveFolder. After: parent/W4 align with PRD1.17 d6 sha256 886b93c571f87bfbb2f27ee3113b6800a32d8f89196d95ace33566031bee380a: clickable editor links only; graph/tests later pending J-b; new different-path Markdown in a converted book remains canon until import, only recreated converted old paths are unmapped; archive folder is human-set in library mapping with no default, missing folder refuses conversion. Static A1-A3/11-brief checks pass; W4 locator/extractor/access/remote/recovery blocks unchanged. Local commit only, push held for Sage's named gap while Gizmoduck holds 270+271 run5. No product/build/browser/worker/queue/live action. Fenton gets local SHA through shared object store.
2026-10-23T01:49:08Z | Gyro fenton-0012 B1/B2 and N1-N6, mos-1379 | B1: off-host remote must deny the real shared jason.woltje seat-helper credential as well as seat identities until #431; private visibility/dummy-token denial is insufficient; W3b/A16/A26 require that future fixture proof. B2 follows mos-1379: human-only editor.agentReadComments and editor.agentReadTrackedDeletions both default false, comment/original/markup reads/resolves/index/context refuse when off; final access remains D9 and no role allowlist/per-document grant. N1 staging-ref allowlist and retained private refused/published audit refs; N2 URLs literal with fidelity-report loss and confirmation; N3 future paths marked new or predecessor row; N4 rename/sharing wording fixed; N5 historical thread text not refreshed; N6 protected VM1012 backup cited in P5. Static checks pass, locator JSON/package/projection mechanics retained. Local commit only; HTTPS push still held for Sage's named gap. No credentials tested/read/printed, no product/build/browser/worker/queue/live action. Fenton gets exact local SHA/blobs.
2026-10-23T01:53:25Z | Gyro fenton-0013 N7 mixed-format chapter order | Fenton approved local 0f4fa4f93. D10 now explicitly orders every chapter ID regardless of Markdown/DOCX format, inserts new canon Markdown by row216 or human committed order, and preserves ID/position at import. W7 tests cover mixed traversal/insertion/import stability. Static diff/append-only checks and docs hook pass. Local commit only, narrow re-check requested, HTTPS push still held for Sage gap. No runtime, queue or live change.
2026-10-23T02:21:06Z | Sage, rows 270+271 landing, 571 landing, MVP rows | Before: 270 (#1775) and 271 (#1776) were approved on gizmoduck/row270-271-r4 49cee846e and 2b964a082 after combined gate C2 run 5 GREEN on 53406f3e4 (bus 873, seat 202, cli 905, ten scripts, 38/38 mutants). After: 33 commits cherry-picked onto 767bb62c7 as 7328da8ca, range-diff all "=", 40 paths identical to the candidate; 270 manifest f4174458 matches, 271 manifest 3ab1f5c8 matches on 29 paths, the other 4 moved under 270 and match its manifest. Done revs 3396/3398, #1775 c30962 and #1776 c30964 closed, P19 463 c861. 571 (Gyro, Fenton APPROVE) picked as ee5f7b9ef, 6345aae3d, 767bb62c7 (blobs 9382f85b, 7ec0897b), 1ac76a417 left out; N7 911dad2aa (Fenton-0014) picked after. Rows 293-299 added (574, FED R6, R4, R7, GitHub grant, Q228, 573), queue commit 253346e3c. Correction: the push sync step checked out O..S paths over the canonical worktree without testing for uncommitted edits, so any pending SESSIONS or BUILD-LOG line in the canonical checkout at 02:06Z would have been overwritten; the sync now skips edited paths. Schema 3n is not live (LIVE 0cbe2e9b3 at 3m).
+5
View File
@@ -27,6 +27,11 @@ not fleet seats. Keep changes in `/mnt/storage/src/mosaic-stack`; do not modify
| Gizmoduck | Federation design (#414) and builder of FED R1 | T3 session (Claude, Opus 5.5, thread 9312a896) | none, T3 only |
| Webby | Reviewer: Case 2 designs, rows 192 and 194 | T3 session (Claude, Opus 5.5, thread 03086006), started by Mos (mos-0981) | none, T3 only |
| Duckworth | Reviewer: federation designs, row 193 | T3 session (Claude, Opus 5.5, thread ffceafec), started by Mos (mos-0977) | none, T3 only |
| Della | Builder, email plan (Vikunja 460) and row 224 (C2-05b) | T3 session (Codex, gpt-6.1-sol, thread 66735a7f), started by Mos | none, T3 only |
| Scrooge | Builder of row 252 and reviewer of row 272 | T3 session (Claude, Opus 5.5, thread 629b6cd3), started by Mos | none, T3 only |
| Huey | Builder, row 272 (T1 sessions) | T3 session (Codex, gpt-6.1-sol, thread cabd45ca), started by Mos | none, T3 only |
| Louie | Builder and research, editor evaluation and row 174 | T3 session (Codex, gpt-6-luna, thread bfd13d49), started by Mos | none, T3 only |
| Ludwig | Builder and reviewer, post-v1 email PRD and row 258 (E01) | T3 session (Claude, Opus 5.5, thread 8615b2a6), started by Mos | none, T3 only |
| Sage | Project lead: coordination, review, integration; earlier DYOR strategy records retained | T3 session (Claude Code); Pi launcher `zai/glm-5.3:high` retained | `agents/sage/launch.sh` |
Each script supports `--check` and `--fresh`. Normal launches resume the agent's
+8
View File
@@ -0,0 +1,8 @@
# Della
Builder seat, Codex gpt-6.1-sol, started by Mos for the email plan (Vikunja 460). Owns row 224 (C2-05b) under Q220.
No launcher in this directory. The seat runs as a T3 thread (thread 66735a7f) and works in its own worktree. It has no
credentials of its own; it pushes only its own `della/*` branches through the repository credential helper (mos-0981),
never `refactor`, `main` or another seat's branch. Registered by Sage on 2026-10-22 so the queue can name the seat as
row owner under Q220 (mos-1301).
+93
View File
@@ -218,3 +218,96 @@ SHELL-LIMITS.json now includes fresh278 run3 receipts. Same ceil(3*longest)+120
| scripts/test-queue.sh | 23.443742 | 191 |
| scripts/test-release.sh | 12.168674 | 157 |
| scripts/test-task.sh | 36.783798 | 231 |
## Post264a integration, sage-2698, no runs
New gander/row253-264a rebases eleven commits onto84f53540d without conflicts; every pair and patch-id equals the385a branch. Rebased sourceb9d3d4c75c78aa6b06aefd734da781bef9b7f1da. Only DEFERRED absorbs upstream changes; seven-path manifest735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f. All runnable253 blobs unchanged. Store now loads schema3l and3k-3l migration from the landed base. integration-264a/ records the exact upstream drift and27 whole runnable test-file union (upstream-changed tests plus own focused files). Shared fixture is covered by importers. No carried result. Ask Sage for focused CLEAR, then publish after those whole files pass, then Duckworth rebase read, then whole gate on another CLEAR. N9 exact sandbox skip reason must be copied from the case2 log. No execution or push ran during integration.
## Corrected docs base, sage-2700/2702, no runs
New gander/row253-b789 rebases ontob78918850. Sourcec75c9bbd3339cb2343467715a14455044c2e4aea. Only append conflicts in BUILD-LOG and DEFERRED: current base remains exact byte prefix,253 entries appended. No old entry edited or removed. Manifest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. Five runnable blobs and README match preceding candidate; only DEFERRED hash changes.27-file whole union unchanged, no result carries. Hold branch local: final Gizmoduck docs tip must land first, then rebase/publish and focused CLEAR. No tests/Node/push. integration-b789/ records the resolution and hashes.
## Final base aca16404c, sage-2705, before execution
New gander/row253-aca1 rebases13 commits ontoaca16404c without conflicts; all13 final-hop pairs equal. Sourceed3bb376cdd5128dc58b3aa193282e1c2bfcf57d. Seven blobs unchanged, manifest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. Both append paths retain the full base prefix. Final upstream docs/queue changes touch no focused read.27-file union remains unchanged.
Step2 file bounds: every file listed in integration-aca1/FILE-LIMITS.json runs whole as timeout -k10 300 node --test --test-reporter=tap FILE, outer harness330s. Own case1/case2 first, then25 others. Busy check before each start, pipefail and tee, TMPDIR from mktemp-d /mnt/storage/scratch/tmp/gXXXXXX. First unexpected failure or timeout stops to Sage/Mos unplaced; no retry. Print HEAD and manifest digest first. No test has run. Expect10-15min; status at15min. Whole-suite limits are separate and will be written before whole-gate CLEAR.
Whole-shell limits remain as in the earlier table and SHELL-LIMITS.json:auth126,conductor145,config130,discord147,extension130,foundation240,land-work158,queue191,release157,task231. Each is at least3x its longest recorded successful whole run. No script changed.
## Focused27 green under sage-2709
Fresh candidate0604d91fc onaca16404c, manifest573c51cf. HEAD and digest are the first controller-log line, followed by the full900s CLI/300s bus-WebUI limit header before any test. Actual run14:30:03Z to2026-10-22T14:44:57Z, 894.0 wall seconds. All27 files whole604/0/0, timeout0, no retry or busy refusal. Commands use timeout-k10 per file, pipefail/tee and scratch gXXXXXX TMPDIR. No product/test/assertion changed. Entire seven-path manifest verifies after the run.
N9 did not skip. Verbatim case2 result: `ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds`. There are no skip lines in any focused file. Later wholeWebUI and shell skips are not measured by this focused scope.
Every measured file duration and its later3x basis follows. The last column is ceil(3*measured whole-file wall)+120, not a completed whole-gate result. Historical C4 gates carry nothing. The whole gate still awaits separate CLEAR and Duckworth rebase review.
# Focused27 whole-file results
| Whole file | Pass/fail/skip | Wall seconds | Command limit seconds | Next3x plus120 basis |
|---|---:|---:|---:|---:|
| packages/cli/tests/case1-accept.test.mjs | 34/0/0 | 99.281 | 900 | 418 |
| packages/cli/tests/case2-unit.test.mjs | 43/0/0 | 66.418 | 900 | 320 |
| packages/bus/tests/account-migration.test.mjs | 3/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/chief-of-staff.test.mjs | 42/0/0 | 2.168 | 300 | 127 |
| packages/bus/tests/comment-migration.test.mjs | 5/0/0 | 0.565 | 300 | 122 |
| packages/bus/tests/end-launch.test.mjs | 7/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/fire-revokes-grants.test.mjs | 22/0/0 | 3.271 | 300 | 130 |
| packages/bus/tests/gitea-grant.test.mjs | 49/0/0 | 8.634 | 300 | 146 |
| packages/bus/tests/gitea-migration.test.mjs | 5/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/grant-executor.test.mjs | 42/0/0 | 21.562 | 300 | 185 |
| packages/bus/tests/grant-migration.test.mjs | 6/0/0 | 0.465 | 300 | 122 |
| packages/bus/tests/lifecycle-revoke.test.mjs | 8/0/0 | 0.665 | 300 | 122 |
| packages/bus/tests/message-filter.test.mjs | 6/0/0 | 0.515 | 300 | 122 |
| packages/bus/tests/name-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/schema.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/sessions.test.mjs | 7/0/0 | 0.615 | 300 | 122 |
| packages/bus/tests/spec-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/tester-writes.test.mjs | 8/0/0 | 0.565 | 300 | 122 |
| packages/bus/tests/thread-claims.test.mjs | 6/0/0 | 0.264 | 300 | 121 |
| packages/bus/tests/thread-migration.test.mjs | 3/0/0 | 0.365 | 300 | 122 |
| packages/bus/tests/threads.test.mjs | 17/0/0 | 1.216 | 300 | 124 |
| packages/bus/tests/usage-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/cli/tests/lifecycle.test.mjs | 24/0/0 | 13.296 | 900 | 160 |
| packages/cli/tests/stack-release.test.mjs | 218/0/0 | 583.453 | 900 | 1871 |
| packages/cli/tests/thread-cli.test.mjs | 11/0/0 | 1.876 | 900 | 126 |
| packages/cli/tests/thread-launch.test.mjs | 11/0/0 | 16.603 | 900 | 170 |
| packages/webui/tests/chat.test.mjs | 23/0/0 | 0.515 | 300 | 122 |
N9 verbatim: ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
Sweep0 run-created leftovers. Initial broad sweep found nine current MCP/npm/code-mode infrastructure processes, all started14:20:57-14:21:07Z before this run14:30:03Z. UTC ps and /proc start ticks are retained; initial output saved, no signalling. Deleted cwd under run TMPDIR is included. No old-PID assumption replaces the receipt check.
Sage2711/2714 reported unrelated queue reads/write and Python reads by other seats. First and subsequent busy checks passed; no retry was needed and no effect is attributed to those processes. No live data was read by this seat. Raw command/log paths and all27 totals live in run3-focused/files/results.json and SUMMARY.json. Return slot after the record publication; no whole suite or M1-M40 batch starts here.
## Whole gate2737/2739, before execution
HEAD34401e7c9, product0604d91fc, manifest573c51cf. Outside agents/gander the record-tip diff is only BUILD-LOG.md, skipped by gate-lane-auth SKIP_COPY per Sage2739. Full lists/counts are printed in run3-gate/HEADER.json before first test. Serial CLI whole55 files,WebUI whole58 files, plus the20 bus files in the rebase union (subset coverage, not a bus-whole claim). Every Node call including RED/controls/changes is timeout-k10 with its killer/whole file measured bound, or900 for an unmeasured file, outerwait+30. WHOLE-GATE-LIMITS.json pins this. The two touched case files also run whole after intended REDs. M1-M40 then serial package/union files and10 shells; every mutation restores exact bytes/status before next. Shell table unchanged. First unexpected pre-existing red/product suspect/loosened assertion/timeout/second red stops unplaced. First-run own new-test red may be placed under2737, but no automatic loosening. No whole-gate test run yet.
## Whole gate2737 stopped unplaced atM21
Run started14:59:22Z. Two intendedREDs observed, exact restoration. Touched whole case243/0/0 in66.112s; case134/0/0 in93.721s. N9 ran and passed. M1-M20 killed;M21survived1/0 in8.581s against8.532s base.9controls passed,0timeouts. M22-M40 and all full-package/union/shell stages NOTRUN. Driver restored bytes/status; all7manifest checks pass, packages/scripts diff empty. Sweep0run-created leftovers. Stopped and returned slot as0106 before any retry/edit.
M21 drops only the peer regex end anchor. peer-malformed already writes a valid three-number prefix plus extra text, but the aggregate passingTAP does not expose the returnedreason. No loggedP10line can be quoted fromM21 orM17-base. Static trace shows onlyP10peerprobe executes PYTHON_STUB; configandearlierchecks useNode/shell, while tester_python reads metadata/ELF only. See run3-gate/STATIC-TRACE.md.
Mos1293requires a scratch-base diagnostic onSagegap, all17P10lines, then exactdesignreasonassertions. peer-malformed expectsprobe. Unexpecteddesignreason or anyproductchange goes toMosbeforeedits. No diagnostic or repair yet. Newcandidate/manifest/review and entiregatefromstart, no carry. Stop packet committed locally; helperpushwaitsforgap.
## Fixture-only M21 repair, mos1297, not run
Diagnostic(a) on0604 observed probe-inner-session for peer-malformed andpeer-error, not their designed probe/probe-inner-command. Mos confirmed instant shell output exits before session verification; product fails closed. Authorized option1 uses the same system Python exec for peer-output bytes/status; no delay and no product change. Sourcecommit362ec674c9e7aa8cef0c26f4d7448f459171dbd4 names1297 andquotesoldline100.
All17faults now assert exact reason with following space and anchoredP10prefix, from the accepted draft. Every old assertion retained. C4overflow andpeer-hang test bodies are byte-identical; overflow must remain probe-output-limit. Peer-hang looseprefixoutofscope unchanged. STATIC-PRESERVATION.json andREPAIR.diff in repair-1297/.
Seven-path manifesta2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e; onlycase1testhashchanges. No repaired-source test/syntax/Node execution. Whole gate from start, no carry, after Duckworth review and SageCLEAR. M21survival orwrongmalformed/errorreason goes toMosbeforeanychange. Product fast-exit issue isVikunja532post10-27; SageownsDEFERREDentry.
### mos-1297 fresh gate under sage-2768, stopped
Ran on pushed e1bc766d8, manifest a2ac5734, no carry. Both intendedREDs observed; touched whole43/0/0 and34/0/0,17fresh controls passed. M1-M37 killed including M21 by named P10 assertion; M38 survived (drop setsid, signals killer). M39-M40 and full package/union/shell stages NOTRUN. Wall404.837s,0timeouts,0skips,N9passed. Exact restoration and all7manifest checks pass; sweep0run-created leftovers. Stopped unplaced to Sage/Mos/Duckworth as gander-0116 and returned slot; no repair or rerun. run4-gate/ preserves raw logs,commands,counts and timing.
### mos-1298: pin the direct query session
M38 drops setsid but a blocking signals query can still fail closed with inner-timeout; the old kill rule was wrong. The named killer stays row253 C4 signals query. Every sleep/signals/member case in both exec/hop modes now reads the first query-pids line and asserts exact equality of its numeric PID and kernel SID. M38 must fail this new assertion, never a timeout or a cleanup-only assertion. Every old line of the C4 query test is preserved byte for byte. Product scripts remain byte-identical. No test or Node preflight run; fresh whole gate from start follows new candidate review and Sage CLEAR, with nothing carried. Base assertion failure, another survivor or any mismatch goes to Mos before a further change.
@@ -1,8 +1,8 @@
{
"docs/plans/DEFERRED.md": "8a050b494f6678030aabb7a7c92116c58ad6306ab0a27f31b368cff53c9b5d7c",
"docs/plans/DEFERRED.md": "f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3",
"packages/cli/tests/case-sudo-fixture.mjs": "b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008",
"packages/cli/tests/case1-accept.test.mjs": "6cfd2963303315aa6911c4d4f6d75d3ab87d9fcba8e128b056216e7f85fd8901",
"packages/cli/tests/case2-unit.test.mjs": "1e0696eb196e83a0766b433ef71f27df0a3f8fcb6399787ab8c1c0f05c54dc44",
"packages/cli/tests/case1-accept.test.mjs": "27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a",
"packages/cli/tests/case2-unit.test.mjs": "9ca67403d8614266061624ab5fbf4ea8e8a54cbd08f5b569c95592ab5ed40472",
"packages/webui/README.md": "ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46",
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b"
+15
View File
@@ -9,3 +9,18 @@ Sage-2335 authorizes the runnable commit before the whole gate. No repaired-sour
Superseding integration under sage-2463: gander/row253-0fa7 on 0fa7bf421. See integration-0fa7/. Only README changed among the seven landing entries, retaining row191 processing-control documentation; the refreshed manifest digest is 24b6a01b2ede6f025ec898fa4ec830bb9585ce6151d6298e713e31c7430a502b. No gate has run.
Superseding integration under sage-2659: gander/row253-385a on385a7194c, source141b79c29, digest72a70e99ba0416ceb1f63ed737132ebbeb212332d1441c362b3dfa6c8b00209c. Only README and DEFERRED hashes change. See integration-385a/ for drift, patch-ids and dependency reads. No gate run;264a schema dependency must be re-checked before CLEAR.
Post264a supersedes the385a preview: gander/row253-264a on84f53540d, rebased sourceb9d3d4c75c78aa6b06aefd734da781bef9b7f1da, manifest735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f. Only DEFERRED differs from the preview. See integration-264a/ for all11 equal pairs, patch-ids and whole-file union. Focused whole-file runs, publication, rebase review and full gate are pending Sage CLEAR.
Corrected interim integration2700/2702: gander/row253-b789 onb78918850, sourcec75c9bbd3339cb2343467715a14455044c2e4aea, digest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae.27-file scope unchanged. Pending final docs tip, rebase and CLEAR; no gate run.
Final base under sage-2705: gander/row253-aca1 onaca16404c, sourceed3bb376cdd5128dc58b3aa193282e1c2bfcf57d, digest573c51cf unchanged. integration-aca1/ is the final-hop packet. No runs yet.
Focused27 under sage-2709 now passed on0604d91fc:604/0/0, no timeouts, no retries, N9 executed and passed (exact line in run3-focused/SUMMARY.json). All7 blobs unchanged;573c51cf remains the review digest. run3-focused/ contains every raw whole-file log/command, HEAD/digest/limits preamble, timings and3x basis. No full gate or mutation-batch result is claimed.
Whole gate2737 stopped atM21 survivor after20kills. No final acceptance. run3-gate/STOP-SUMMARY.json andSTATIC-TRACE.md preserve the stop. Mos1293requires diagnostic thennewcandidate/review/fullgatefromstart. Current7sourceblobs remain573c51cf; no test/product repair made.
Mos1297 supersedes573c51cf after one fixture-only repair and17exactreasonassertions: source362ec674c9e7aa8cef0c26f4d7448f459171dbd4, digesta2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e. Onlycase1testchanges. repair-1297/ is the new review packet. Tests unrun; Duckworthreview and fullfreshgatepending.
mos-1298 candidate source 14e46006171ef700a72f971fda5cb3a0b8dcc4f2, seven-path manifest 591020a1096a1606c11f2ee34b37243acddf83d91c69922ccc5cfe22d6180d3a. Only case2-unit.test.mjs changes among manifest paths from e1bc766d8. Pending review and fresh full gate; no carry.
+3 -3
View File
@@ -1,7 +1,7 @@
8a050b494f6678030aabb7a7c92116c58ad6306ab0a27f31b368cff53c9b5d7c docs/plans/DEFERRED.md
f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3 docs/plans/DEFERRED.md
b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008 packages/cli/tests/case-sudo-fixture.mjs
6cfd2963303315aa6911c4d4f6d75d3ab87d9fcba8e128b056216e7f85fd8901 packages/cli/tests/case1-accept.test.mjs
1e0696eb196e83a0766b433ef71f27df0a3f8fcb6399787ab8c1c0f05c54dc44 packages/cli/tests/case2-unit.test.mjs
27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a packages/cli/tests/case1-accept.test.mjs
9ca67403d8614266061624ab5fbf4ea8e8a54cbd08f5b569c95592ab5ed40472 packages/cli/tests/case2-unit.test.mjs
ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46 packages/webui/README.md
c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd scripts/case1-accept.sh
d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b scripts/case2-unit.sh
@@ -0,0 +1,142 @@
{
"authority": "sage-2737/sage-2739",
"files": {
"packages/cli/tests/access.test.mjs": 900,
"packages/cli/tests/app.test.mjs": 900,
"packages/cli/tests/boot-status.test.mjs": 900,
"packages/cli/tests/case1-accept.test.mjs": 418,
"packages/cli/tests/case1-hostcheck.test.mjs": 900,
"packages/cli/tests/case2-persona-import.test.mjs": 900,
"packages/cli/tests/case2-unit.test.mjs": 320,
"packages/cli/tests/channel-cli.test.mjs": 900,
"packages/cli/tests/channel-recovery.test.mjs": 900,
"packages/cli/tests/cli.test.mjs": 900,
"packages/cli/tests/config.test.mjs": 900,
"packages/cli/tests/credentials.test.mjs": 900,
"packages/cli/tests/follow.test.mjs": 900,
"packages/cli/tests/format.test.mjs": 900,
"packages/cli/tests/gate-lane-auth.test.mjs": 900,
"packages/cli/tests/gate-lane-fixtures.test.mjs": 900,
"packages/cli/tests/gate-lane-image.test.mjs": 900,
"packages/cli/tests/gate-lane-state.test.mjs": 900,
"packages/cli/tests/gate-lane.test.mjs": 900,
"packages/cli/tests/git-socket.test.mjs": 900,
"packages/cli/tests/grants.test.mjs": 900,
"packages/cli/tests/host.test.mjs": 900,
"packages/cli/tests/hosts.test.mjs": 900,
"packages/cli/tests/instances.test.mjs": 900,
"packages/cli/tests/launch-account.test.mjs": 900,
"packages/cli/tests/launch-limit-checks.test.mjs": 900,
"packages/cli/tests/launch-limits.test.mjs": 900,
"packages/cli/tests/launch-routes.test.mjs": 900,
"packages/cli/tests/launcher.test.mjs": 900,
"packages/cli/tests/lifecycle.test.mjs": 160,
"packages/cli/tests/limits-tokens.test.mjs": 900,
"packages/cli/tests/limits.test.mjs": 900,
"packages/cli/tests/mark-read.test.mjs": 900,
"packages/cli/tests/names.test.mjs": 900,
"packages/cli/tests/notifier.test.mjs": 900,
"packages/cli/tests/other-tree.test.mjs": 900,
"packages/cli/tests/processing-cli.test.mjs": 900,
"packages/cli/tests/project-name-repo.test.mjs": 900,
"packages/cli/tests/project.test.mjs": 900,
"packages/cli/tests/publish-socket.test.mjs": 900,
"packages/cli/tests/stack-copy.test.mjs": 900,
"packages/cli/tests/stack-instances.test.mjs": 900,
"packages/cli/tests/stack-release-external.test.mjs": 900,
"packages/cli/tests/stack-release.test.mjs": 1871,
"packages/cli/tests/stack-upgrade.test.mjs": 900,
"packages/cli/tests/tester-http.test.mjs": 900,
"packages/cli/tests/tester-reads.test.mjs": 900,
"packages/cli/tests/tester-threads.test.mjs": 900,
"packages/cli/tests/tester.test.mjs": 900,
"packages/cli/tests/thread-cli.test.mjs": 126,
"packages/cli/tests/thread-launch.test.mjs": 170,
"packages/cli/tests/trackers-boot.test.mjs": 900,
"packages/cli/tests/transport.test.mjs": 900,
"packages/cli/tests/usage.test.mjs": 900,
"packages/cli/tests/verbs.test.mjs": 900,
"packages/webui/tests/agents-browser.test.mjs": 900,
"packages/webui/tests/agents.test.mjs": 900,
"packages/webui/tests/assistant.test.mjs": 900,
"packages/webui/tests/board-held.test.mjs": 900,
"packages/webui/tests/browser-edge.test.mjs": 900,
"packages/webui/tests/browser.test.mjs": 900,
"packages/webui/tests/bus-browser.test.mjs": 900,
"packages/webui/tests/bus.test.mjs": 900,
"packages/webui/tests/channel-chat.test.mjs": 900,
"packages/webui/tests/chat-browser.test.mjs": 900,
"packages/webui/tests/chat.test.mjs": 122,
"packages/webui/tests/conversation.test.mjs": 900,
"packages/webui/tests/discord.test.mjs": 900,
"packages/webui/tests/docs-browser.test.mjs": 900,
"packages/webui/tests/editor-browser.test.mjs": 900,
"packages/webui/tests/editor-provenance.test.mjs": 900,
"packages/webui/tests/editor.test.mjs": 900,
"packages/webui/tests/history-return-flow.test.mjs": 900,
"packages/webui/tests/instances-browser.test.mjs": 900,
"packages/webui/tests/instances.test.mjs": 900,
"packages/webui/tests/library-cli.test.mjs": 900,
"packages/webui/tests/library-status.test.mjs": 900,
"packages/webui/tests/limits-browser.test.mjs": 900,
"packages/webui/tests/limits-route.test.mjs": 900,
"packages/webui/tests/markdown-preview.test.mjs": 900,
"packages/webui/tests/messages.test.mjs": 900,
"packages/webui/tests/pinned-copy.test.mjs": 900,
"packages/webui/tests/preview.test.mjs": 900,
"packages/webui/tests/processing-browser.test.mjs": 900,
"packages/webui/tests/processing-ui.test.mjs": 900,
"packages/webui/tests/processing.test.mjs": 900,
"packages/webui/tests/project-file.test.mjs": 900,
"packages/webui/tests/project-name-repo.test.mjs": 900,
"packages/webui/tests/proof-cli.test.mjs": 900,
"packages/webui/tests/proof.test.mjs": 900,
"packages/webui/tests/reads.test.mjs": 900,
"packages/webui/tests/relaunch.test.mjs": 900,
"packages/webui/tests/return-flow.test.mjs": 900,
"packages/webui/tests/routes-browser.test.mjs": 900,
"packages/webui/tests/routes.test.mjs": 900,
"packages/webui/tests/send-browser.test.mjs": 900,
"packages/webui/tests/send.test.mjs": 900,
"packages/webui/tests/serve.test.mjs": 900,
"packages/webui/tests/service.test.mjs": 900,
"packages/webui/tests/settings-form.test.mjs": 900,
"packages/webui/tests/settings-write.test.mjs": 900,
"packages/webui/tests/shell.test.mjs": 900,
"packages/webui/tests/sso-browser.test.mjs": 900,
"packages/webui/tests/sso.test.mjs": 900,
"packages/webui/tests/tester-browser.test.mjs": 900,
"packages/webui/tests/tester-cli.test.mjs": 900,
"packages/webui/tests/tester-listener.test.mjs": 900,
"packages/webui/tests/tester-socket.test.mjs": 900,
"packages/webui/tests/thread-claims-browser.test.mjs": 900,
"packages/webui/tests/thread-claims.test.mjs": 900,
"packages/webui/tests/usage-browser.test.mjs": 900,
"packages/webui/tests/usage.test.mjs": 900,
"packages/webui/tests/views.test.mjs": 900,
"packages/bus/tests/account-migration.test.mjs": 122,
"packages/bus/tests/chief-of-staff.test.mjs": 127,
"packages/bus/tests/comment-migration.test.mjs": 122,
"packages/bus/tests/end-launch.test.mjs": 122,
"packages/bus/tests/fire-revokes-grants.test.mjs": 130,
"packages/bus/tests/gitea-grant.test.mjs": 146,
"packages/bus/tests/gitea-migration.test.mjs": 122,
"packages/bus/tests/grant-executor.test.mjs": 185,
"packages/bus/tests/grant-migration.test.mjs": 122,
"packages/bus/tests/lifecycle-revoke.test.mjs": 122,
"packages/bus/tests/message-filter.test.mjs": 122,
"packages/bus/tests/name-migration.test.mjs": 121,
"packages/bus/tests/schema.test.mjs": 121,
"packages/bus/tests/sessions.test.mjs": 122,
"packages/bus/tests/spec-migration.test.mjs": 121,
"packages/bus/tests/tester-writes.test.mjs": 122,
"packages/bus/tests/thread-claims.test.mjs": 121,
"packages/bus/tests/thread-migration.test.mjs": 122,
"packages/bus/tests/threads.test.mjs": 124,
"packages/bus/tests/usage-migration.test.mjs": 121
},
"fallback_seconds": 900,
"kill_after_seconds": 10,
"outer_wait_slack_seconds": 30,
"source": "run3-focused/MEASURED-FILE-LIMITS.json"
}
@@ -6,7 +6,7 @@ REPAIR.diff compares the repaired scripts against their original frozen source,
## Conditions mapped to the diff
C1: fixed setsid without -f/-w; confirm the direct child's kernel SID equals its PID. M38 drops setsid; exact inner-timeout tests must kill it by observing inner-session instead.
C1: fixed setsid without -f/-w; confirm the direct child's kernel SID equals its PID. M38 drops setsid; the named row253 C4 signals query killer must fail the exact numeric PID/SID equality assertion on the first query-pids line, in each kind and both sudo modes, without a timeout. A blocking child can still reach inner-timeout without setsid, so the refusal reason alone does not prove session creation (mos-1298).
C2: exact inner/outer/output-limit refusals in both fake modes, query 5/7 s and probe 2/4 s. Outer cases require at least the outer duration and less than outer + 2 s. Root discards the valid-looking stdout of a stalled supervisor. A trusted notice plus status 137 identifies the outer timer.
@@ -0,0 +1,168 @@
{
"count": 17,
"matches": 15,
"mismatches": [
{
"fault": "peer-malformed",
"expected": "probe",
"observed": "probe-inner-session",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
]
},
{
"fault": "peer-error",
"expected": "probe-inner-command",
"observed": "probe-inner-session",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
]
}
],
"peer_malformed": {
"fault": "peer-malformed",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "probe-inner-session",
"status": 0
},
"rows": [
{
"fault": "parent-mode",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "parent-owner",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "socket-mode",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "socket-owner",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "socket-type",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "symlink",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 0
},
{
"fault": "peer",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=peer path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "peer",
"status": 0
},
{
"fault": "peer-pid",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=peer path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "peer",
"status": 0
},
{
"fault": "python-mode",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "interpreter",
"status": 0
},
{
"fault": "python-missing",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "interpreter",
"status": 0
},
{
"fault": "python-not-elf",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "interpreter",
"status": 0
},
{
"fault": "peer-malformed",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "probe-inner-session",
"status": 0
},
{
"fault": "peer-error",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "probe-inner-session",
"status": 0
},
{
"fault": "peer-uid-fields",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "metadata",
"status": 1
},
{
"fault": "changed-inode",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=changed path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "changed",
"status": 0
},
{
"fault": "changed-pid",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=changed path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "changed",
"status": 0
},
{
"fault": "floor",
"p10": [
"P10 tester-socket-squat unnamed boundary=failed reason=floor path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"
],
"reason": "floor",
"status": 0
}
]
}
@@ -0,0 +1 @@
/mnt/storage/scratch/tmp/gBHA
@@ -0,0 +1,121 @@
{
"parent-mode": {
"reason": "metadata",
"meaning": "Private parent mode is exact0700",
"semantic_source": "DESIGN.md:119; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"parent-owner": {
"reason": "metadata",
"meaning": "Parent owner is stack uid",
"semantic_source": "DESIGN.md:119; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"socket-mode": {
"reason": "metadata",
"meaning": "Socket mode is exact0600",
"semantic_source": "DESIGN.md:120; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"socket-owner": {
"reason": "metadata",
"meaning": "Socket owner is stack uid",
"semantic_source": "DESIGN.md:120; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"socket-type": {
"reason": "metadata",
"meaning": "Final entry is socket",
"semantic_source": "DESIGN.md:119; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"symlink": {
"reason": "metadata",
"meaning": "Final entry is not symlink",
"semantic_source": "DESIGN.md:119; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"peer": {
"reason": "peer",
"meaning": "Connected uid equals stack uid",
"semantic_source": "DESIGN.md:136; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:665",
"exact_reason_token": "reason=peer "
},
"peer-pid": {
"reason": "peer",
"meaning": "Connected pid equals MainPID",
"semantic_source": "DESIGN.md:136; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:665",
"exact_reason_token": "reason=peer "
},
"python-mode": {
"reason": "interpreter",
"meaning": "Fixed system interpreter safely owned and protected",
"semantic_source": "DESIGN.md:126; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:660",
"exact_reason_token": "reason=interpreter "
},
"python-missing": {
"reason": "interpreter",
"meaning": "Missing system Python is failed observation",
"semantic_source": "DESIGN.md:129; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:660",
"exact_reason_token": "reason=interpreter "
},
"python-not-elf": {
"reason": "interpreter",
"meaning": "System entry target is ELF",
"semantic_source": "DESIGN.md:126; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:660",
"exact_reason_token": "reason=interpreter "
},
"peer-malformed": {
"reason": "probe",
"meaning": "Probe returns only exactly pid uid gid",
"semantic_source": "DESIGN.md:135; DESIGN.md:163; BUILD.md:17; mos-1293 item2 explicitly reason=probe",
"code_label_location": "scripts/case1-accept.sh:666",
"exact_reason_token": "reason=probe "
},
"peer-error": {
"reason": "probe-inner-command",
"meaning": "Nonzero child output discarded, distinct child failure",
"semantic_source": "DESIGN-C4.md:84-85; BUILD.md:175; BUILD.md:177",
"code_label_location": "scripts/case1-accept.sh:662; tester_capture_reason",
"exact_reason_token": "reason=probe-inner-command "
},
"peer-uid-fields": {
"reason": "metadata",
"meaning": "MainPID four proc uid fields equal stack uid",
"semantic_source": "DESIGN.md:118; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:659",
"exact_reason_token": "reason=metadata "
},
"changed-inode": {
"reason": "changed",
"meaning": "Snapshot replacement fails observation",
"semantic_source": "DESIGN.md:120; DESIGN.md:121; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:668",
"exact_reason_token": "reason=changed "
},
"changed-pid": {
"reason": "changed",
"meaning": "MainPID change fails observation",
"semantic_source": "DESIGN.md:121; BUILD.md:17",
"code_label_location": "scripts/case1-accept.sh:668",
"exact_reason_token": "reason=changed "
},
"floor": {
"reason": "floor",
"meaning": "Numeric floor above privileged Console port",
"semantic_source": "DESIGN.md:122; DESIGN.md:123",
"code_label_location": "scripts/case1-accept.sh:658",
"exact_reason_token": "reason=floor "
}
}
@@ -0,0 +1,37 @@
# Draft(b): expected P10 reasons before diagnostic(a)
Not derived from diagnostic output. No test edit is prepared or committed. The brief delegates P10 checks/outcome wording to DESIGN (docs/plans/2026-10-21_tester-socket-scripts.md:31). DESIGN.md:163-170 requires the failed reason to identify the failing observation, rather than accepting any unnamed line. BUILD.md:17 records the separate parent/socket/process/snapshot and peer checks. C4 refined failure classes in DESIGN-C4.md:84 and:91-95, with BUILD.md:175-177 recording distinct refusals.
The approved prose names semantic classes, not a literal exhaustive code-name table. The expected bounded labels below name those classes using existing source labels, cited separately for transparency. They are not selected from (a). peer-malformed=probe is additionally explicit in mos1293. If the diagnostic reports a different class/code, send it to Mos before any edit, even if it would make an existing broad assertion pass.
| Fault | Expected reason= | Designed observation | Design/build authority | Existing label locator, not output oracle |
|---|---|---|---|---|
| parent-mode | metadata | Private parent mode is exact0700 | DESIGN.md:119; BUILD.md:17 | scripts/case1-accept.sh:659 |
| parent-owner | metadata | Parent owner is stack uid | DESIGN.md:119; BUILD.md:17 | scripts/case1-accept.sh:659 |
| socket-mode | metadata | Socket mode is exact0600 | DESIGN.md:120; BUILD.md:17 | scripts/case1-accept.sh:659 |
| socket-owner | metadata | Socket owner is stack uid | DESIGN.md:120; BUILD.md:17 | scripts/case1-accept.sh:659 |
| socket-type | metadata | Final entry is socket | DESIGN.md:119; BUILD.md:17 | scripts/case1-accept.sh:659 |
| symlink | metadata | Final entry is not symlink | DESIGN.md:119; BUILD.md:17 | scripts/case1-accept.sh:659 |
| peer | peer | Connected uid equals stack uid | DESIGN.md:136; BUILD.md:17 | scripts/case1-accept.sh:665 |
| peer-pid | peer | Connected pid equals MainPID | DESIGN.md:136; BUILD.md:17 | scripts/case1-accept.sh:665 |
| python-mode | interpreter | Fixed system interpreter safely owned and protected | DESIGN.md:126; BUILD.md:17 | scripts/case1-accept.sh:660 |
| python-missing | interpreter | Missing system Python is failed observation | DESIGN.md:129; BUILD.md:17 | scripts/case1-accept.sh:660 |
| python-not-elf | interpreter | System entry target is ELF | DESIGN.md:126; BUILD.md:17 | scripts/case1-accept.sh:660 |
| peer-malformed | probe | Probe returns only exactly pid uid gid | DESIGN.md:135; DESIGN.md:163; BUILD.md:17; mos-1293 item2 explicitly reason=probe | scripts/case1-accept.sh:666 |
| peer-error | probe-inner-command | Nonzero child output discarded, distinct child failure | DESIGN-C4.md:84-85; BUILD.md:175; BUILD.md:177 | scripts/case1-accept.sh:662; tester_capture_reason |
| peer-uid-fields | metadata | MainPID four proc uid fields equal stack uid | DESIGN.md:118; BUILD.md:17 | scripts/case1-accept.sh:659 |
| changed-inode | changed | Snapshot replacement fails observation | DESIGN.md:120; DESIGN.md:121; BUILD.md:17 | scripts/case1-accept.sh:668 |
| changed-pid | changed | MainPID change fails observation | DESIGN.md:121; BUILD.md:17 | scripts/case1-accept.sh:668 |
| floor | floor | Numeric floor above privileged Console port | DESIGN.md:122; DESIGN.md:123 | scripts/case1-accept.sh:658 |
All existing status assertions and the boundary=failed/no-boundary=observed assertions remain. The draft adds exact reasons; it never weakens a status or changes a failure to fit observation. The special peer-uid-fields functional failure remains exit1. Product changes require Mos. A fixture-only repair can be considered only when the stub is shown to mask the intended fault, under mos1293.
One scratch archive of0604d91fc is prepared at the path in PREPARE.json. Its only change logs every P10 line, reason and status immediately before the same existing assertions in the named loop. Both product scripts and shared fixture are exact base blobs. The COPY-PATH is not a commit/worktree. No source or test in the seat checkout is changed.
On Sage CLEAR: create TMPDIR via mktemp-d /mnt/storage/scratch/tmp/gXXX, export it, invoke diagnostic-a/run.py with that grant. It gates with the busy check, uses timeout-k10 418 and outer448, pipefail/tee, records command/header/results and writes P10.jsonl. It refuses a second run if output exists. No diagnostic/syntax/Node execution has run while preparing this.
## Duckworth0160 expected-set review
All17 expected reasons accepted by source-only review. C1: assert the exact reason token, including its following space, for example `reason=probe `, or match the full P10 line. A prefix expression `/reason=probe/` is forbidden because it also accepts probe-inner-command and other probe-* reasons. C2: keep every existing status, boundary=failed and no-boundary=observed assertion. A fixture repair is limited to a mask shown by diagnostic(a), and an unexpected reason goes to Mos before any edit.
N1 citation corrected: peer-error child failure is DESIGN-C4.md:84-85. N2: the existing peer-hang test at case1-accept.test.mjs:291 has a separate loose probe prefix; Duckworth says it is outside mos1292/1293 scope and does not bind this repair. No change to it is prepared.
@@ -0,0 +1,11 @@
--- 0604d91fc/packages/cli/tests/case1-accept.test.mjs
+++ scratch/packages/cli/tests/case1-accept.test.mjs
@@ -262,6 +262,8 @@
};
for(const [name,fault] of Object.entries(faults)){
const h=host(t);fault(h);const r=run(h);
+ const diagnosticP10 = r.lines.filter(line => line.startsWith('P10 '));
+ writeFileSync(process.env.ROW253_P10_DIAG, JSON.stringify({fault:name, p10:diagnosticP10, reason:/\breason=([^ ]+)/.exec(diagnosticP10.join('\n'))?.[1] ?? null, status:r.status})+'\n', {flag:'a'});
assert.equal(r.status,name==='peer-uid-fields'?1:0,`${name}: ${r.out}${r.err}`);
assert.match(r.out,/P10 tester-socket-squat unnamed boundary=failed/,name);
assert.doesNotMatch(r.out,/boundary=observed/,name);
@@ -0,0 +1,17 @@
{"fault":"parent-mode","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"parent-owner","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"socket-mode","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"socket-owner","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"socket-type","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"symlink","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":0}
{"fault":"peer","p10":["P10 tester-socket-squat unnamed boundary=failed reason=peer path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"peer","status":0}
{"fault":"peer-pid","p10":["P10 tester-socket-squat unnamed boundary=failed reason=peer path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"peer","status":0}
{"fault":"python-mode","p10":["P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"interpreter","status":0}
{"fault":"python-missing","p10":["P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"interpreter","status":0}
{"fault":"python-not-elf","p10":["P10 tester-socket-squat unnamed boundary=failed reason=interpreter path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"interpreter","status":0}
{"fault":"peer-malformed","p10":["P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"probe-inner-session","status":0}
{"fault":"peer-error","p10":["P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-session path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"probe-inner-session","status":0}
{"fault":"peer-uid-fields","p10":["P10 tester-socket-squat unnamed boundary=failed reason=metadata path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"metadata","status":1}
{"fault":"changed-inode","p10":["P10 tester-socket-squat unnamed boundary=failed reason=changed path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"changed","status":0}
{"fault":"changed-pid","p10":["P10 tester-socket-squat unnamed boundary=failed reason=changed path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"changed","status":0}
{"fault":"floor","p10":["P10 tester-socket-squat unnamed boundary=failed reason=floor path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains"],"reason":"floor","status":0}
@@ -0,0 +1,18 @@
{
"base": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b",
"scratch_copy": "/mnt/storage/scratch/tmp/gBHA",
"source": "git archive base, all tracked files, no commit and no .git",
"test": "packages/cli/tests/case1-accept.test.mjs",
"original_test_sha256": "6cfd2963303315aa6911c4d4f6d75d3ab87d9fcba8e128b056216e7f85fd8901",
"instrumented_test_sha256": "0e029047fa7d8cd94a17e0caabc383432ef31068c4ea781e880664d7c7650d3d",
"unchanged_product_and_fixture": {
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"packages/cli/tests/case-sudo-fixture.mjs": "b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008"
},
"change": "Output-only JSONL before unchanged existing assertions, scoped to named P10 loop. Records all P10 lines and reason for each fault.",
"tests_run": false,
"node_modules": "plain symlink to canonical node_modules",
"planned_timeout_seconds": 418,
"planned_outer_wait_seconds": 448
}
@@ -0,0 +1,19 @@
{
"grant": "sage-2752",
"base": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b",
"scratch_copy": "/mnt/storage/scratch/tmp/gBHA",
"tmpdir": "/mnt/storage/scratch/tmp/grCq",
"command": [
"timeout",
"-k",
"10",
"418",
"node",
"--test",
"--test-reporter=tap",
"--test-name-pattern",
"row253 P10 refuses unsafe metadata",
"packages/cli/tests/case1-accept.test.mjs"
],
"reason_oracle": "EXPECTED-REASONS.md drafted before diagnostic; output does not define expected reasons"
}
@@ -0,0 +1,26 @@
{
"code": 0,
"timeout": false,
"seconds": 8.632,
"header": {
"grant": "sage-2752",
"base": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b",
"scratch_copy": "/mnt/storage/scratch/tmp/gBHA",
"tmpdir": "/mnt/storage/scratch/tmp/grCq",
"command": [
"timeout",
"-k",
"10",
"418",
"node",
"--test",
"--test-reporter=tap",
"--test-name-pattern",
"row253 P10 refuses unsafe metadata",
"packages/cli/tests/case1-accept.test.mjs"
],
"reason_oracle": "EXPECTED-REASONS.md drafted before diagnostic; output does not define expected reasons"
},
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/diagnostic-a/diagnostic.log",
"p10_file": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/diagnostic-a/P10.jsonl"
}
@@ -0,0 +1,61 @@
{
"count": 0,
"remaining": [],
"excluded_preexisting_infrastructure": [
{
"pid": 2469277,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.360000+00:00"
},
{
"pid": 2469278,
"comm": "npm exec @model",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.370000+00:00"
},
{
"pid": 2469279,
"comm": "npm exec chrome",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.370000+00:00"
},
{
"pid": 2469292,
"comm": "npm exec @playw",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.380000+00:00"
},
{
"pid": 2469478,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:58.770000+00:00"
},
{
"pid": 2469485,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:58.800000+00:00"
},
{
"pid": 2469518,
"comm": "chrome-devtools",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:59.100000+00:00"
},
{
"pid": 2469601,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:59.440000+00:00"
},
{
"pid": 2470486,
"comm": "codex-code-mode",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:21:07.580000+00:00"
}
],
"note": "Read-only cwd sweep over own repo, scratch archive and diagnostic TMPDIR, including deleted cwd. No signalling."
}
@@ -0,0 +1 @@
/mnt/storage/scratch/tmp/grCq
@@ -0,0 +1 @@
["timeout", "-k", "10", "418", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 P10 refuses unsafe metadata", "packages/cli/tests/case1-accept.test.mjs"]
@@ -0,0 +1,18 @@
{"grant": "sage-2752", "base": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b", "scratch_copy": "/mnt/storage/scratch/tmp/gBHA", "tmpdir": "/mnt/storage/scratch/tmp/grCq", "command": ["timeout", "-k", "10", "418", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 P10 refuses unsafe metadata", "packages/cli/tests/case1-accept.test.mjs"], "reason_oracle": "EXPECTED-REASONS.md drafted before diagnostic; output does not define expected reasons"}
TAP version 13
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
ok 1 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
---
duration_ms: 8459.11348
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 8556.217902
{"code": 0, "timeout": false, "seconds": 8.632, "header": {"grant": "sage-2752", "base": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b", "scratch_copy": "/mnt/storage/scratch/tmp/gBHA", "tmpdir": "/mnt/storage/scratch/tmp/grCq", "command": ["timeout", "-k", "10", "418", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 P10 refuses unsafe metadata", "packages/cli/tests/case1-accept.test.mjs"], "reason_oracle": "EXPECTED-REASONS.md drafted before diagnostic; output does not define expected reasons"}, "log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/diagnostic-a/diagnostic.log", "p10_file": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/diagnostic-a/P10.jsonl"}
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
ok 1 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
---
duration_ms: 8459.11348
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 8556.217902
@@ -0,0 +1 @@
2026-10-22T15:25:48.412740+00:00
@@ -0,0 +1,35 @@
#!/usr/bin/env python3
"""One scratch diagnostic, executable only after Sage grants its gap."""
import argparse,json,os,signal,subprocess,time
from pathlib import Path
HERE=Path(__file__).resolve().parent
def main():
ap=argparse.ArgumentParser();ap.add_argument('--grant',required=True);args=ap.parse_args()
if not os.environ.get('TMPDIR','').startswith('/mnt/storage/scratch/tmp/g'):
raise RuntimeError('create the granted gXXX TMPDIR first')
prep=json.loads((HERE/'PREPARE.json').read_text());copy=Path(prep['scratch_copy'])
busy=subprocess.run(['bash','/mnt/storage/scratch/sage-busy-now.sh'],capture_output=True,text=True)
if busy.returncode or busy.stdout.splitlines()[-1:]!=['CLEAR']:
raise RuntimeError('busy refusal: '+busy.stdout+busy.stderr)
env=os.environ.copy();env['ROW253_P10_DIAG']=str(HERE/'P10.jsonl')
if (HERE/'RUN-RESULT.json').exists() or (HERE/'P10.jsonl').exists():
raise RuntimeError('one diagnostic only; existing output refuses automatic rerun')
command=['timeout','-k','10','418','node','--test','--test-reporter=tap','--test-name-pattern','row253 P10 refuses unsafe metadata','packages/cli/tests/case1-accept.test.mjs']
command_file=HERE/'command.json';command_file.write_text(json.dumps(command)+'\n')
header=dict(grant=args.grant,base=prep['base'],scratch_copy=str(copy),tmpdir=env['TMPDIR'],command=command,reason_oracle='EXPECTED-REASONS.md drafted before diagnostic; output does not define expected reasons')
(HERE/'RUN-HEADER.json').write_text(json.dumps(header,indent=2)+'\n');print(json.dumps(header),flush=True)
started=time.monotonic()
p=subprocess.Popen(['bash','-o','pipefail','-c','python3 "$1" "$2" 2>&1 | tee "$3"','--',str(HERE.parent/'launch.py'),str(command_file),str(HERE/'diagnostic.log')],cwd=copy,env=env,start_new_session=True)
timeout=False
try:
code=p.wait(timeout=448);timeout=code in (124,137)
except subprocess.TimeoutExpired:
timeout=True;os.killpg(p.pid,signal.SIGKILL);code=p.wait()
finally:
try:os.killpg(p.pid,signal.SIGKILL)
except ProcessLookupError:pass
result=dict(code=code,timeout=timeout,seconds=round(time.monotonic()-started,3),header=header,log=str(HERE/'diagnostic.log'),p10_file=str(HERE/'P10.jsonl'))
(HERE/'RUN-RESULT.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result),flush=True)
if timeout or code:raise RuntimeError('diagnostic stopped; no retry or repair before ruling')
if __name__=='__main__':main()
@@ -0,0 +1 @@
2026-10-22T15:25:29Z
+5
View File
@@ -21,6 +21,11 @@ def busy():
raise RuntimeError('busy refusal: ' + p.stdout + p.stderr)
def run(command, path, seconds=60):
if command[:2] == ['node', '--test']:
limits = json.loads((HERE/'WHOLE-GATE-LIMITS.json').read_text())['files']
limit = limits.get(command[-1], 900)
command = ['timeout','-k','10',str(limit),*command]
seconds = limit + 30
busy()
started = time.monotonic()
command_file = path.with_suffix('.command.json')
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
"""Summarize completed focused evidence without executing tests."""
import datetime
import hashlib
import json
import math
from pathlib import Path
HERE=Path(__file__).resolve().parent
RUN=HERE/'run3-focused'
def main():
results=json.loads((RUN/'files/results.json').read_text())
assert len(results['steps'])==27
assert all(s['code']==0 and not s['timeout'] and s['counts'].get('fail')==0 for s in results['steps'])
header=(RUN/'controller.log').read_text().splitlines()
assert json.loads(header[0])=={k:results[k] for k in ['grant','head','manifest']}
assert json.loads(header[1])['authority']=='sage-2709'
named=[]
basis={}
lines=['# Focused27 whole-file results','','| Whole file | Pass/fail/skip | Wall seconds | Command limit seconds | Next3x plus120 basis |','|---|---:|---:|---:|---:|']
for s in results['steps']:
command=json.loads(Path(s['log']).with_suffix('.command.json').read_text())
expected=900 if s['file'].startswith('packages/cli/') else 300
assert command==['timeout','-k','10',str(expected),'node','--test','--test-reporter=tap',s['file']]
c=s['counts'];limit=math.ceil(3*s['seconds'])+120
basis[s['file']]=dict(recorded_seconds=s['seconds'],receipt=s['log'],next_limit_seconds=limit,derivation='ceil(3*measured whole-file seconds)+120')
lines.append(f"| {s['file']} | {c['pass']}/{c['fail']}/{c['skipped']} | {s['seconds']} | {expected} | {limit} |")
named += [dict(file=s['file'],line=line) for line in s['named_skips']]
case2=next(s for s in results['steps'] if s['file'].endswith('/case2-unit.test.mjs'))
n9=[line for line in Path(case2['log']).read_text().splitlines() if 'inside a session' in line and 'ok ' in line]
assert len(n9)==1
result=dict(status='GREEN',grant=results['grant'],candidate=results['head'],manifest=results['manifest'],counts={k:sum(s['counts'].get(k,0) for s in results['steps']) for k in ['pass','fail','skipped']},steps=results['steps'],named_skips=named,n9_exact_line=n9[0],file_seconds_sum=round(sum(s['seconds'] for s in results['steps']),3),next_file_limits=basis,timeout_count=0,source_manifest_verified=True)
(RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n')
(RUN/'RESULTS.md').write_text('\n'.join(lines)+'\n\nN9 verbatim: '+n9[0]+'\n\nEvery skip:\n\n'+'\n'.join('- '+s['line'] for s in named)+'\n')
(RUN/'MEASURED-FILE-LIMITS.json').write_text(json.dumps(basis,indent=2)+'\n')
print(json.dumps({k:result[k] for k in ['counts','named_skips','n9_exact_line','file_seconds_sum']},indent=2))
if __name__=='__main__':main()
@@ -0,0 +1,34 @@
#!/usr/bin/env python3
"""Read-only sweep of this worktree and focused TMPDIR, including deleted cwd."""
import datetime
import json
import os
from pathlib import Path
HERE=Path(__file__).resolve().parent
REPO=HERE.parents[3]
RUN=HERE/'run3-focused'
def main():
tmp=Path((RUN/'TMPDIR').read_text().strip())
started=datetime.datetime.fromisoformat((RUN/'start.txt').read_text().strip().replace('Z','+00:00')).timestamp()
boot=int(next(s.split()[1] for s in Path('/proc/stat').read_text().splitlines() if s.startswith('btime ')))
ancestors=set();pid=os.getpid()
while pid and pid not in ancestors:
ancestors.add(pid)
try:pid=int(next(s.split(':')[1] for s in Path(f'/proc/{pid}/status').read_text().splitlines() if s.startswith('PPid:')))
except (OSError,StopIteration):break
known={2880281,2880282,2880283,2880284,2880445,2880487,2880537,2883251,2880439,2469277,2469278,2469279,2469292,2469478,2469485,2469518,2469601,2470486}
remaining=[];excluded=[]
for proc in Path('/proc').iterdir():
if not proc.name.isdigit() or int(proc.name) in ancestors:continue
try:
rawcwd=os.readlink(proc/'cwd');cwd=Path(rawcwd.removesuffix(' (deleted)'))
if not(cwd==REPO or REPO in cwd.parents or cwd==tmp or tmp in cwd.parents):continue
stat=(proc/'stat').read_text().rsplit(') ',1)[1].split()
stamp=boot+int(stat[19])/os.sysconf('SC_CLK_TCK')
item=dict(pid=int(proc.name),comm=(proc/'comm').read_text().strip(),cwd=rawcwd,started_utc=datetime.datetime.fromtimestamp(stamp,datetime.timezone.utc).isoformat())
if int(proc.name) in known and stamp<started:excluded.append(item)
else:remaining.append(item)
except (OSError,ValueError,IndexError):continue
result=dict(timestamp=datetime.datetime.now(datetime.timezone.utc).isoformat(),count=len(remaining),remaining=remaining,excluded_preexisting_infrastructure=excluded,note='Read-only /proc cwd sweep, including deleted cwd under this run TMPDIR. Own ancestry excluded. Only known MCP/npm/code-mode infrastructure PIDs with pre-run start ticks are excluded. No signalling.')
(RUN/'sweep.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
if __name__=='__main__':main()
@@ -0,0 +1,54 @@
#!/usr/bin/env python3
"""Assemble complete whole-gate evidence from retained logs only."""
import hashlib,json,re
from pathlib import Path
HERE=Path(__file__).resolve().parent
RUN=HERE/'run3-gate'
def main():
sections={n:json.loads((RUN/n/'results.json').read_text()) for n in ['focused','changes','whole']}
header=json.loads((RUN/'HEADER.json').read_text());lists=json.loads((RUN/'FILE-LISTS.json').read_text())
whole=sections['whole']['steps'];expected=sum(map(len,lists.values()))+10
assert len(whole)==expected
assert all(s['code']==0 and not s['timeout'] for s in whole)
focused=sections['focused']['steps']
assert len(focused)==4 and all(not s['timeout'] and (s['code']!=0 if s['expected_red'] else s['code']==0) for s in focused)
changes=sections['changes']['changes'];assert len(changes)==40 and all(s['outcome']=='killed' and not s['timeout'] for s in changes)
limits=json.loads((HERE/'WHOLE-GATE-LIMITS.json').read_text())['files'];shell_limits=json.loads((HERE/'SHELL-LIMITS.json').read_text())['scripts']
counts={};skips=[];rows=[];shells=[];n9=[]
for package,files in lists.items():
steps=[s for s in whole if s['name'].startswith(package+'-')]
commands=[json.loads(Path(s['log']).with_suffix('.command.json').read_text()) for s in steps]
assert [c[-1] for c in commands]==files
counts[package]={k:sum(s['counts'].get(k,0) for s in steps) for k in ['pass','fail','skipped']}
for s,c,file in zip(steps,commands,files):
assert c==['timeout','-k','10',str(limits[file]),'node','--test','--test-reporter=tap',file]
text=Path(s['log']).read_text(errors='replace')
skips += [dict(file=file,line=line) for line in text.splitlines() if '# SKIP' in line]
if file.endswith('/case2-unit.test.mjs'):n9 += [line for line in text.splitlines() if line.startswith('ok ') and "inside a session's sandbox" in line]
rows.append(dict(file=file,counts=s['counts'],seconds=s['seconds'],limit_seconds=limits[file],log=s['log']))
for s in whole[-10:]:
command=json.loads(Path(s['log']).with_suffix('.command.json').read_text());file=command[-1]
assert command==['timeout','-k','10',str(shell_limits[file]['limit_seconds']),'bash',file]
text=Path(s['log']).read_text(errors='replace');found=re.findall(r'([^\n]*?: (\d+) passed, (\d+) failed)',text);assert found,file
line,passed,failed=found[-1];assert int(failed)==0
skips += [dict(file=file,line=line) for line in text.splitlines() if re.match(r'^\s*skip\b',line,re.I) or '# SKIP' in line]
shells.append(dict(file=file,pass_count=int(passed),fail_count=int(failed),seconds=s['seconds'],limit_seconds=shell_limits[file]['limit_seconds'],summary_line=line,log=s['log']))
assert len(n9)==1
counts['shell_self_assertions']=dict(pass_count=sum(s['pass_count'] for s in shells),fail_count=0)
result=dict(status='GREEN',header=header,sections=sections,counts=counts,files=rows,shells=shells,named_skips=skips,n9_exact_line=n9[0],killed=40,survived=0,timeouts=0,head_diff_outside_gander=(RUN/'HEAD-DIFF-OUTSIDE-GANDER.txt').read_text().splitlines())
repo=HERE.parents[3]
expected_hashes=json.loads((HERE/'CANDIDATE-SHAS.json').read_text())
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v for n,v in expected_hashes.items())
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v['script_sha256'] for n,v in shell_limits.items())
(RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n')
lines=['# Row253 whole gate RESULTS','','HEAD '+header['head']+', product '+header['product']+', manifest '+header['manifest']+'.','','0604..344 name-only outside agents/gander/:','','```text',*result['head_diff_outside_gander'],'```','','All listed whole files ran, with no unlisted-file coverage claim. Intended REDs and focused repeats are separate from package totals. Bus coverage is the20-file rebase union, not a bus-whole claim.','','| Whole file | Pass/fail/skip | Wall seconds | Limit seconds |','|---|---:|---:|---:|']
lines += [f"| {r['file']} | {r['counts']['pass']}/{r['counts']['fail']}/{r['counts']['skipped']} | {r['seconds']} | {r['limit_seconds']} |" for r in rows]
lines += [f"| {r['file']} | {r['pass_count']}/{r['fail_count']}/0 | {r['seconds']} | {r['limit_seconds']} |" for r in shells]
lines += ['','N9 verbatim: '+n9[0],'','Every named skip:','']+[f"- {s['file']}: {s['line']}" for s in skips]
(RUN/'RESULTS.md').write_text('\n'.join(lines)+'\n')
defs={d['id']:d for d in json.loads((HERE/'changes.json').read_text())}
table=['# M1-M40 kill table','','Every base passes; each change restored exact bytes and tracked status before the next. No timeout counts as kill.','','| Check | Named killer | Base seconds | Changed seconds | Outcome |','|---|---|---:|---:|---|']
table += [f"| {s['id']} | {defs[s['id']]['pattern']} | {s['base_seconds']} | {s['seconds']} | {s['outcome']} |" for s in changes]
(RUN/'KILL-TABLE.md').write_text('\n'.join(table)+'\n')
print(json.dumps(dict(counts=counts,named_skips=skips,n9=n9,killed=40),indent=2))
if __name__=='__main__':main()
@@ -0,0 +1,34 @@
#!/usr/bin/env python3
"""Read-only sweep of this worktree and focused TMPDIR, including deleted cwd."""
import datetime
import json
import os
from pathlib import Path
HERE=Path(__file__).resolve().parent
REPO=HERE.parents[3]
RUN=HERE/'run3-gate'
def main():
tmp=Path((RUN/'TMPDIR').read_text().strip())
started=datetime.datetime.fromisoformat((RUN/'start.txt').read_text().strip().replace('Z','+00:00')).timestamp()
boot=int(next(s.split()[1] for s in Path('/proc/stat').read_text().splitlines() if s.startswith('btime ')))
ancestors=set();pid=os.getpid()
while pid and pid not in ancestors:
ancestors.add(pid)
try:pid=int(next(s.split(':')[1] for s in Path(f'/proc/{pid}/status').read_text().splitlines() if s.startswith('PPid:')))
except (OSError,StopIteration):break
known={2880281,2880282,2880283,2880284,2880445,2880487,2880537,2883251,2880439,2469277,2469278,2469279,2469292,2469478,2469485,2469518,2469601,2470486}
remaining=[];excluded=[]
for proc in Path('/proc').iterdir():
if not proc.name.isdigit() or int(proc.name) in ancestors:continue
try:
rawcwd=os.readlink(proc/'cwd');cwd=Path(rawcwd.removesuffix(' (deleted)'))
if not(cwd==REPO or REPO in cwd.parents or cwd==tmp or tmp in cwd.parents):continue
stat=(proc/'stat').read_text().rsplit(') ',1)[1].split()
stamp=boot+int(stat[19])/os.sysconf('SC_CLK_TCK')
item=dict(pid=int(proc.name),comm=(proc/'comm').read_text().strip(),cwd=rawcwd,started_utc=datetime.datetime.fromtimestamp(stamp,datetime.timezone.utc).isoformat())
if int(proc.name) in known and stamp<started:excluded.append(item)
else:remaining.append(item)
except (OSError,ValueError,IndexError):continue
result=dict(timestamp=datetime.datetime.now(datetime.timezone.utc).isoformat(),count=len(remaining),remaining=remaining,excluded_preexisting_infrastructure=excluded,note='Read-only /proc cwd sweep, including deleted cwd under this run TMPDIR. Own ancestry excluded. Only known MCP/npm/code-mode infrastructure PIDs with pre-run start ticks are excluded. No signalling.')
(RUN/'sweep.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
if __name__=='__main__':main()
@@ -0,0 +1,43 @@
# Row253 final integration after264a
Authority sage-2698. New gander/row253-264a on84f53540d; previous branch retained. Eleven commits replayed with no conflict. All eleven range-diff pairs and full patch-ids equal. Rebased tip before this record b9d3d4c75c78aa6b06aefd734da781bef9b7f1da.
Only DEFERRED changes among the seven manifest blobs, preserving the new base as an exact byte prefix. Six other blobs remain unchanged, including both host scripts, both focused tests and shared sudo fixture. New manifest 735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f. BUILD-LOG remains an append outside the landing manifest.
264a reaches the focused tests through Store loaded by CLI helpers. The new base includes schema3l, migrations/3k-3l.sql and matching store hash. The focused tests pin neither3k/3l nor schema bytes. No product/test/assertion repair. Duckworth0132 already checked this dependency statically against264a r9. This packet also lists actual landing changes. T46 stack-release.test.mjs reads actual schema and will run whole.
The required whole-file union conservatively includes every .test.mjs changed upstream from385a to84f plus both own focused test files. Shared case-sudo fixture is exercised by its two importers; schema-3k.sql is a migration fixture, not a standalone test. Whole-test-union.json has 27 runnable files. No result carries. These runs await a focused CLEAR before publication and Duckworth rebase check; the whole gate needs a later CLEAR.
N9 remains the exact case2 test: inside a session's sandbox a bind below1024 fails with EACCES, and a bind on a free high port succeeds. Its skip reason comes from sandboxProblem() at gate time and will be copied verbatim. Other environment/provider/canonical-root skips will be named too.
SHELL-LIMITS.json stays as prepared under sage-2659. Every scripts/test-*.sh blob matches the previous base; the only changed script upstream is stack-release.sh. Current limits retain their receipts and3x rule. No tests, Node, syntax commands, browser, host probe, queue command or push ran.
Required whole files:
- packages/bus/tests/account-migration.test.mjs
- packages/bus/tests/chief-of-staff.test.mjs
- packages/bus/tests/comment-migration.test.mjs
- packages/bus/tests/end-launch.test.mjs
- packages/bus/tests/fire-revokes-grants.test.mjs
- packages/bus/tests/gitea-grant.test.mjs
- packages/bus/tests/gitea-migration.test.mjs
- packages/bus/tests/grant-executor.test.mjs
- packages/bus/tests/grant-migration.test.mjs
- packages/bus/tests/lifecycle-revoke.test.mjs
- packages/bus/tests/message-filter.test.mjs
- packages/bus/tests/name-migration.test.mjs
- packages/bus/tests/schema.test.mjs
- packages/bus/tests/sessions.test.mjs
- packages/bus/tests/spec-migration.test.mjs
- packages/bus/tests/tester-writes.test.mjs
- packages/bus/tests/thread-claims.test.mjs
- packages/bus/tests/thread-migration.test.mjs
- packages/bus/tests/threads.test.mjs
- packages/bus/tests/usage-migration.test.mjs
- packages/cli/tests/case1-accept.test.mjs
- packages/cli/tests/case2-unit.test.mjs
- packages/cli/tests/lifecycle.test.mjs
- packages/cli/tests/stack-release.test.mjs
- packages/cli/tests/thread-cli.test.mjs
- packages/cli/tests/thread-launch.test.mjs
- packages/webui/tests/chat.test.mjs
@@ -0,0 +1,90 @@
{
"old_base": "385a7194c",
"old_tip": "d213ef651",
"new_base": "84f53540d",
"rebased_tip": "b9d3d4c75c78aa6b06aefd734da781bef9b7f1da",
"manifest": "735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f",
"manifest_blobs_changed": [
"docs/plans/DEFERRED.md"
],
"upstream_paths": [
"agents/gizmoduck/work/queue-264/BUILD.md",
"agents/megavolt/work/queue-281/BUILD.md",
"docs/plans/DEFERRED.md",
"packages/bus/README.md",
"packages/bus/schema.sql",
"packages/bus/src/broker.mjs",
"packages/bus/src/migrations/3k-3l.sql",
"packages/bus/src/store.mjs",
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/fixtures/schema-3k.sql",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs",
"scripts/stack-release.sh"
],
"whole_test_union": [
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs"
],
"shared_test_helpers": [
"packages/cli/tests/case-sudo-fixture.mjs"
],
"shared_fixture_artifacts": [
"packages/bus/tests/fixtures/schema-3k.sql"
],
"unchanged_runnable_blobs": [
"packages/cli/tests/case-sudo-fixture.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/webui/README.md",
"scripts/case1-accept.sh",
"scripts/case2-unit.sh"
]
}
@@ -0,0 +1,20 @@
diff --git a/docs/plans/DEFERRED.md b/docs/plans/DEFERRED.md
index 4c0c736f1..020fd5b57 100644
--- a/docs/plans/DEFERRED.md
+++ b/docs/plans/DEFERRED.md
@@ -460,6 +460,15 @@ at every gate. Started 2026-09-12 during the control board MVP.
changes `packages/cli/tests/tester.test.mjs`: add the resolve pin so M8
dies on an assertion. (2026-10-22)
+- **Row 274's user reply check is scoped to the thread, not the session.**
+ (Row 264a r6, sage-2591.) In `packages/bus/src/broker.mjs`, the check that
+ a run answers a user only in reply to that user's message in its thread
+ joins `message_threads` by thread. That holds while a user's thread has
+ only its default session: a user can't call `session.create`, and
+ `#thread` refuses anyone but the owner. Binds row 272 (264e, #1777), or
+ any row that lets a user add sessions: make the check session-scoped and
+ test it with two sessions. (2026-10-22)
+
## Queue
Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
@@ -0,0 +1,68 @@
[
{
"old": "a9c094d0657a52c22ba51b35e690868358cf2bd0",
"new": "0c44ba7c46103d4cb74de2a5393ce677a5010378",
"old_patch_id": "2b17f1d6773aa17909fc959081eec3f3821c3dee",
"new_patch_id": "2b17f1d6773aa17909fc959081eec3f3821c3dee"
},
{
"old": "2e81f78722ccd43d7524bb6a7d27d7ac26d0cea8",
"new": "a1f3b4f31b861e19b9a05189fb16692515819f5f",
"old_patch_id": "d597cc7402b568d845a87c1f142bde74ce6ae9da",
"new_patch_id": "d597cc7402b568d845a87c1f142bde74ce6ae9da"
},
{
"old": "3c8edc358c1f30ea7b5cc9a79d30282e59092715",
"new": "1ecc23eb1f0b68e8a940169a71b6d37f754a034c",
"old_patch_id": "899327761a9bde7e7b4fefd790c1a523488e8029",
"new_patch_id": "899327761a9bde7e7b4fefd790c1a523488e8029"
},
{
"old": "3114087efe655f1d38c5e30f8327f65980854043",
"new": "18523ce92db9b02fdc72d00999e04d4de8550d6a",
"old_patch_id": "38dcf7f0ec2a39bad2696d971a684a729b154747",
"new_patch_id": "38dcf7f0ec2a39bad2696d971a684a729b154747"
},
{
"old": "911e470b76d78e6a1ddd73c8e3e88a3ce821e43c",
"new": "7450fb71218e3736878d52bd7ce6a3a60ed531ba",
"old_patch_id": "1cf1916dab2a8552fadd07ce81246fce5f105b3d",
"new_patch_id": "1cf1916dab2a8552fadd07ce81246fce5f105b3d"
},
{
"old": "4a8b5c3ff98bfd9c31d6bfeb5356570df240e98c",
"new": "d202f6d631ccfe413621b6ef99d1c20f82578a0a",
"old_patch_id": "c93ea22b2651163be712ebb7ce96c8230ee41da8",
"new_patch_id": "c93ea22b2651163be712ebb7ce96c8230ee41da8"
},
{
"old": "e18b90e95dd928743c53d63449a82ffaffe360e8",
"new": "37c97b41d58b487f994591310383b48eec3383a9",
"old_patch_id": "aee9e5492bf07ee71687fd899c4e632bb36bc1e3",
"new_patch_id": "aee9e5492bf07ee71687fd899c4e632bb36bc1e3"
},
{
"old": "67776714515b562dd29a15d6a0a3bea9d642e6f2",
"new": "7bca9b042f245ff519ce58f57fbd57ce60359fbd",
"old_patch_id": "d2aecebf222474b0e06c5109b5f22caf768176ce",
"new_patch_id": "d2aecebf222474b0e06c5109b5f22caf768176ce"
},
{
"old": "c733371c5c297291b9d06c2dd2772e22670fe653",
"new": "3a2022038fa9fce043f7cf0e34b564ba3625e409",
"old_patch_id": "efb06f08af899d8f03390ab24ab65f6558cbae58",
"new_patch_id": "efb06f08af899d8f03390ab24ab65f6558cbae58"
},
{
"old": "141b79c293d78e78b9ce05bcf0fcaa18ba4d6963",
"new": "614bdc8e9b2692856972a252e4452c91990bc18b",
"old_patch_id": "e29f40a61cc88532701f0b063154a0cbe8d7ba7b",
"new_patch_id": "e29f40a61cc88532701f0b063154a0cbe8d7ba7b"
},
{
"old": "d213ef6514eb696df5c3e44eaa36d2385e2900ab",
"new": "b9d3d4c75c78aa6b06aefd734da781bef9b7f1da",
"old_patch_id": "afdf42b5115e72fb0aaaded10aed6617a1d68cd2",
"new_patch_id": "afdf42b5115e72fb0aaaded10aed6617a1d68cd2"
}
]
@@ -0,0 +1,11 @@
1: a9c094d06 = 1: 0c44ba7c4 gander: design tester socket migration for host scripts
2: 2e81f7872 = 2: a1f3b4f31 test: prepare row253 socket fixtures and fix gate collisions
3: 3c8edc358 = 3: 1ecc23eb1 docs: propose row253 C4 session supervisor and draft hop fake
4: 3114087ef = 4: 18523ce92 docs(row253): freeze C4 repair for static review
5: 911e470b7 = 5: 7450fb712 docs(row253): store repair patch without context whitespace
6: 4a8b5c3ff = 6: d202f6d63 fix(row253): supervise socket queries across sudo sessions
7: e18b90e95 = 7: 37c97b41d fix(row253): bound cleanup retries after initial inventory
8: 677767145 = 8: 7bca9b042 docs(row253): record static approval and pre-confirmation residual
9: c733371c5 = 9: 3a2022038 docs(row253): record integration onto refactor 378a76b85
10: 141b79c29 = 10: 614bdc8e9 docs(row253): integrate row191 base and refresh manifest
11: d213ef651 = 11: b9d3d4c75 docs(row253): integrate 385a base and record dependency drift and bounds
@@ -0,0 +1,29 @@
[
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs"
]
@@ -0,0 +1,164 @@
{
"packages/cli/tests/case1-accept.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/cli/tests/case2-unit.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/bus/tests/account-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/chief-of-staff.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/comment-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/end-launch.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/fire-revokes-grants.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/gitea-grant.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/gitea-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/grant-executor.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/grant-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/lifecycle-revoke.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/message-filter.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/name-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/schema.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/sessions.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/spec-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/tester-writes.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/thread-claims.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/thread-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/threads.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/bus/tests/usage-migration.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
},
"packages/cli/tests/lifecycle.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/cli/tests/stack-release.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/cli/tests/thread-cli.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/cli/tests/thread-launch.test.mjs": {
"timeout_seconds": 900,
"kill_after_seconds": 10,
"outer_harness_seconds": 930,
"reason": "sage-2709: six CLI whole files use900s; measured durations establish later3x basis."
},
"packages/webui/tests/chat.test.mjs": {
"timeout_seconds": 300,
"kill_after_seconds": 10,
"outer_harness_seconds": 330,
"reason": "Whole-file bound under sage-2705; no prior repaired-C4 whole-file timing claimed."
}
}
@@ -0,0 +1,15 @@
# Row253 final base and pre-gate scope
Authority sage-2705. New branch gander/row253-aca1 on aca16404cf522b03f39acaf140e4f6185a507b88. Rebased source tip ed3bb376cdd5128dc58b3aa193282e1c2bfcf57d. Thirteen commits replayed from b78918850..288cdecf6; all thirteen final-hop range-diff pairs equal, no conflict. Earlier branches remain. The requested comparison from d213ef651 is range-diff-from-d213.txt; the two extra interim packet commits have no old counterpart, and the original BUILD-LOG context changes are documented in integration-b789/.
Seven manifest blobs are byte-identical to288cdecf6. Digest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. All seven sha256sum checks pass. Both append-only paths keep the entire final base as exact byte prefix. Final-hop upstream changes only Gizmoduck BUILD and queue JSON/rendering; none is a253 focused read or pinned asset. The earlier264a Store/schema dependency is present on the base and is covered by whole-file scope.
Duckworth's requested prefix-resolution material remains in integration-b789/NOTES.md, manifest-drift.diff and whole-test-union.json. This folder's drift is385a7194c..finalbase on the manifest paths and its whole union was independently recomputed:27 runnable files, unchanged from interim. Fixtures are exercised through importers, not represented as standalone tests. N9 is the exact sandbox bind case in case2; report its runtime skip reason verbatim.
## Bounds written before any run
Step2 runs all27 files whole, own case1/case2 first, then remaining sorted paths. Every call is timeout -k10 300 node --test --test-reporter=tap FILE; Python harness outer wait330s is a fallback. FILE-LIMITS.json records every file. Busy check gates each start, pipefail and tee capture raw logs and structured command JSONs. Any timeout is a stop, never a kill/pass; any unexpected red stops with no retry. Print HEAD and manifest digest first. No run starts before focused CLEAR. Expected duration10-15min; status every15min and immediate stop report.
The later whole gate remains separately gated. Every whole shell uses SHELL-LIMITS.json (ceil3xmax+120), recorded in BUILD.md. Script bytes unchanged; no no-record case, so900 fallback unused. Whole CLI needs a separately stated bound in its whole-gate plan because the historical whole result took597s; a300s file limit is not a claim about full-suite runtime. No carried results. No product/test/assertion changed during final integration.
No tests, Node, syntax commands, browser, probe, queue write or push have run while writing this packet. Publishing is authorized by sage-2705 after this record is committed. The next action is request focused CLEAR, then27 whole files, Duckworth rebase check and later whole-gate CLEAR.
@@ -0,0 +1,18 @@
{
"authority": "sage-2705",
"base": "aca16404cf522b03f39acaf140e4f6185a507b88",
"source_tip": "ed3bb376cdd5128dc58b3aa193282e1c2bfcf57d",
"branch": "gander/row253-aca1",
"manifest": "573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae",
"final_hop_paths": [
"agents/gizmoduck/work/queue-264/BUILD.md",
"docs/plans/QUEUE.md",
"docs/plans/queue.json"
],
"final_hop_conflicts": [],
"manifest_unchanged": true,
"all_7_blobs_equal_b789": true,
"append_prefix_checks": true,
"test_union_count": 27,
"tests_run": false
}
@@ -0,0 +1,78 @@
diff --git a/docs/plans/DEFERRED.md b/docs/plans/DEFERRED.md
index 4c0c736f1..f990eb3a9 100644
--- a/docs/plans/DEFERRED.md
+++ b/docs/plans/DEFERRED.md
@@ -431,17 +431,6 @@ at every gate. Started 2026-09-12 during the control board MVP.
comes near 64 runs. The follow-up row either raises the cap or splits
the done. Its test: a fire's done over the cap refuses, and the runs it
left alive still get the alive flag. (2026-10-22)
-- **A fired or deleted instance keeps its grants.** (Dewey on the row 236
- rebase look, dewey-0815; Mos mos-1271; Sage sage-2558.) Row 194's
- `instance.fire` and row 256's delete revoke only the roles entry's
- credential services through `revoke()` in `runtime.mjs`. The agent's
- host grants (row 235) and its Gitea user and token (row 236) stay live
- until a human runs `mosaic hosts revoke` or `mosaic grants revoke`. The
- Console has no revoke route and doesn't say a grant is left. Row 281
- (#1786) closes it: a fire or a delete revokes every host and Gitea grant
- the instance holds, fail closed, with a test for each kind. It lands
- before the .53 Case 1 install hires an instance with a grant.
- (2026-10-22)
- **The runs suite doesn't gate a change to `scripts/mosaic-task.mjs`.**
(Dewey N7 on row 191, repeated on the Vikunja 502 review.)
@@ -460,6 +449,44 @@ at every gate. Started 2026-09-12 during the control board MVP.
changes `packages/cli/tests/tester.test.mjs`: add the resolve pin so M8
dies on an assertion. (2026-10-22)
+- **Row 274's user reply check is scoped to the thread, not the session.**
+ (Row 264a r6, sage-2591.) In `packages/bus/src/broker.mjs`, the check that
+ a run answers a user only in reply to that user's message in its thread
+ joins `message_threads` by thread. That holds while a user's thread has
+ only its default session: a user can't call `session.create`, and
+ `#thread` refuses anyone but the owner. Binds row 272 (264e, #1777), or
+ any row that lets a user add sessions: make the check session-scoped and
+ test it with two sessions. (2026-10-22)
+
+- **Row 281's refusal texts point the wrong way.** (Dewey N1 and N2 on
+ the row 281 manifest round, dewey-0842/0843 and dewey-0846; Sage
+ sage-2653.) N1: when a host decision is still open and the host is
+ removed, step G's fire or delete job refuses `host-unknown`, and the
+ inbox hint names a verb that can't help. The way out is to decline or
+ withdraw the decision (`packages/bus/src/broker.mjs`, the closed check
+ near :1684 and `decision.withdraw` near :5015). T14 now pins that path.
+ N2: the chief's fire tool text in `packages/harness/src/tools.mjs`
+ (near :186) doesn't say the fire's job can come back for an answer.
+ Neither changes behaviour. Binds the next row that changes the step G
+ hint text in `broker.mjs` or the fire tool text in `tools.mjs`: fix
+ both wording gaps and pin the hint in a test. (2026-10-22)
+
+- **Row 264a's refusal check in sessions.test doesn't pin the actor.**
+ (Duckworth N1 on the row 264a r12 delta, duckworth-0138; Sage sage-2695.)
+ `refusedOnce` in `packages/bus/tests/sessions.test.mjs` checks that each
+ refused call adds one `action.refused` event with code `not-holder`, but
+ not that the event's `actor_run` is the refused run. Binds row 269 (264b,
+ #1774), or the next row that changes `sessions.test.mjs`: pin `actor_run`
+ in `refusedOnce`. (2026-10-22)
+
+- **editor-provenance skips its rebuild check on esbuild 0.28.1.** (Duckworth
+ N2 on the row 264a manifest round, duckworth-0146.) The webui test
+ "rebuilding from the source gives the same bytes" needs esbuild 0.28.2,
+ the checkout has 0.28.1, and the gate logs a skip (webui.log:99). The file
+ is at base and was not in 264a's manifest. Binds the next gate that
+ touches the webui build: install the pinned esbuild in the gate checkout
+ so the check runs, or record why it can't. (2026-10-22)
+
## Queue
Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
@@ -531,3 +558,10 @@ Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
`packages/cli/tests/gate-lane-auth.test.mjs` proves no gate step mounts
the host default. The real-model cases this moved off the gate are open
above.
+- A fired or deleted instance kept its grants (2026-10-22, Dewey on the
+ row 236 rebase look, mos-1271): closed by row 281 (#1786), landing
+ e479521d3. A fire or a delete now runs a step G job that revokes every
+ host and Gitea grant the instance holds, fail closed, and tells the
+ human in the inbox when it can't. Megavolt built it; Dewey approved the
+ design (d6) and the manifest (c30614). The text gaps it left are open
+ above.
@@ -0,0 +1,13 @@
1: e8b096948 = 1: 730a78aa9 gander: design tester socket migration for host scripts
2: 0d7f9da11 = 2: 643d16528 test: prepare row253 socket fixtures and fix gate collisions
3: 7c1fcbd96 = 3: 6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
4: 565302e71 = 4: 62de84882 docs(row253): freeze C4 repair for static review
5: bcf4e2501 = 5: c8cca3a68 docs(row253): store repair patch without context whitespace
6: f2c594d7b = 6: cca936716 fix(row253): supervise socket queries across sudo sessions
7: 29d5f0d5e = 7: 950cf47f3 fix(row253): bound cleanup retries after initial inventory
8: e24d7b559 = 8: 3b142c9c6 docs(row253): record static approval and pre-confirmation residual
9: 94c2b76b8 = 9: ad67d9595 docs(row253): record integration onto refactor 378a76b85
10: 049088866 = 10: 72b17562d docs(row253): integrate row191 base and refresh manifest
11: 7916f0ee6 = 11: e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
12: c75c9bbd3 = 12: cd269e733 docs(row253): record schema3l integration before final base correction
13: 288cdecf6 = 13: ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
@@ -0,0 +1,50 @@
1: a9c094d06 ! 1: 730a78aa9 gander: design tester socket migration for host scripts
@@ Commit message
gander: design tester socket migration for host scripts
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
- ### 2026-10-22 | Gander | row278 gate run3
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
+ 2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
+2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
## agents/gander/work/queue-253/BASE-PORT-INVENTORY.json (new) ##
2: 2e81f7872 = 2: 643d16528 test: prepare row253 socket fixtures and fix gate collisions
3: 3c8edc358 = 3: 6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
4: 3114087ef = 4: 62de84882 docs(row253): freeze C4 repair for static review
5: 911e470b7 = 5: c8cca3a68 docs(row253): store repair patch without context whitespace
6: 4a8b5c3ff ! 6: cca936716 fix(row253): supervise socket queries across sudo sessions
@@ Commit message
fix(row253): supervise socket queries across sudo sessions
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
+
+### 2026-10-21 row253 implementation prepared, gate pending
@@ agents/gander/work/queue-253/MANIFEST.sha256 (new)
## docs/plans/DEFERRED.md ##
@@ docs/plans/DEFERRED.md: Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
- `packages/cli/tests/gate-lane-auth.test.mjs` proves no gate step mounts
- the host default. The real-model cases this moved off the gate are open
+ human in the inbox when it can't. Megavolt built it; Dewey approved the
+ design (d6) and the manifest (c30614). The text gaps it left are open
above.
+
+## Row253 F5: legacy Case AS_USER supervision
7: e18b90e95 = 7: 950cf47f3 fix(row253): bound cleanup retries after initial inventory
8: 677767145 = 8: 3b142c9c6 docs(row253): record static approval and pre-confirmation residual
9: c733371c5 = 9: ad67d9595 docs(row253): record integration onto refactor 378a76b85
10: 141b79c29 = 10: 72b17562d docs(row253): integrate row191 base and refresh manifest
11: d213ef651 = 11: e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
-: --------- > 12: cd269e733 docs(row253): record schema3l integration before final base correction
-: --------- > 13: ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
@@ -0,0 +1,29 @@
[
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs"
]
@@ -0,0 +1,5 @@
# Row253 corrected base, pending final docs tip
Sage2700 moves the base tob78918850;2702 says one docs-only Gizmoduck BUILD commit still lands. Rebased on new branch gander/row253-b789, preserving gander/row253-264a. Resolved only BUILD-LOG and DEFERRED append conflicts, keeping every upstream entry first, then253. Both current files retain the full base blobs as exact byte prefixes. No source/test/assertion change.
Source tipc75c9bbd3339cb2343467715a14455044c2e4aea, manifest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. Six manifest blobs remain identical to the prior integration; DEFERRED absorbs the doc sweep. Runnable blobs match Duckworth-approved preview. The27-file union is unchanged. SHELL-LIMITS and script bytes are unchanged. No tests, Node, syntax execution, queue command, helper push or host action. Hold locally until Sage names final tip; then another rebase, no force-push, and focused CLEAR before any test.
@@ -0,0 +1,53 @@
{
"authority": [
"sage-2700",
"sage-2702"
],
"base": "b78918850",
"tip": "c75c9bbd3339cb2343467715a14455044c2e4aea",
"manifest": "573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae",
"conflicts": [
"BUILD-LOG.md first design append",
"docs/plans/DEFERRED.md first F5 append"
],
"resolution": "Kept upstream exact byte prefix then appended253; later253 appends replayed. No existing entry edited/dropped.",
"unchanged_runnable_paths": [
"packages/cli/tests/case-sudo-fixture.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"scripts/case1-accept.sh",
"scripts/case2-unit.sh"
],
"whole_test_files": [
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs"
],
"tests_run": false,
"published": false,
"next": "Wait final docs-only tip, rebase on a new name, publish when authorized, ask focused CLEAR. No test before CLEAR."
}
@@ -0,0 +1,78 @@
diff --git a/docs/plans/DEFERRED.md b/docs/plans/DEFERRED.md
index 4c0c736f1..f990eb3a9 100644
--- a/docs/plans/DEFERRED.md
+++ b/docs/plans/DEFERRED.md
@@ -431,17 +431,6 @@ at every gate. Started 2026-09-12 during the control board MVP.
comes near 64 runs. The follow-up row either raises the cap or splits
the done. Its test: a fire's done over the cap refuses, and the runs it
left alive still get the alive flag. (2026-10-22)
-- **A fired or deleted instance keeps its grants.** (Dewey on the row 236
- rebase look, dewey-0815; Mos mos-1271; Sage sage-2558.) Row 194's
- `instance.fire` and row 256's delete revoke only the roles entry's
- credential services through `revoke()` in `runtime.mjs`. The agent's
- host grants (row 235) and its Gitea user and token (row 236) stay live
- until a human runs `mosaic hosts revoke` or `mosaic grants revoke`. The
- Console has no revoke route and doesn't say a grant is left. Row 281
- (#1786) closes it: a fire or a delete revokes every host and Gitea grant
- the instance holds, fail closed, with a test for each kind. It lands
- before the .53 Case 1 install hires an instance with a grant.
- (2026-10-22)
- **The runs suite doesn't gate a change to `scripts/mosaic-task.mjs`.**
(Dewey N7 on row 191, repeated on the Vikunja 502 review.)
@@ -460,6 +449,44 @@ at every gate. Started 2026-09-12 during the control board MVP.
changes `packages/cli/tests/tester.test.mjs`: add the resolve pin so M8
dies on an assertion. (2026-10-22)
+- **Row 274's user reply check is scoped to the thread, not the session.**
+ (Row 264a r6, sage-2591.) In `packages/bus/src/broker.mjs`, the check that
+ a run answers a user only in reply to that user's message in its thread
+ joins `message_threads` by thread. That holds while a user's thread has
+ only its default session: a user can't call `session.create`, and
+ `#thread` refuses anyone but the owner. Binds row 272 (264e, #1777), or
+ any row that lets a user add sessions: make the check session-scoped and
+ test it with two sessions. (2026-10-22)
+
+- **Row 281's refusal texts point the wrong way.** (Dewey N1 and N2 on
+ the row 281 manifest round, dewey-0842/0843 and dewey-0846; Sage
+ sage-2653.) N1: when a host decision is still open and the host is
+ removed, step G's fire or delete job refuses `host-unknown`, and the
+ inbox hint names a verb that can't help. The way out is to decline or
+ withdraw the decision (`packages/bus/src/broker.mjs`, the closed check
+ near :1684 and `decision.withdraw` near :5015). T14 now pins that path.
+ N2: the chief's fire tool text in `packages/harness/src/tools.mjs`
+ (near :186) doesn't say the fire's job can come back for an answer.
+ Neither changes behaviour. Binds the next row that changes the step G
+ hint text in `broker.mjs` or the fire tool text in `tools.mjs`: fix
+ both wording gaps and pin the hint in a test. (2026-10-22)
+
+- **Row 264a's refusal check in sessions.test doesn't pin the actor.**
+ (Duckworth N1 on the row 264a r12 delta, duckworth-0138; Sage sage-2695.)
+ `refusedOnce` in `packages/bus/tests/sessions.test.mjs` checks that each
+ refused call adds one `action.refused` event with code `not-holder`, but
+ not that the event's `actor_run` is the refused run. Binds row 269 (264b,
+ #1774), or the next row that changes `sessions.test.mjs`: pin `actor_run`
+ in `refusedOnce`. (2026-10-22)
+
+- **editor-provenance skips its rebuild check on esbuild 0.28.1.** (Duckworth
+ N2 on the row 264a manifest round, duckworth-0146.) The webui test
+ "rebuilding from the source gives the same bytes" needs esbuild 0.28.2,
+ the checkout has 0.28.1, and the gate logs a skip (webui.log:99). The file
+ is at base and was not in 264a's manifest. Binds the next gate that
+ touches the webui build: install the pinned esbuild in the gate checkout
+ so the check runs, or record why it can't. (2026-10-22)
+
## Queue
Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
@@ -531,3 +558,10 @@ Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
`packages/cli/tests/gate-lane-auth.test.mjs` proves no gate step mounts
the host default. The real-model cases this moved off the gate are open
above.
+- A fired or deleted instance kept its grants (2026-10-22, Dewey on the
+ row 236 rebase look, mos-1271): closed by row 281 (#1786), landing
+ e479521d3. A fire or a delete now runs a step G job that revokes every
+ host and Gitea grant the instance holds, fail closed, and tells the
+ human in the inbox when it can't. Megavolt built it; Dewey approved the
+ design (d6) and the manifest (c30614). The text gaps it left are open
+ above.
@@ -0,0 +1,49 @@
1: 0c44ba7c4 ! 1: e8b096948 gander: design tester socket migration for host scripts
@@ Commit message
gander: design tester socket migration for host scripts
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
- ### 2026-10-22 | Gander | row278 gate run3
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
+ 2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
+2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
## agents/gander/work/queue-253/BASE-PORT-INVENTORY.json (new) ##
2: a1f3b4f31 = 2: 0d7f9da11 test: prepare row253 socket fixtures and fix gate collisions
3: 1ecc23eb1 = 3: 7c1fcbd96 docs: propose row253 C4 session supervisor and draft hop fake
4: 18523ce92 = 4: 565302e71 docs(row253): freeze C4 repair for static review
5: 7450fb712 = 5: bcf4e2501 docs(row253): store repair patch without context whitespace
6: d202f6d63 ! 6: f2c594d7b fix(row253): supervise socket queries across sudo sessions
@@ Commit message
fix(row253): supervise socket queries across sudo sessions
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
+
+### 2026-10-21 row253 implementation prepared, gate pending
@@ agents/gander/work/queue-253/MANIFEST.sha256 (new)
## docs/plans/DEFERRED.md ##
@@ docs/plans/DEFERRED.md: Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
- `packages/cli/tests/gate-lane-auth.test.mjs` proves no gate step mounts
- the host default. The real-model cases this moved off the gate are open
+ human in the inbox when it can't. Megavolt built it; Dewey approved the
+ design (d6) and the manifest (c30614). The text gaps it left are open
above.
+
+## Row253 F5: legacy Case AS_USER supervision
7: 37c97b41d = 7: 29d5f0d5e fix(row253): bound cleanup retries after initial inventory
8: 7bca9b042 = 8: e24d7b559 docs(row253): record static approval and pre-confirmation residual
9: 3a2022038 = 9: 94c2b76b8 docs(row253): record integration onto refactor 378a76b85
10: 614bdc8e9 = 10: 049088866 docs(row253): integrate row191 base and refresh manifest
11: b9d3d4c75 = 11: 7916f0ee6 docs(row253): integrate 385a base and record dependency drift and bounds
12: 2c383ef65 = 12: c75c9bbd3 docs(row253): record schema3l integration before final base correction
@@ -0,0 +1,49 @@
1: a9c094d06 ! 1: e8b096948 gander: design tester socket migration for host scripts
@@ Commit message
gander: design tester socket migration for host scripts
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
- ### 2026-10-22 | Gander | row278 gate run3
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
+ 2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
+2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
## agents/gander/work/queue-253/BASE-PORT-INVENTORY.json (new) ##
2: 2e81f7872 = 2: 0d7f9da11 test: prepare row253 socket fixtures and fix gate collisions
3: 3c8edc358 = 3: 7c1fcbd96 docs: propose row253 C4 session supervisor and draft hop fake
4: 3114087ef = 4: 565302e71 docs(row253): freeze C4 repair for static review
5: 911e470b7 = 5: bcf4e2501 docs(row253): store repair patch without context whitespace
6: 4a8b5c3ff ! 6: f2c594d7b fix(row253): supervise socket queries across sudo sessions
@@ Commit message
fix(row253): supervise socket queries across sudo sessions
## BUILD-LOG.md ##
-@@ BUILD-LOG.md: Before: managed project/thread verbs had no Console conversation area. After: fi
+@@ BUILD-LOG.md: Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version
- Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
+ 2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
+
+### 2026-10-21 row253 implementation prepared, gate pending
@@ agents/gander/work/queue-253/MANIFEST.sha256 (new)
## docs/plans/DEFERRED.md ##
@@ docs/plans/DEFERRED.md: Moved to `docs/plans/QUEUE.md` on 2026-09-13. This file holds only gaps.
- `packages/cli/tests/gate-lane-auth.test.mjs` proves no gate step mounts
- the host default. The real-model cases this moved off the gate are open
+ human in the inbox when it can't. Megavolt built it; Dewey approved the
+ design (d6) and the manifest (c30614). The text gaps it left are open
above.
+
+## Row253 F5: legacy Case AS_USER supervision
7: e18b90e95 = 7: 29d5f0d5e fix(row253): bound cleanup retries after initial inventory
8: 677767145 = 8: e24d7b559 docs(row253): record static approval and pre-confirmation residual
9: c733371c5 = 9: 94c2b76b8 docs(row253): record integration onto refactor 378a76b85
10: 141b79c29 = 10: 049088866 docs(row253): integrate row191 base and refresh manifest
11: d213ef651 = 11: 7916f0ee6 docs(row253): integrate 385a base and record dependency drift and bounds
-: --------- > 12: c75c9bbd3 docs(row253): record schema3l integration before final base correction
@@ -0,0 +1,29 @@
[
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/fire-revokes-grants.test.mjs",
"packages/bus/tests/gitea-grant.test.mjs",
"packages/bus/tests/gitea-migration.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/lifecycle-revoke.test.mjs",
"packages/bus/tests/message-filter.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/sessions.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/thread-claims.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/lifecycle.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/webui/tests/chat.test.mjs"
]
@@ -0,0 +1,13 @@
test(row253): expose peer failures and pin reasons (mos-1297)
The peer-output fixture execs isolated system Python to write its exact bytes
and exit with peer-status. This avoids masking parser/status faults behind the
supervisor session check. All17 faults assert an exact reason with a delimiter;
every existing assertion remains. No product change or timing delay.
Old packages/cli/tests/case1-accept.test.mjs:100:
const PYTHON_STUB = `[ -f "$HC/peer-output" ] && { cat "$HC/peer-output"; exit "$(cat "$HC/peer-status")"; }
Diagnostic under sage-2752 found probe-inner-session for malformed output and
nonzero exit. Mos confirmed the fixture mask and authorized this repair.
No tests ran after the repair; Duckworth review and fresh whole gate follow.
@@ -0,0 +1,11 @@
# Row253 mos1297 repair candidate
Source 362ec674c9e7aa8cef0c26f4d7448f459171dbd4, baseaca16404c. Manifest a2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e. Only case1-accept.test.mjs changes among the seven entries. No product script, shared fixture, other test or policy change. Source commit names mos1297 and quotes the exact old first line of PYTHON_STUB at0604:100.
One stub-line change only: when peer-output exists, exec /usr/bin/python3 -I -S, write that file's exact bytes to stdout and exit with peer-status. No fixed delay. All other stub lines remain byte-identical. The healthy Python path remains unchanged. This removes the confirmed instant-shell-exit mask while retaining the fixture's intended output/status fault.
Add a17-entry expected-reason map, taken from the accepted diagnostic-a/EXPECTED-REASONS draft, and one exact reason assertion per iteration. The new regex anchors the P10 line and requires the following space, so reason=probe does not accept probe-* codes. Every original status, boundary=failed and no-boundary=observed assertion line remains. peer-malformed=probe; peer-error=probe-inner-command. STATIC-PRESERVATION.json checks all old assertion lines remain and that the overflow/peer-hang bodies are byte-identical. No change to the peer-hang loose prefix. No result is claimed for the new code.
The original single diagnostic remains in diagnostic-a/. It observed15matches and2probe-inner-session mismatches on0604. Mos confirmed the source of that mask with their own no-Node supervisor controls, and authorized this fixture-only repair. Real fast-exit product behavior is post10-27 Vikunja532, with Sage owning its DEFERRED entry; no product repair or DEFERRED edit here.
Next: new manifest to Duckworth, then a complete whole gate from the start under Sage CLEAR, no carry from any old run. Both17-fault reasons must match the drafted oracle. The C4 overflow test must still give reason=probe-output-limit. The named P10 test must killM21 on assertions. If M21 survives or either reason differs, stop to Mos before anything else changes. All other existing gates/limits and exact restores stand. No Node, syntax test, payload experiment or repaired test run occurred after the change.
@@ -0,0 +1,45 @@
diff --git a/packages/cli/tests/case1-accept.test.mjs b/packages/cli/tests/case1-accept.test.mjs
index 5baddb646..b2673c325 100644
--- a/packages/cli/tests/case1-accept.test.mjs
+++ b/packages/cli/tests/case1-accept.test.mjs
@@ -97,7 +97,7 @@ const NODE_STUB = `[ "$HOME" = "$ROOT_DIR/srv/mosaic" ] || touch "$HC/node-as-ro
[ "\${1:-}" = --version ] && { cat "$HC/node-version"; exit 0; }
exec "$REAL_NODE" "$@"`;
// The real Python payload runs against a mock socket object, never an OS listener.
-const PYTHON_STUB = `[ -f "$HC/peer-output" ] && { cat "$HC/peer-output"; exit "$(cat "$HC/peer-status")"; }
+const PYTHON_STUB = `[ -f "$HC/peer-output" ] && exec /usr/bin/python3 -I -S -c 'import os,sys; root=os.environ["HC"]; sys.stdout.buffer.write(open(root+"/peer-output","rb").read()); sys.exit(int(open(root+"/peer-status").read()))'
[ -f "$HC/peer-hang" ] && {
here="$BASHPID"; read -r sid < <(/bin/ps -o sid= -p "$here")
echo "$here" > "$HC/peer-pid"; printf '%s %s\\n' "$here" "$sid" >> "$HC/query-pids"
@@ -260,11 +260,31 @@ test('row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python witho
'changed-pid':h=>put(join(h.hc,'peer-pid-change'),'ActiveState=active\nUser=mosaic\nMainPID=201\n'),
floor:h=>put(join(h.root,'proc/sys/net/ipv4/ip_unprivileged_port_start'),'700\n'),
};
+ const reasons = {
+ "parent-mode": "metadata",
+ "parent-owner": "metadata",
+ "socket-mode": "metadata",
+ "socket-owner": "metadata",
+ "socket-type": "metadata",
+ "symlink": "metadata",
+ "peer": "peer",
+ "peer-pid": "peer",
+ "python-mode": "interpreter",
+ "python-missing": "interpreter",
+ "python-not-elf": "interpreter",
+ "peer-malformed": "probe",
+ "peer-error": "probe-inner-command",
+ "peer-uid-fields": "metadata",
+ "changed-inode": "changed",
+ "changed-pid": "changed",
+ "floor": "floor",
+ };
for(const [name,fault] of Object.entries(faults)){
const h=host(t);fault(h);const r=run(h);
assert.equal(r.status,name==='peer-uid-fields'?1:0,`${name}: ${r.out}${r.err}`);
assert.match(r.out,/P10 tester-socket-squat unnamed boundary=failed/,name);
assert.doesNotMatch(r.out,/boundary=observed/,name);
+ assert.match(r.out,new RegExp('^P10 tester-socket-squat unnamed boundary=failed reason='+reasons[name]+' ', 'm'),name);
}
});
@@ -0,0 +1,22 @@
{
"authority": "mos-1297",
"source_commit": "362ec674c9e7aa8cef0c26f4d7448f459171dbd4",
"base": "aca16404cf522b03f39acaf140e4f6185a507b88",
"previous_product": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b",
"previous_manifest": "573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae",
"manifest": "a2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e",
"changed_manifest_paths": [
"packages/cli/tests/case1-accept.test.mjs"
],
"hashes": {
"docs/plans/DEFERRED.md": "f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3",
"packages/cli/tests/case-sudo-fixture.mjs": "b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008",
"packages/cli/tests/case1-accept.test.mjs": "27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a",
"packages/cli/tests/case2-unit.test.mjs": "1e0696eb196e83a0766b433ef71f27df0a3f8fcb6399787ab8c1c0f05c54dc44",
"packages/webui/README.md": "ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46",
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b"
},
"tests_run": false,
"gate": "Entire whole gate from start, no carry. M21 must be assertion-killed by named P10 test; malformed/error reasons must match draft or stop to Mos before any further change."
}
@@ -0,0 +1,14 @@
{
"authority": "mos-1297",
"changed_test": "packages/cli/tests/case1-accept.test.mjs",
"old_assertion_lines": 121,
"all_old_assertions_preserved": true,
"new_assertions": [
" assert.match(r.out,new RegExp('^P10 tester-socket-squat unnamed boundary=failed reason='+reasons[name]+' ', 'm'),name);"
],
"stub_first_line_only": true,
"overflow_tests_byte_identical": true,
"peer_hang_test_byte_identical": true,
"expected_reason_count": 17,
"tests_run": false
}
@@ -0,0 +1,3 @@
# mos-1298 candidate
Source 14e46006171ef700a72f971fda5cb3a0b8dcc4f2; manifest 591020a1096a1606c11f2ee34b37243acddf83d91c69922ccc5cfe22d6180d3a. Two inserted lines read the first query-pids record as numbers and assert PID equals SID, inside the existing per-kind/per-mode loop. All prior test bytes remain. Both product scripts match e1bc766d8 exactly. BUILD.md and c4/REPAIR-README.md correct the M38 kill rule. No execution since the stop; fresh whole gate after review and CLEAR, no carry.
@@ -0,0 +1,13 @@
diff --git a/packages/cli/tests/case2-unit.test.mjs b/packages/cli/tests/case2-unit.test.mjs
index 834f8d848..78dd77721 100644
--- a/packages/cli/tests/case2-unit.test.mjs
+++ b/packages/cli/tests/case2-unit.test.mjs
@@ -199,6 +199,8 @@ for(const kind of ['sleep','signals','member']) test(`row253 C4 ${kind} query ha
const capture=cleanupFixture(t,files);const stopGuard=fixtureGuard(t,files);
const start=performance.now(),r=unit(h,{profile:'factory'}),seconds=(performance.now()-start)/1000;capture();
refuses(r,/^case2-unit: tester config query inner-timeout\n$/);
+ const [queryPid,querySid]=read(queries).trim().split('\n')[0].trim().split(/\s+/).map(Number);
+ assert.equal(queryPid,querySid,`${kind}/${mode}: direct query PID must equal its kernel SID`);
assert.ok(seconds<7,`${kind}/${mode}: ${seconds}s exceeds outer bound`);
assert.deepEqual(await pollFixtureGone(files),[],mode);
if(kind==='member')assert.ok(read(proof).includes('('+member.split('/').at(-1)+') '),'member comm with newline and closing parenthesis was observed');
@@ -0,0 +1,20 @@
{
"source": "14e46006171ef700a72f971fda5cb3a0b8dcc4f2",
"previous": "e1bc766d87a0c6b8894aff93a221315a044cb36a",
"manifest": "591020a1096a1606c11f2ee34b37243acddf83d91c69922ccc5cfe22d6180d3a",
"paths": {
"docs/plans/DEFERRED.md": "f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3",
"packages/cli/tests/case-sudo-fixture.mjs": "b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008",
"packages/cli/tests/case1-accept.test.mjs": "27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a",
"packages/cli/tests/case2-unit.test.mjs": "9ca67403d8614266061624ab5fbf4ea8e8a54cbd08f5b569c95592ab5ed40472",
"packages/webui/README.md": "ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46",
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b"
},
"existing_test_lines_byte_identical": true,
"scripts_unchanged": {
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b"
},
"execution": "No test, Node preflight or experiment run; pending Duckworth review and Sage CLEAR"
}
@@ -0,0 +1,164 @@
{
"packages/cli/tests/case1-accept.test.mjs": {
"recorded_seconds": 99.281,
"receipt": "agents/gander/work/queue-253/run3-focused/files/01.log",
"next_limit_seconds": 418,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/case2-unit.test.mjs": {
"recorded_seconds": 66.418,
"receipt": "agents/gander/work/queue-253/run3-focused/files/02.log",
"next_limit_seconds": 320,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/account-migration.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/03.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/chief-of-staff.test.mjs": {
"recorded_seconds": 2.168,
"receipt": "agents/gander/work/queue-253/run3-focused/files/04.log",
"next_limit_seconds": 127,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/comment-migration.test.mjs": {
"recorded_seconds": 0.565,
"receipt": "agents/gander/work/queue-253/run3-focused/files/05.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/end-launch.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/06.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/fire-revokes-grants.test.mjs": {
"recorded_seconds": 3.271,
"receipt": "agents/gander/work/queue-253/run3-focused/files/07.log",
"next_limit_seconds": 130,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/gitea-grant.test.mjs": {
"recorded_seconds": 8.634,
"receipt": "agents/gander/work/queue-253/run3-focused/files/08.log",
"next_limit_seconds": 146,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/gitea-migration.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/09.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/grant-executor.test.mjs": {
"recorded_seconds": 21.562,
"receipt": "agents/gander/work/queue-253/run3-focused/files/10.log",
"next_limit_seconds": 185,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/grant-migration.test.mjs": {
"recorded_seconds": 0.465,
"receipt": "agents/gander/work/queue-253/run3-focused/files/11.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/lifecycle-revoke.test.mjs": {
"recorded_seconds": 0.665,
"receipt": "agents/gander/work/queue-253/run3-focused/files/12.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/message-filter.test.mjs": {
"recorded_seconds": 0.515,
"receipt": "agents/gander/work/queue-253/run3-focused/files/13.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/name-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/14.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/schema.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/15.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/sessions.test.mjs": {
"recorded_seconds": 0.615,
"receipt": "agents/gander/work/queue-253/run3-focused/files/16.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/spec-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/17.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/tester-writes.test.mjs": {
"recorded_seconds": 0.565,
"receipt": "agents/gander/work/queue-253/run3-focused/files/18.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/thread-claims.test.mjs": {
"recorded_seconds": 0.264,
"receipt": "agents/gander/work/queue-253/run3-focused/files/19.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/thread-migration.test.mjs": {
"recorded_seconds": 0.365,
"receipt": "agents/gander/work/queue-253/run3-focused/files/20.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/threads.test.mjs": {
"recorded_seconds": 1.216,
"receipt": "agents/gander/work/queue-253/run3-focused/files/21.log",
"next_limit_seconds": 124,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/usage-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/22.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/lifecycle.test.mjs": {
"recorded_seconds": 13.296,
"receipt": "agents/gander/work/queue-253/run3-focused/files/23.log",
"next_limit_seconds": 160,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/stack-release.test.mjs": {
"recorded_seconds": 583.453,
"receipt": "agents/gander/work/queue-253/run3-focused/files/24.log",
"next_limit_seconds": 1871,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/thread-cli.test.mjs": {
"recorded_seconds": 1.876,
"receipt": "agents/gander/work/queue-253/run3-focused/files/25.log",
"next_limit_seconds": 126,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/thread-launch.test.mjs": {
"recorded_seconds": 16.603,
"receipt": "agents/gander/work/queue-253/run3-focused/files/26.log",
"next_limit_seconds": 170,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/webui/tests/chat.test.mjs": {
"recorded_seconds": 0.515,
"receipt": "agents/gander/work/queue-253/run3-focused/files/27.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
}
}
@@ -0,0 +1,7 @@
# Focused window notes
Grant sage-2709 at14:29:21Z, test run start14:30:03Z. First busy check passed; no busy refusal occurred. Sage2711 reports one unrelated canonical queue write by Gizmoduck at14:29:42Z, row269 rev3217, and authorizes rechecking if it trips a busy guard. No recheck or test retry was needed. No test path was changed by that write. Later file results determine the gate outcome; no timing explanation is assumed.
Duckworth0149 static integration check has no blockers on0604d91fc /573c51cf. Focused logs will supply HEAD/digest,27 file totals and every skip, including exact N9 case2 skip.
Sage2714 reports Darkwing queue-show reads around14:31Z and two Python read operations at14:32Z, outside this worktree/TMPDIR. No own busy refusal or retry occurred. No test impact observed; no causal claim made about timings. This seat did not access the live data named in that notice.
@@ -0,0 +1,37 @@
# Focused27 whole-file results
| Whole file | Pass/fail/skip | Wall seconds | Command limit seconds | Next3x plus120 basis |
|---|---:|---:|---:|---:|
| packages/cli/tests/case1-accept.test.mjs | 34/0/0 | 99.281 | 900 | 418 |
| packages/cli/tests/case2-unit.test.mjs | 43/0/0 | 66.418 | 900 | 320 |
| packages/bus/tests/account-migration.test.mjs | 3/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/chief-of-staff.test.mjs | 42/0/0 | 2.168 | 300 | 127 |
| packages/bus/tests/comment-migration.test.mjs | 5/0/0 | 0.565 | 300 | 122 |
| packages/bus/tests/end-launch.test.mjs | 7/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/fire-revokes-grants.test.mjs | 22/0/0 | 3.271 | 300 | 130 |
| packages/bus/tests/gitea-grant.test.mjs | 49/0/0 | 8.634 | 300 | 146 |
| packages/bus/tests/gitea-migration.test.mjs | 5/0/0 | 0.415 | 300 | 122 |
| packages/bus/tests/grant-executor.test.mjs | 42/0/0 | 21.562 | 300 | 185 |
| packages/bus/tests/grant-migration.test.mjs | 6/0/0 | 0.465 | 300 | 122 |
| packages/bus/tests/lifecycle-revoke.test.mjs | 8/0/0 | 0.665 | 300 | 122 |
| packages/bus/tests/message-filter.test.mjs | 6/0/0 | 0.515 | 300 | 122 |
| packages/bus/tests/name-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/schema.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/sessions.test.mjs | 7/0/0 | 0.615 | 300 | 122 |
| packages/bus/tests/spec-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/bus/tests/tester-writes.test.mjs | 8/0/0 | 0.565 | 300 | 122 |
| packages/bus/tests/thread-claims.test.mjs | 6/0/0 | 0.264 | 300 | 121 |
| packages/bus/tests/thread-migration.test.mjs | 3/0/0 | 0.365 | 300 | 122 |
| packages/bus/tests/threads.test.mjs | 17/0/0 | 1.216 | 300 | 124 |
| packages/bus/tests/usage-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
| packages/cli/tests/lifecycle.test.mjs | 24/0/0 | 13.296 | 900 | 160 |
| packages/cli/tests/stack-release.test.mjs | 218/0/0 | 583.453 | 900 | 1871 |
| packages/cli/tests/thread-cli.test.mjs | 11/0/0 | 1.876 | 900 | 126 |
| packages/cli/tests/thread-launch.test.mjs | 11/0/0 | 16.603 | 900 | 170 |
| packages/webui/tests/chat.test.mjs | 23/0/0 | 0.515 | 300 | 122 |
N9 verbatim: ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
Every skip:
@@ -0,0 +1,625 @@
{
"status": "GREEN",
"grant": "sage-2709",
"candidate": "0604d91fcfc1949810cd5321aea6ec43e9b74b4b",
"manifest": "573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae",
"counts": {
"pass": 604,
"fail": 0,
"skipped": 0
},
"steps": [
{
"code": 0,
"timeout": false,
"seconds": 99.281,
"log": "agents/gander/work/queue-253/run3-focused/files/01.log",
"file": "packages/cli/tests/case1-accept.test.mjs",
"counts": {
"tests": 34,
"pass": 34,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 66.418,
"log": "agents/gander/work/queue-253/run3-focused/files/02.log",
"file": "packages/cli/tests/case2-unit.test.mjs",
"counts": {
"tests": 43,
"pass": 43,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.415,
"log": "agents/gander/work/queue-253/run3-focused/files/03.log",
"file": "packages/bus/tests/account-migration.test.mjs",
"counts": {
"tests": 3,
"pass": 3,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 2.168,
"log": "agents/gander/work/queue-253/run3-focused/files/04.log",
"file": "packages/bus/tests/chief-of-staff.test.mjs",
"counts": {
"tests": 42,
"pass": 42,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.565,
"log": "agents/gander/work/queue-253/run3-focused/files/05.log",
"file": "packages/bus/tests/comment-migration.test.mjs",
"counts": {
"tests": 5,
"pass": 5,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.415,
"log": "agents/gander/work/queue-253/run3-focused/files/06.log",
"file": "packages/bus/tests/end-launch.test.mjs",
"counts": {
"tests": 7,
"pass": 7,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 3.271,
"log": "agents/gander/work/queue-253/run3-focused/files/07.log",
"file": "packages/bus/tests/fire-revokes-grants.test.mjs",
"counts": {
"tests": 22,
"pass": 22,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 8.634,
"log": "agents/gander/work/queue-253/run3-focused/files/08.log",
"file": "packages/bus/tests/gitea-grant.test.mjs",
"counts": {
"tests": 49,
"pass": 49,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.415,
"log": "agents/gander/work/queue-253/run3-focused/files/09.log",
"file": "packages/bus/tests/gitea-migration.test.mjs",
"counts": {
"tests": 5,
"pass": 5,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 21.562,
"log": "agents/gander/work/queue-253/run3-focused/files/10.log",
"file": "packages/bus/tests/grant-executor.test.mjs",
"counts": {
"tests": 42,
"pass": 42,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.465,
"log": "agents/gander/work/queue-253/run3-focused/files/11.log",
"file": "packages/bus/tests/grant-migration.test.mjs",
"counts": {
"tests": 6,
"pass": 6,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.665,
"log": "agents/gander/work/queue-253/run3-focused/files/12.log",
"file": "packages/bus/tests/lifecycle-revoke.test.mjs",
"counts": {
"tests": 8,
"pass": 8,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.515,
"log": "agents/gander/work/queue-253/run3-focused/files/13.log",
"file": "packages/bus/tests/message-filter.test.mjs",
"counts": {
"tests": 6,
"pass": 6,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.214,
"log": "agents/gander/work/queue-253/run3-focused/files/14.log",
"file": "packages/bus/tests/name-migration.test.mjs",
"counts": {
"tests": 1,
"pass": 1,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.214,
"log": "agents/gander/work/queue-253/run3-focused/files/15.log",
"file": "packages/bus/tests/schema.test.mjs",
"counts": {
"tests": 1,
"pass": 1,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.615,
"log": "agents/gander/work/queue-253/run3-focused/files/16.log",
"file": "packages/bus/tests/sessions.test.mjs",
"counts": {
"tests": 7,
"pass": 7,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.214,
"log": "agents/gander/work/queue-253/run3-focused/files/17.log",
"file": "packages/bus/tests/spec-migration.test.mjs",
"counts": {
"tests": 1,
"pass": 1,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.565,
"log": "agents/gander/work/queue-253/run3-focused/files/18.log",
"file": "packages/bus/tests/tester-writes.test.mjs",
"counts": {
"tests": 8,
"pass": 8,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.264,
"log": "agents/gander/work/queue-253/run3-focused/files/19.log",
"file": "packages/bus/tests/thread-claims.test.mjs",
"counts": {
"tests": 6,
"pass": 6,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.365,
"log": "agents/gander/work/queue-253/run3-focused/files/20.log",
"file": "packages/bus/tests/thread-migration.test.mjs",
"counts": {
"tests": 3,
"pass": 3,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 1.216,
"log": "agents/gander/work/queue-253/run3-focused/files/21.log",
"file": "packages/bus/tests/threads.test.mjs",
"counts": {
"tests": 17,
"pass": 17,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.214,
"log": "agents/gander/work/queue-253/run3-focused/files/22.log",
"file": "packages/bus/tests/usage-migration.test.mjs",
"counts": {
"tests": 1,
"pass": 1,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 13.296,
"log": "agents/gander/work/queue-253/run3-focused/files/23.log",
"file": "packages/cli/tests/lifecycle.test.mjs",
"counts": {
"tests": 24,
"pass": 24,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 583.453,
"log": "agents/gander/work/queue-253/run3-focused/files/24.log",
"file": "packages/cli/tests/stack-release.test.mjs",
"counts": {
"tests": 218,
"pass": 218,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 1.876,
"log": "agents/gander/work/queue-253/run3-focused/files/25.log",
"file": "packages/cli/tests/thread-cli.test.mjs",
"counts": {
"tests": 11,
"pass": 11,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 16.603,
"log": "agents/gander/work/queue-253/run3-focused/files/26.log",
"file": "packages/cli/tests/thread-launch.test.mjs",
"counts": {
"tests": 11,
"pass": 11,
"fail": 0,
"skipped": 0
},
"named_skips": []
},
{
"code": 0,
"timeout": false,
"seconds": 0.515,
"log": "agents/gander/work/queue-253/run3-focused/files/27.log",
"file": "packages/webui/tests/chat.test.mjs",
"counts": {
"tests": 23,
"pass": 23,
"fail": 0,
"skipped": 0
},
"named_skips": []
}
],
"named_skips": [],
"n9_exact_line": "ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds",
"file_seconds_sum": 824.413,
"next_file_limits": {
"packages/cli/tests/case1-accept.test.mjs": {
"recorded_seconds": 99.281,
"receipt": "agents/gander/work/queue-253/run3-focused/files/01.log",
"next_limit_seconds": 418,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/case2-unit.test.mjs": {
"recorded_seconds": 66.418,
"receipt": "agents/gander/work/queue-253/run3-focused/files/02.log",
"next_limit_seconds": 320,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/account-migration.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/03.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/chief-of-staff.test.mjs": {
"recorded_seconds": 2.168,
"receipt": "agents/gander/work/queue-253/run3-focused/files/04.log",
"next_limit_seconds": 127,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/comment-migration.test.mjs": {
"recorded_seconds": 0.565,
"receipt": "agents/gander/work/queue-253/run3-focused/files/05.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/end-launch.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/06.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/fire-revokes-grants.test.mjs": {
"recorded_seconds": 3.271,
"receipt": "agents/gander/work/queue-253/run3-focused/files/07.log",
"next_limit_seconds": 130,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/gitea-grant.test.mjs": {
"recorded_seconds": 8.634,
"receipt": "agents/gander/work/queue-253/run3-focused/files/08.log",
"next_limit_seconds": 146,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/gitea-migration.test.mjs": {
"recorded_seconds": 0.415,
"receipt": "agents/gander/work/queue-253/run3-focused/files/09.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/grant-executor.test.mjs": {
"recorded_seconds": 21.562,
"receipt": "agents/gander/work/queue-253/run3-focused/files/10.log",
"next_limit_seconds": 185,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/grant-migration.test.mjs": {
"recorded_seconds": 0.465,
"receipt": "agents/gander/work/queue-253/run3-focused/files/11.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/lifecycle-revoke.test.mjs": {
"recorded_seconds": 0.665,
"receipt": "agents/gander/work/queue-253/run3-focused/files/12.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/message-filter.test.mjs": {
"recorded_seconds": 0.515,
"receipt": "agents/gander/work/queue-253/run3-focused/files/13.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/name-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/14.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/schema.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/15.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/sessions.test.mjs": {
"recorded_seconds": 0.615,
"receipt": "agents/gander/work/queue-253/run3-focused/files/16.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/spec-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/17.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/tester-writes.test.mjs": {
"recorded_seconds": 0.565,
"receipt": "agents/gander/work/queue-253/run3-focused/files/18.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/thread-claims.test.mjs": {
"recorded_seconds": 0.264,
"receipt": "agents/gander/work/queue-253/run3-focused/files/19.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/thread-migration.test.mjs": {
"recorded_seconds": 0.365,
"receipt": "agents/gander/work/queue-253/run3-focused/files/20.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/threads.test.mjs": {
"recorded_seconds": 1.216,
"receipt": "agents/gander/work/queue-253/run3-focused/files/21.log",
"next_limit_seconds": 124,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/bus/tests/usage-migration.test.mjs": {
"recorded_seconds": 0.214,
"receipt": "agents/gander/work/queue-253/run3-focused/files/22.log",
"next_limit_seconds": 121,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/lifecycle.test.mjs": {
"recorded_seconds": 13.296,
"receipt": "agents/gander/work/queue-253/run3-focused/files/23.log",
"next_limit_seconds": 160,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/stack-release.test.mjs": {
"recorded_seconds": 583.453,
"receipt": "agents/gander/work/queue-253/run3-focused/files/24.log",
"next_limit_seconds": 1871,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/thread-cli.test.mjs": {
"recorded_seconds": 1.876,
"receipt": "agents/gander/work/queue-253/run3-focused/files/25.log",
"next_limit_seconds": 126,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/cli/tests/thread-launch.test.mjs": {
"recorded_seconds": 16.603,
"receipt": "agents/gander/work/queue-253/run3-focused/files/26.log",
"next_limit_seconds": 170,
"derivation": "ceil(3*measured whole-file seconds)+120"
},
"packages/webui/tests/chat.test.mjs": {
"recorded_seconds": 0.515,
"receipt": "agents/gander/work/queue-253/run3-focused/files/27.log",
"next_limit_seconds": 122,
"derivation": "ceil(3*measured whole-file seconds)+120"
}
},
"timeout_count": 0,
"source_manifest_verified": true,
"sweep": {
"timestamp": "2026-10-22T14:45:17.148081+00:00",
"count": 0,
"remaining": [],
"excluded_preexisting_infrastructure": [
{
"pid": 2469277,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.360000+00:00"
},
{
"pid": 2469278,
"comm": "npm exec @model",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.370000+00:00"
},
{
"pid": 2469279,
"comm": "npm exec chrome",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.370000+00:00"
},
{
"pid": 2469292,
"comm": "npm exec @playw",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:57.380000+00:00"
},
{
"pid": 2469478,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:58.770000+00:00"
},
{
"pid": 2469485,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:58.800000+00:00"
},
{
"pid": 2469518,
"comm": "chrome-devtools",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:59.100000+00:00"
},
{
"pid": 2469601,
"comm": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:20:59.440000+00:00"
},
{
"pid": 2470486,
"comm": "codex-code-mode",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"started_utc": "2026-10-22T14:21:07.580000+00:00"
}
],
"note": "Read-only /proc cwd sweep, including deleted cwd under this run TMPDIR. Own ancestry excluded. Only known MCP/npm/code-mode infrastructure PIDs with pre-run start ticks are excluded. No signalling."
},
"start": "2026-10-22T14:30:03Z",
"end": "2026-10-22T14:44:57Z",
"wall_seconds": 894.0
}
@@ -0,0 +1 @@
/mnt/storage/scratch/tmp/gMJyGKC
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
2026-10-22T14:44:57Z
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/case1-accept.test.mjs"]
@@ -0,0 +1,214 @@
TAP version 13
# Subtest: row253 socket observation uses configured root, metadata and the Console peer without sending bytes
ok 1 - row253 socket observation uses configured root, metadata and the Console peer without sending bytes
---
duration_ms: 635.08322
type: 'test'
...
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
ok 2 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
---
duration_ms: 8910.768359
type: 'test'
...
# Subtest: row253 acceptance rejects bad config and unsupported copies before talk
ok 3 - row253 acceptance rejects bad config and unsupported copies before talk
---
duration_ms: 1287.210524
type: 'test'
...
# Subtest: row253 stalled peer observation ends within its bound without leaving a reader
ok 4 - row253 stalled peer observation ends within its bound without leaving a reader
---
duration_ms: 2759.173042
type: 'test'
...
# Subtest: row253 P8 refuses both retired TCP and board listeners
ok 5 - row253 P8 refuses both retired TCP and board listeners
---
duration_ms: 1495.993888
type: 'test'
...
# Subtest: row253 C4 acceptance query inner reason holds under both sudo models
ok 6 - row253 C4 acceptance query inner reason holds under both sudo models
---
duration_ms: 10714.050013
type: 'test'
...
# Subtest: row253 C4 acceptance query outer reason discards stdout and names residual cleanup
ok 7 - row253 C4 acceptance query outer reason discards stdout and names residual cleanup
---
duration_ms: 14202.380117
type: 'test'
...
# Subtest: row253 C4 acceptance query overflow is output-limit in both models
ok 8 - row253 C4 acceptance query overflow is output-limit in both models
---
duration_ms: 533.74284
type: 'test'
...
# Subtest: row253 C4 P10 inner reason holds under both sudo models
ok 9 - row253 C4 P10 inner reason holds under both sudo models
---
duration_ms: 5977.183052
type: 'test'
...
# Subtest: row253 C4 P10 outer reason holds under both sudo models
ok 10 - row253 C4 P10 outer reason holds under both sudo models
---
duration_ms: 9158.961886
type: 'test'
...
# Subtest: row253 C4 P10 overflow reason holds under both sudo models
ok 11 - row253 C4 P10 overflow reason holds under both sudo models
---
duration_ms: 1068.808446
type: 'test'
...
# Subtest: row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
ok 12 - row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
---
duration_ms: 657.788738
type: 'test'
...
# Subtest: row 195 accept: exits 1 with each F check failing alone, and its line names it
ok 13 - row 195 accept: exits 1 with each F check failing alone, and its line names it
---
duration_ms: 7275.151025
type: 'test'
...
# Subtest: row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
ok 14 - row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
---
duration_ms: 1359.251446
type: 'test'
...
# Subtest: row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
ok 15 - row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
---
duration_ms: 1214.848264
type: 'test'
...
# Subtest: row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
ok 16 - row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
---
duration_ms: 1318.107134
type: 'test'
...
# Subtest: row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
ok 17 - row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
---
duration_ms: 2891.844673
type: 'test'
...
# Subtest: row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
ok 18 - row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
---
duration_ms: 1370.822639
type: 'test'
...
# Subtest: row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
ok 19 - row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
---
duration_ms: 2098.024276
type: 'test'
...
# Subtest: row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
ok 20 - row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
---
duration_ms: 2106.445728
type: 'test'
...
# Subtest: row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
ok 21 - row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
---
duration_ms: 2002.61524
type: 'test'
...
# Subtest: row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
ok 22 - row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
---
duration_ms: 1861.992457
type: 'test'
...
# Subtest: row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
ok 23 - row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
---
duration_ms: 1901.812772
type: 'test'
...
# Subtest: row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
ok 24 - row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
---
duration_ms: 1431.808863
type: 'test'
...
# Subtest: row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
ok 25 - row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
---
duration_ms: 5915.695807
type: 'test'
...
# Subtest: row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
ok 26 - row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
---
duration_ms: 1423.353014
type: 'test'
...
# Subtest: row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
ok 27 - row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
---
duration_ms: 616.405224
type: 'test'
...
# Subtest: row 195 accept: P9 is unnamed once for each item missing
ok 28 - row 195 accept: P9 is unnamed once for each item missing
---
duration_ms: 3502.799413
type: 'test'
...
# Subtest: row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
ok 29 - row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
---
duration_ms: 1268.612039
type: 'test'
...
# Subtest: row 195 accept: every P check unnamed together still exits 0
ok 30 - row 195 accept: every P check unnamed together still exits 0
---
duration_ms: 517.656059
type: 'test'
...
# Subtest: row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
ok 31 - row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
---
duration_ms: 114.130545
type: 'test'
...
# Subtest: row 195 accept: usage errors and a run without --root as a user exit 2
ok 32 - row 195 accept: usage errors and a run without --root as a user exit 2
---
duration_ms: 12.783137
type: 'test'
...
# Subtest: row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
ok 33 - row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
---
duration_ms: 719.568395
type: 'test'
...
# Subtest: row 195 accept: the host check runs with --check and never --enforce
ok 34 - row 195 accept: the host check runs with --check and never --enforce
---
duration_ms: 753.65801
type: 'test'
...
1..34
# tests 34
# suites 0
# pass 34
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 99207.214655
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,268 @@
TAP version 13
# Subtest: row253 factory socket uses actual config and target-uid query without widening hardening
ok 1 - row253 factory socket uses actual config and target-uid query without widening hardening
---
duration_ms: 262.277524
type: 'test'
...
# Subtest: row253 installer refuses unsafe location and query facts before unit writes
ok 2 - row253 installer refuses unsafe location and query facts before unit writes
---
duration_ms: 2888.737963
type: 'test'
...
# Subtest: row253 query timeout kills its process group and leaves no running child
ok 3 - row253 query timeout kills its process group and leaves no running child
---
duration_ms: 7063.145938
type: 'test'
...
# Subtest: row253 protected homes refuse before any filesystem access
ok 4 - row253 protected homes refuse before any filesystem access
---
duration_ms: 9.095629
type: 'test'
...
# Subtest: row253 C4 sleep query has exact inner reason and cleans all members
ok 5 - row253 C4 sleep query has exact inner reason and cleans all members
---
duration_ms: 10654.435358
type: 'test'
...
# Subtest: row253 C4 signals query has exact inner reason and cleans all members
ok 6 - row253 C4 signals query has exact inner reason and cleans all members
---
duration_ms: 10558.851516
type: 'test'
...
# Subtest: row253 C4 member query has exact inner reason and cleans all members
ok 7 - row253 C4 member query has exact inner reason and cleans all members
---
duration_ms: 10575.034076
type: 'test'
...
# Subtest: row253 C4 overflow is output-limit in both sudo modes
ok 8 - row253 C4 overflow is output-limit in both sudo modes
---
duration_ms: 356.84676
type: 'test'
...
# Subtest: row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
ok 9 - row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
---
duration_ms: 14132.115825
type: 'test'
...
# Subtest: row253 C4 inline supervisor is byte-identical in both host scripts
ok 10 - row253 C4 inline supervisor is byte-identical in both host scripts
---
duration_ms: 0.332222
type: 'test'
...
# Subtest: row253 C4 cleanup budget starts after inventory pass one
ok 11 - row253 C4 cleanup budget starts after inventory pass one
---
duration_ms: 27.312099
type: 'test'
...
# Subtest: row253 query reaps its group even when a child closes stdout before the query returns
ok 12 - row253 query reaps its group even when a child closes stdout before the query returns
---
duration_ms: 125.14664
type: 'test'
...
# Subtest: row253 config parser is strict
ok 13 - row253 config parser is strict
---
duration_ms: 8.171201
type: 'test'
...
# Subtest: a clean library render writes both units 0644 with the fixed lines, and enables both then starts the bus then the Console
ok 14 - a clean library render writes both units 0644 with the fixed lines, and enables both then starts the bus then the Console
---
duration_ms: 94.172642
type: 'test'
...
# Subtest: PATH starts with the --node directory, for a node outside the default list and for /usr/bin/node
ok 15 - PATH starts with the --node directory, for a node outside the default list and for /usr/bin/node
---
duration_ms: 93.781364
type: 'test'
...
# Subtest: a failed bus start refuses with the Console not started
ok 16 - a failed bus start refuses with the Console not started
---
duration_ms: 91.475307
type: 'test'
...
# Subtest: the script never links a unit file
ok 17 - the script never links a unit file
---
duration_ms: 0.17219
type: 'test'
...
# Subtest: factory renders --pm once and one MOSAIC_CLAUDE_BIN line, and without them both tokens render empty
ok 18 - factory renders --pm once and one MOSAIC_CLAUDE_BIN line, and without them both tokens render empty
---
duration_ms: 533.168317
type: 'test'
...
# Subtest: a re-install over running units says they are still on the old copy and must restart together, never that it started them
ok 19 - a re-install over running units says they are still on the old copy and must restart together, never that it started them
---
duration_ms: 410.859392
type: 'test'
...
# Subtest: a re-install to another copy re-renders both units, and an edited installed unit refuses
ok 20 - a re-install to another copy re-renders both units, and an edited installed unit refuses
---
duration_ms: 978.008405
type: 'test'
...
# Subtest: a template with a namespace, user or system call restriction refuses
ok 21 - a template with a namespace, user or system call restriction refuses
---
duration_ms: 262.771603
type: 'test'
...
# Subtest: the bus template's EnvironmentFile line must be there and point at the session env, and the Console template must have none
ok 22 - the bus template's EnvironmentFile line must be there and point at the session env, and the Console template must have none
---
duration_ms: 178.505576
type: 'test'
...
# Subtest: a template holding an unknown token, PermissionsStartOnly or a privileged Exec prefix refuses
ok 23 - a template holding an unknown token, PermissionsStartOnly or a privileged Exec prefix refuses
---
duration_ms: 135.131551
type: 'test'
...
# Subtest: a symlink at either unit path refuses
ok 24 - a symlink at either unit path refuses
---
duration_ms: 164.772609
type: 'test'
...
# Subtest: a --node that is relative, not root-owned or under <home> refuses
ok 25 - a --node that is relative, not root-owned or under <home> refuses
---
duration_ms: 18.273626
type: 'test'
...
# Subtest: a re-install with a different --node or different serve flags refuses
ok 26 - a re-install with a different --node or different serve flags refuses
---
duration_ms: 454.1624
type: 'test'
...
# Subtest: an installed pair whose units name different copies refuses
ok 27 - an installed pair whose units name different copies refuses
---
duration_ms: 238.147366
type: 'test'
...
# Subtest: a copy id that is short, uppercase, holds / or .., or names no directory refuses
ok 28 - a copy id that is short, uppercase, holds / or .., or names no directory refuses
---
duration_ms: 26.564149
type: 'test'
...
# Subtest: library refuses a privileged-floor miss, a bad proof pair and every flag outside its set
ok 29 - library refuses a privileged-floor miss, a bad proof pair and every flag outside its set
---
duration_ms: 267.048019
type: 'test'
...
# Subtest: library refuses a proof file not owned by <user>'s uid
ok 30 - library refuses a proof file not owned by <user>'s uid
---
duration_ms: 17.16447
type: 'test'
...
# Subtest: factory refuses duplicate socket, a missing --port or --business, and each proxy flag
ok 31 - factory refuses duplicate socket, a missing --port or --business, and each proxy flag
---
duration_ms: 179.834197
type: 'test'
...
# Subtest: row253 factory refuses retired TCP and a value after the socket marker
ok 32 - row253 factory refuses retired TCP and a value after the socket marker
---
duration_ms: 27.35353
type: 'test'
...
# Subtest: factory refuses a --claude that is relative, not root-owned or under <home>, and a re-install with another --pm or --claude
ok 33 - factory refuses a --claude that is relative, not root-owned or under <home>, and a re-install with another --pm or --claude
---
duration_ms: 1109.424536
type: 'test'
...
# Subtest: the precheck passes on a good host and prints free memory, without the key
ok 34 - the precheck passes on a good host and prints free memory, without the key
---
duration_ms: 105.001864
type: 'test'
...
# Subtest: the precheck refuses each failed host check
ok 35 - the precheck refuses each failed host check
---
duration_ms: 912.086148
type: 'test'
...
# Subtest: the precheck refuses a user missing from passwd, a business file that does not load, and a symlinked run root
ok 36 - the precheck refuses a user missing from passwd, a business file that does not load, and a symlinked run root
---
duration_ms: 468.71868
type: 'test'
...
# Subtest: a bwrap that fails refuses and prints the sysctl and where bwrap is
ok 37 - a bwrap that fails refuses and prints the sysctl and where bwrap is
---
duration_ms: 103.211063
type: 'test'
...
# Subtest: an unprivileged port floor at or below the Console's port refuses, and so does a missing Console unit
ok 38 - an unprivileged port floor at or below the Console's port refuses, and so does a missing Console unit
---
duration_ms: 483.098555
type: 'test'
...
# Subtest: bus.tester: library refuses it on, factory needs it on, and factory refuses a library business
ok 39 - bus.tester: library refuses it on, factory needs it on, and factory refuses a library business
---
duration_ms: 397.641457
type: 'test'
...
# Subtest: the claude check runs only for a claude-code instance, and refuses a claude that appends or answers wrong
ok 40 - the claude check runs only for a claude-code instance, and refuses a claude that appends or answers wrong
---
duration_ms: 856.874242
type: 'test'
...
# Subtest: the claude check runs the bus unit's MOSAIC_CLAUDE_BIN over claude on PATH
ok 41 - the claude check runs the bus unit's MOSAIC_CLAUDE_BIN over claude on PATH
---
duration_ms: 262.683595
type: 'test'
...
# Subtest: the session env file refuses when missing, open to others, a symlink, empty, or emptied by a later line
ok 42 - the session env file refuses when missing, open to others, a symlink, empty, or emptied by a later line
---
duration_ms: 591.944048
type: 'test'
...
# Subtest: inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
---
duration_ms: 82.554846
type: 'test'
...
1..43
# tests 43
# suites 0
# pass 43
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 66326.521088
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/account-migration.test.mjs"]
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes
ok 1 - REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes
---
duration_ms: 82.597902
type: 'test'
...
# Subtest: REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact
ok 2 - REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact
---
duration_ms: 92.53462
type: 'test'
...
# Subtest: REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 81.102574
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 340.975929
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/chief-of-staff.test.mjs"]
@@ -0,0 +1,271 @@
TAP version 13
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# Subtest: REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged
ok 1 - REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged
---
duration_ms: 28.331746
type: 'test'
...
# Subtest: REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke
ok 2 - REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke
---
duration_ms: 26.434808
type: 'test'
...
# Subtest: REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither
ok 3 - REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither
---
duration_ms: 17.938787
type: 'test'
...
# Subtest: REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path
ok 4 - REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path
---
duration_ms: 18.620206
type: 'test'
...
# Subtest: REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason
ok 5 - REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason
---
duration_ms: 21.128166
type: 'test'
...
# Subtest: REQ-ROLE-2: a reason is required, bounded, and never sent with a decision
ok 6 - REQ-ROLE-2: a reason is required, bounded, and never sent with a decision
---
duration_ms: 23.298242
type: 'test'
...
# Subtest: REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run
ok 7 - REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run
---
duration_ms: 24.376739
type: 'test'
...
# Subtest: REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor
ok 8 - REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor
---
duration_ms: 18.346487
type: 'test'
...
# Subtest: REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set
ok 9 - REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set
---
duration_ms: 23.149091
type: 'test'
...
# Subtest: REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change
ok 10 - REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change
---
duration_ms: 26.114851
type: 'test'
...
# Subtest: REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys
ok 11 - REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys
---
duration_ms: 28.913122
type: 'test'
...
# Subtest: REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing
ok 12 - REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing
---
duration_ms: 23.086141
type: 'test'
...
# Subtest: REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change
ok 13 - REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change
---
duration_ms: 24.973528
type: 'test'
...
# Subtest: 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
ok 14 - 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
---
duration_ms: 121.448868
type: 'test'
...
# Subtest: REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused
ok 15 - REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused
---
duration_ms: 69.528621
type: 'test'
...
# Subtest: Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused
ok 16 - Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused
---
duration_ms: 77.400397
type: 'test'
...
# Subtest: row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief
ok 17 - row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief
---
duration_ms: 52.105961
type: 'test'
...
# Subtest: 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
ok 18 - 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
---
duration_ms: 75.179142
type: 'test'
...
# Subtest: row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing
ok 19 - row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing
---
duration_ms: 18.345149
type: 'test'
...
# Subtest: row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run
ok 20 - row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run
---
duration_ms: 19.386726
type: 'test'
...
# Subtest: row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not
ok 21 - row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not
---
duration_ms: 19.01179
type: 'test'
...
# Subtest: row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer
ok 22 - row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer
---
duration_ms: 23.117738
type: 'test'
...
# Subtest: row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer
ok 23 - row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer
---
duration_ms: 22.420802
type: 'test'
...
# Subtest: row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it
ok 24 - row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it
---
duration_ms: 21.138167
type: 'test'
...
# Subtest: row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own
ok 25 - row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own
---
duration_ms: 18.321241
type: 'test'
...
# Subtest: row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key
ok 26 - row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key
---
duration_ms: 29.401579
type: 'test'
...
# Subtest: row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions
ok 27 - row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions
---
duration_ms: 27.890795
type: 'test'
...
# Subtest: row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer
ok 28 - row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer
---
duration_ms: 39.940767
type: 'test'
...
# Subtest: row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name
ok 29 - row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name
---
duration_ms: 23.456981
type: 'test'
...
# Subtest: row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't
ok 30 - row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't
---
duration_ms: 664.437436
type: 'test'
...
# Subtest: row 194 T8b: a hire without the role files configured refuses not-configured
ok 31 - row 194 T8b: a hire without the role files configured refuses not-configured
---
duration_ms: 18.714128
type: 'test'
...
# Subtest: row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs
ok 32 - row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs
---
duration_ms: 21.402072
type: 'test'
...
# Subtest: row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses
ok 33 - row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses
---
duration_ms: 25.798012
type: 'test'
...
# Subtest: row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone
ok 34 - row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone
---
duration_ms: 22.191888
type: 'test'
...
# Subtest: row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once
ok 35 - row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once
---
duration_ms: 23.500086
type: 'test'
...
# Subtest: row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it
ok 36 - row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it
---
duration_ms: 24.322177
type: 'test'
...
# Subtest: row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it
ok 37 - row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it
---
duration_ms: 21.989082
type: 'test'
...
# Subtest: row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer
ok 38 - row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer
---
duration_ms: 18.687603
type: 'test'
...
# Subtest: row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable
ok 39 - row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable
---
duration_ms: 18.529568
type: 'test'
...
# Subtest: row 194 T18: hire and fire take only their own keys, and a refused call writes nothing
ok 40 - row 194 T18: hire and fire take only their own keys, and a refused call writes nothing
---
duration_ms: 24.530376
type: 'test'
...
# Subtest: row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone
ok 41 - row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone
---
duration_ms: 67.04966
type: 'test'
...
# Subtest: row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing
ok 42 - row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing
---
duration_ms: 24.174855
type: 'test'
...
1..42
# tests 42
# suites 0
# pass 42
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 2069.126162
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/comment-migration.test.mjs"]
@@ -0,0 +1,40 @@
TAP version 13
# Subtest: explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates
ok 1 - explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates
---
duration_ms: 66.915434
type: 'test'
...
# Subtest: migration refuses active writers and drifted legacy schemas, with no partial upgrade
ok 2 - migration refuses active writers and drifted legacy schemas, with no partial upgrade
---
duration_ms: 87.090397
type: 'test'
...
# Subtest: named migration registry chains 3b through 3g to a fixture-only future version in order
ok 3 - named migration registry chains 3b through 3g to a fixture-only future version in order
---
duration_ms: 92.896241
type: 'test'
...
# Subtest: migration refuses mismatched source metadata without changing schema or evidence
ok 4 - migration refuses mismatched source metadata without changing schema or evidence
---
duration_ms: 36.477831
type: 'test'
...
# Subtest: offline command migrates only the supplied fixture root and reports usage errors
ok 5 - offline command migrates only the supplied fixture root and reports usage errors
---
duration_ms: 168.952237
type: 'test'
...
1..5
# tests 5
# suites 0
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 517.394008
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/end-launch.test.mjs"]
@@ -0,0 +1,52 @@
TAP version 13
# Subtest: endLaunch writes session.ended, releases the run claim and kills its capabilities
ok 1 - endLaunch writes session.ended, releases the run claim and kills its capabilities
---
duration_ms: 19.923626
type: 'test'
...
# Subtest: endLaunch refuses an unknown run, a second end and a rebind of the ended run
ok 2 - endLaunch refuses an unknown run, a second end and a rebind of the ended run
---
duration_ms: 11.57898
type: 'test'
...
# Subtest: a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound
ok 3 - a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound
---
duration_ms: 13.959669
type: 'test'
...
# Subtest: endLaunch leaves a claim another run took alone
ok 4 - endLaunch leaves a claim another run took alone
---
duration_ms: 15.607261
type: 'test'
...
# Subtest: refuse records action.refused against the caller with the code only
ok 5 - refuse records action.refused against the caller with the code only
---
duration_ms: 11.34653
type: 'test'
...
# Subtest: launches off refuses role.launch with launch-revoked until launches on
ok 6 - launches off refuses role.launch with launch-revoked until launches on
---
duration_ms: 15.612767
type: 'test'
...
# Subtest: broker process: launch ops authorize role.launch, record refusals and end runs
ok 7 - broker process: launch ops authorize role.launch, record refusals and end runs
---
duration_ms: 162.081295
type: 'test'
...
1..7
# tests 7
# suites 0
# pass 7
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 323.68804
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/fire-revokes-grants.test.mjs"]
@@ -0,0 +1,142 @@
TAP version 13
# Subtest: row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three
ok 1 - row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three
---
duration_ms: 232.783752
type: 'test'
...
# Subtest: row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes
ok 2 - row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes
---
duration_ms: 223.116777
type: 'test'
...
# Subtest: row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea
ok 3 - row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea
---
duration_ms: 211.879543
type: 'test'
...
# Subtest: row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only
ok 4 - row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only
---
duration_ms: 208.941116
type: 'test'
...
# Subtest: row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request
ok 5 - row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request
---
duration_ms: 52.070752
type: 'test'
...
# Subtest: row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes
ok 6 - row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes
---
duration_ms: 193.713805
type: 'test'
...
# Subtest: row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close
ok 7 - row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close
---
duration_ms: 100.196392
type: 'test'
...
# Subtest: row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft
ok 8 - row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft
---
duration_ms: 82.925658
type: 'test'
...
# Subtest: row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact
ok 9 - row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact
---
duration_ms: 112.342135
type: 'test'
...
# Subtest: row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries
ok 10 - row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries
---
duration_ms: 295.497967
type: 'test'
...
# Subtest: row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied
ok 11 - row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied
---
duration_ms: 64.894992
type: 'test'
...
# Subtest: row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write
ok 12 - row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write
---
duration_ms: 86.54008
type: 'test'
...
# Subtest: row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token
ok 13 - row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token
---
duration_ms: 237.49431
type: 'test'
...
# Subtest: row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked
ok 14 - row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked
---
duration_ms: 92.642809
type: 'test'
...
# Subtest: row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job
ok 15 - row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job
---
duration_ms: 104.408759
type: 'test'
...
# Subtest: row 281 T7: an instance with no grant fires as today, synchronously, with the same events
ok 16 - row 281 T7: an instance with no grant fires as today, synchronously, with the same events
---
duration_ms: 52.79141
type: 'test'
...
# Subtest: row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running
ok 17 - row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running
---
duration_ms: 223.695847
type: 'test'
...
# Subtest: row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs
ok 18 - row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs
---
duration_ms: 196.138967
type: 'test'
...
# Subtest: row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts
ok 19 - row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts
---
duration_ms: 81.192633
type: 'test'
...
# Subtest: row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously
ok 20 - row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously
---
duration_ms: 76.945309
type: 'test'
...
# Subtest: row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none
ok 21 - row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none
---
duration_ms: 129.403455
type: 'test'
...
# Subtest: row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job
ok 22 - row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job
---
duration_ms: 61.78992
type: 'test'
...
1..22
# tests 22
# suites 0
# pass 22
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3217.339801
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/gitea-grant.test.mjs"]
@@ -0,0 +1,304 @@
TAP version 13
# Subtest: versionAtLeast compares numbers and refuses a prerelease of 1.27.0
ok 1 - versionAtLeast compares numbers and refuses a prerelease of 1.27.0
---
duration_ms: 1.237036
type: 'test'
...
# Subtest: X-G1: a raise that fails a check refuses and stores nothing
ok 2 - X-G1: a raise that fails a check refuses and stores nothing
---
duration_ms: 62.068324
type: 'test'
...
# Subtest: X-G1: a creative role, a role without identity and a missing or due slot refuse at raise
ok 3 - X-G1: a creative role, a role without identity and a missing or due slot refuse at raise
---
duration_ms: 180.218463
type: 'test'
...
# Subtest: X-G2: admin set refuses each failed check and writes nothing, then writes the slot once
ok 4 - X-G2: admin set refuses each failed check and writes nothing, then writes the slot once
---
duration_ms: 143.52952
type: 'test'
...
# Subtest: X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied
ok 5 - X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied
---
duration_ms: 102.221906
type: 'test'
...
# Subtest: X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse
ok 6 - X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse
---
duration_ms: 306.504597
type: 'test'
...
# Subtest: X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call
ok 7 - X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call
---
duration_ms: 100.565961
type: 'test'
...
# Subtest: X-G4: a fork by the seat user of another repository than the project refuses fork-foreign
ok 8 - X-G4: a fork by the seat user of another repository than the project refuses fork-foreign
---
duration_ms: 79.418473
type: 'test'
...
# Subtest: X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file
ok 9 - X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file
---
duration_ms: 124.149748
type: 'test'
...
# Subtest: X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep
ok 10 - X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep
---
duration_ms: 128.702874
type: 'test'
...
# Subtest: X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent
ok 11 - X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent
---
duration_ms: 145.353601
type: 'test'
...
# Subtest: X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call
ok 12 - X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call
---
duration_ms: 65.829336
type: 'test'
...
# Subtest: X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left
ok 13 - X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left
---
duration_ms: 170.790626
type: 'test'
...
# Subtest: X-G10: in a rotation the store file holds the new token before the old one is deleted
ok 14 - X-G10: in a rotation the store file holds the new token before the old one is deleted
---
duration_ms: 145.852525
type: 'test'
...
# Subtest: X-G6: a rotation cut before the rename settles back at once, and the old token stays live
ok 15 - X-G6: a rotation cut before the rename settles back at once, and the old token stays live
---
duration_ms: 167.483708
type: 'test'
...
# Subtest: X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward
ok 16 - X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward
---
duration_ms: 178.569723
type: 'test'
...
# Subtest: X-G6: a restart settles an open rotation back when the file still holds the old token
ok 17 - X-G6: a restart settles an open rotation back when the file still holds the old token
---
duration_ms: 134.9967
type: 'test'
...
# Subtest: X-G6: a restart settles an open rotation forward when the file holds the new token
ok 18 - X-G6: a restart settles an open rotation forward when the file holds the new token
---
duration_ms: 113.009774
type: 'test'
...
# Subtest: X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads
ok 19 - X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads
---
duration_ms: 136.104972
type: 'test'
...
# Subtest: X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted
ok 20 - X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted
---
duration_ms: 996.868783
type: 'test'
...
# Subtest: X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids
ok 21 - X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids
---
duration_ms: 155.766188
type: 'test'
...
# Subtest: N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message
ok 22 - N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message
---
duration_ms: 113.207925
type: 'test'
...
# Subtest: N9: a 404 on a delete by id counts as done
ok 23 - N9: a 404 on a delete by id counts as done
---
duration_ms: 128.801734
type: 'test'
...
# Subtest: X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision
ok 24 - X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision
---
duration_ms: 416.149926
type: 'test'
...
# Subtest: X-G6: a restart with no admin slot leaves the user an orphan and the token left
ok 25 - X-G6: a restart with no admin slot leaves the user an orphan and the token left
---
duration_ms: 53.694027
type: 'test'
...
# Subtest: X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch
ok 26 - X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch
---
duration_ms: 140.801435
type: 'test'
...
# Subtest: X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left
ok 27 - X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left
---
duration_ms: 123.822535
type: 'test'
...
# Subtest: X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away
ok 28 - X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away
---
duration_ms: 73.422448
type: 'test'
...
# Subtest: X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent
ok 29 - X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent
---
duration_ms: 50.180389
type: 'test'
...
# Subtest: X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision
ok 30 - X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision
---
duration_ms: 105.874572
type: 'test'
...
# Subtest: kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses
ok 31 - kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses
---
duration_ms: 106.333602
type: 'test'
...
# Subtest: X-G11: a revoke while the executor runs aborts it and the grant ends revoked
ok 32 - X-G11: a revoke while the executor runs aborts it and the grant ends revoked
---
duration_ms: 110.333063
type: 'test'
...
# Subtest: X-G11: a revoke unloads memory and removes the file before its Gitea delete
ok 33 - X-G11: a revoke unloads memory and removes the file before its Gitea delete
---
duration_ms: 132.61075
type: 'test'
...
# Subtest: X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back
ok 34 - X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back
---
duration_ms: 217.837803
type: 'test'
...
# Subtest: X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record
ok 35 - X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record
---
duration_ms: 373.129907
type: 'test'
...
# Subtest: X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held
ok 36 - X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held
---
duration_ms: 159.428511
type: 'test'
...
# Subtest: X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost
ok 37 - X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost
---
duration_ms: 190.121277
type: 'test'
...
# Subtest: X-G12: a token that reaches wider than its forks fails with the repository named
ok 38 - X-G12: a token that reaches wider than its forks fails with the repository named
---
duration_ms: 422.103379
type: 'test'
...
# Subtest: X-G12: reach is paged by X-Total-Count and a count that does not add up refuses
ok 39 - X-G12: reach is paged by X-Total-Count and a count that does not add up refuses
---
duration_ms: 268.091756
type: 'test'
...
# Subtest: X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer
ok 40 - X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer
---
duration_ms: 41.808143
type: 'test'
...
# Subtest: X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it
ok 41 - X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it
---
duration_ms: 293.964549
type: 'test'
...
# Subtest: X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft
ok 42 - X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft
---
duration_ms: 155.089131
type: 'test'
...
# Subtest: X-G14: a fire whose user is gone or remade skips the fire steps and says why
ok 43 - X-G14: a fire whose user is gone or remade skips the fire steps and says why
---
duration_ms: 259.152973
type: 'test'
...
# Subtest: X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named
ok 44 - X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named
---
duration_ms: 347.428274
type: 'test'
...
# Subtest: X-G14: a revoke Gitea cannot reach stays open, and a restart closes it
ok 45 - X-G14: a revoke Gitea cannot reach stays open, and a restart closes it
---
duration_ms: 116.580427
type: 'test'
...
# Subtest: row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job
ok 46 - row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job
---
duration_ms: 132.268866
type: 'test'
...
# Subtest: X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status
ok 47 - X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status
---
duration_ms: 127.609667
type: 'test'
...
# Subtest: X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant
ok 48 - X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant
---
duration_ms: 43.046865
type: 'test'
...
# Subtest: status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea
ok 49 - status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea
---
duration_ms: 109.158689
type: 'test'
...
1..49
# tests 49
# suites 0
# pass 49
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 8542.307737
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/gitea-migration.test.mjs"]
@@ -0,0 +1,40 @@
TAP version 13
# Subtest: 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys
ok 1 - 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys
---
duration_ms: 81.838559
type: 'test'
...
# Subtest: a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact
ok 2 - a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact
---
duration_ms: 89.482209
type: 'test'
...
# Subtest: the 3j engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - the 3j engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 82.697499
type: 'test'
...
# Subtest: gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision
ok 4 - gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision
---
duration_ms: 10.237684
type: 'test'
...
# Subtest: gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user
ok 5 - gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user
---
duration_ms: 11.403049
type: 'test'
...
1..5
# tests 5
# suites 0
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 356.386753
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/grant-executor.test.mjs"]
@@ -0,0 +1,262 @@
TAP version 13
# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd
ok 1 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd
---
duration_ms: 83.960769
type: 'test'
...
# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range
ok 2 - row 280: every injected picker sample is unprivileged and outside the ephemeral range
---
duration_ms: 0.361575
type: 'test'
...
# Subtest: G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
ok 3 - G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
---
duration_ms: 657.627333
type: 'test'
...
# Subtest: G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
ok 4 - G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
---
duration_ms: 531.338182
type: 'test'
...
# Subtest: G8: a failure at install or verify removes the line and leaves no record, key file or reference
ok 5 - G8: a failure at install or verify removes the line and leaves no record, key file or reference
---
duration_ms: 1517.262253
type: 'test'
...
# Subtest: G8: a failed remove adds hostLineLeft and tells the human to sweep
ok 6 - G8: a failed remove adds hostLineLeft and tells the human to sweep
---
duration_ms: 651.737964
type: 'test'
...
# Subtest: G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
ok 7 - G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
---
duration_ms: 649.340641
type: 'test'
...
# Subtest: G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
ok 8 - G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
---
duration_ms: 671.126429
type: 'test'
...
# Subtest: G8: a failed step 1 check spends the decision and runs nothing remote
ok 9 - G8: a failed step 1 check spends the decision and runs nothing remote
---
duration_ms: 81.673932
type: 'test'
...
# Subtest: G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
ok 10 - G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
---
duration_ms: 521.508803
type: 'test'
...
# Subtest: G9: an agent no longer a role or no longer declaring host ends with its code, spent
ok 11 - G9: an agent no longer a role or no longer declaring host ends with its code, spent
---
duration_ms: 68.84932
type: 'test'
...
# Subtest: G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
ok 12 - G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
---
duration_ms: 513.85868
type: 'test'
...
# Subtest: G15: no event, message or decision holds the private key
ok 13 - G15: no event, message or decision holds the private key
---
duration_ms: 490.733182
type: 'test'
...
# Subtest: G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
ok 14 - G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
---
duration_ms: 525.579468
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
ok 15 - G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
---
duration_ms: 794.760968
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
ok 16 - G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
---
duration_ms: 855.43114
type: 'test'
...
# Subtest: G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
ok 17 - G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
---
duration_ms: 512.62141
type: 'test'
...
# Subtest: G24: names at 64 characters with . and _ give distinct tags of the fixed length
ok 18 - G24: names at 64 characters with . and _ give distinct tags of the fixed length
---
duration_ms: 0.409892
type: 'test'
...
# Subtest: G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
ok 19 - G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
---
duration_ms: 216.10008
type: 'test'
...
# Subtest: G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
ok 20 - G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
---
duration_ms: 220.396391
type: 'test'
...
# Subtest: G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
ok 21 - G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
---
duration_ms: 560.5996
type: 'test'
...
# Subtest: G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
ok 22 - G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
---
duration_ms: 68.008875
type: 'test'
...
# Subtest: G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
ok 23 - G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
---
duration_ms: 294.19336
type: 'test'
...
# Subtest: G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
ok 24 - G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
---
duration_ms: 492.228554
type: 'test'
...
# Subtest: N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
ok 25 - N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
---
duration_ms: 6.558346
type: 'test'
...
# Subtest: G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
ok 26 - G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
---
duration_ms: 637.696071
type: 'test'
...
# Subtest: G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
ok 27 - G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
---
duration_ms: 217.392809
type: 'test'
...
# Subtest: G13: a revoke during install aborts the executor, which ends revoked, and the line goes
ok 28 - G13: a revoke during install aborts the executor, which ends revoked, and the line goes
---
duration_ms: 560.229976
type: 'test'
...
# Subtest: G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
ok 29 - G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
---
duration_ms: 508.929241
type: 'test'
...
# Subtest: row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
ok 30 - row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
---
duration_ms: 641.807226
type: 'test'
...
# Subtest: G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
ok 31 - G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
---
duration_ms: 659.52398
type: 'test'
...
# Subtest: G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
ok 32 - G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
---
duration_ms: 936.59984
type: 'test'
...
# Subtest: G27: a key file a revoke could not unlink is reported left and goes at the next start
ok 33 - G27: a key file a revoke could not unlink is reported left and goes at the next start
---
duration_ms: 632.639641
type: 'test'
...
# Subtest: G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
ok 34 - G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
---
duration_ms: 653.467997
type: 'test'
...
# Subtest: G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
ok 35 - G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
---
duration_ms: 962.241764
type: 'test'
...
# Subtest: G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
ok 36 - G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
---
duration_ms: 714.365535
type: 'test'
...
# Subtest: G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
ok 37 - G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
---
duration_ms: 207.206499
type: 'test'
...
# Subtest: G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
ok 38 - G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
---
duration_ms: 664.698225
type: 'test'
...
# Subtest: G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
ok 39 - G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
---
duration_ms: 653.766611
type: 'test'
...
# Subtest: G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
ok 40 - G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
---
duration_ms: 1172.54697
type: 'test'
...
# Subtest: mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
ok 41 - mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
---
duration_ms: 61.460666
type: 'test'
...
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
ok 42 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 510.214713
type: 'test'
...
1..42
# tests 42
# suites 0
# pass 42
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 21467.137575
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/grant-migration.test.mjs"]
@@ -0,0 +1,46 @@
TAP version 13
# Subtest: 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard
ok 1 - 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard
---
duration_ms: 73.964009
type: 'test'
...
# Subtest: a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact
ok 2 - a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact
---
duration_ms: 84.711984
type: 'test'
...
# Subtest: the 3i engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - the 3i engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 82.795225
type: 'test'
...
# Subtest: A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it
ok 4 - A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it
---
duration_ms: 69.813637
type: 'test'
...
# Subtest: the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor
ok 5 - the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor
---
duration_ms: 13.398811
type: 'test'
...
# Subtest: hosts: one record per business and host, a ready host has its installer and check, grants need the host
ok 6 - hosts: one record per business and host, a ready host has its installer and check, grants need the host
---
duration_ms: 10.836824
type: 'test'
...
1..6
# tests 6
# suites 0
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 412.883239
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/lifecycle-revoke.test.mjs"]
@@ -0,0 +1,59 @@
TAP version 13
# organization: {"event":"reload-needs-restart","business":"demo"}
# Subtest: T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store
ok 1 - T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store
---
duration_ms: 91.565281
type: 'test'
...
# Subtest: T20 fire: an instance already delisted still has its tokens revoked and the file is left alone
ok 2 - T20 fire: an instance already delisted still has its tokens revoked and the file is left alone
---
duration_ms: 49.803348
type: 'test'
...
# Subtest: T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on
ok 3 - T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on
---
duration_ms: 52.945145
type: 'test'
...
# Subtest: T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot
ok 4 - T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot
---
duration_ms: 67.222042
type: 'test'
...
# Subtest: T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses
ok 5 - T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses
---
duration_ms: 55.353852
type: 'test'
...
# Subtest: T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything
ok 6 - T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything
---
duration_ms: 55.857643
type: 'test'
...
# Subtest: row 281 T1 fire: a host.<id> or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged
ok 7 - row 281 T1 fire: a host.<id> or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged
---
duration_ms: 52.390335
type: 'test'
...
# Subtest: row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued
ok 8 - row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued
---
duration_ms: 49.199992
type: 'test'
...
1..8
# tests 8
# suites 0
# pass 8
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 581.917366
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/message-filter.test.mjs"]
@@ -0,0 +1,46 @@
TAP version 13
# Subtest: trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
ok 1 - trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
---
duration_ms: 23.582065
type: 'test'
...
# Subtest: replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
ok 2 - replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
---
duration_ms: 23.016106
type: 'test'
...
# Subtest: trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events
ok 3 - trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events
---
duration_ms: 27.394648
type: 'test'
...
# Subtest: replies leaves out other users thread messages and still fills a page
ok 4 - replies leaves out other users thread messages and still fills a page
---
duration_ms: 168.512501
type: 'test'
...
# Subtest: messages in the business human and tester threads are not hidden (row 177 unchanged)
ok 5 - messages in the business human and tester threads are not hidden (row 177 unchanged)
---
duration_ms: 31.043561
type: 'test'
...
# Subtest: governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages
ok 6 - governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages
---
duration_ms: 97.561497
type: 'test'
...
1..6
# tests 6
# suites 0
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 441.717371
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/name-migration.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name
ok 1 - 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name
---
duration_ms: 83.476176
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 148.867035
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/schema.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: v3b prototype refusals, views and append-only mutations
ok 1 - v3b prototype refusals, views and append-only mutations
---
duration_ms: 81.916017
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 127.351705
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/sessions.test.mjs"]
@@ -0,0 +1,52 @@
TAP version 13
# Subtest: T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies
ok 1 - T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies
---
duration_ms: 40.706821
type: 'test'
...
# Subtest: T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder
ok 2 - T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder
---
duration_ms: 31.91851
type: 'test'
...
# Subtest: T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing
ok 3 - T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing
---
duration_ms: 42.685057
type: 'test'
...
# Subtest: session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads
ok 4 - session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads
---
duration_ms: 29.35201
type: 'test'
...
# Subtest: the 3l triggers keep sessions in their thread and session ids apart from thread ids
ok 5 - the 3l triggers keep sessions in their thread and session ids apart from thread ids
---
duration_ms: 61.867285
type: 'test'
...
# Subtest: T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs
ok 6 - T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs
---
duration_ms: 91.694237
type: 'test'
...
# Subtest: T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was
ok 7 - T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was
---
duration_ms: 148.41378
type: 'test'
...
1..7
# tests 7
# suites 0
# pass 7
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 518.953205
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/spec-migration.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations
ok 1 - 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations
---
duration_ms: 85.093606
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 149.197988
@@ -0,0 +1 @@
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/tester-writes.test.mjs"]
Loaded 100 of 700 files, more files were not shown because too many files have changed in this diff. Show more