Compare commits
89
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fddae79ef6 | ||
|
|
a6acbbe14d | ||
|
|
46cd8d5835 | ||
|
|
aba5cc505f | ||
|
|
8545057275 | ||
|
|
068d868a99 | ||
|
|
4ff4f44c98 | ||
|
|
b9ea9304fd | ||
|
|
6bad02612a | ||
|
|
158205c5cc | ||
|
|
cab3ef3e8f | ||
|
|
ddf20567ee | ||
|
|
3b88ef399d | ||
|
|
1eb8b68e44 | ||
|
|
abe37ab27a | ||
|
|
4ef251e1a7 | ||
|
|
36a70ea9c1 | ||
|
|
8eb37bed32 | ||
|
|
82ca1d3db4 | ||
|
|
54328cfae5 | ||
|
|
c78f225433 | ||
|
|
c1e9841d36 | ||
|
|
6951fb494f | ||
|
|
5514457dde | ||
|
|
fbf8d61a4c | ||
|
|
2b3e3ec83b | ||
|
|
418f00bce2 | ||
|
|
a7a433e271 | ||
|
|
664d8ef3d3 | ||
|
|
f7d16e9a8d | ||
|
|
484aef7e2a | ||
|
|
d0ddfa8de2 | ||
|
|
ab2bc23c7f | ||
|
|
1d6dae6fe4 | ||
|
|
7fff6a20e6 | ||
|
|
a19b936a8c | ||
|
|
ee151685e9 | ||
|
|
155cb8c3e5 | ||
|
|
9936a1be1a | ||
|
|
4cf888c04c | ||
|
|
4c49919e9b | ||
|
|
c4bba5d2a3 | ||
|
|
09a847edaa | ||
|
|
30644a3dd5 | ||
|
|
0e1dd0a95b | ||
|
|
52ba14c5f1 | ||
|
|
49c162c99e | ||
|
|
362893d043 | ||
|
|
acd2f4abfa | ||
|
|
63ec2544c2 | ||
|
|
1cb0d45df0 | ||
|
|
8f7ef593d9 | ||
|
|
2d3458695a | ||
|
|
6efc4a6921 | ||
|
|
193774d755 | ||
|
|
5d1734dd01 | ||
|
|
c10f17cfeb | ||
|
|
acc0f8acb0 | ||
|
|
64a40e712d | ||
|
|
90a0d690da | ||
|
|
2656f32f77 | ||
|
|
c5ccabc9fb | ||
|
|
d8bd081b20 | ||
|
|
af7287a533 | ||
|
|
4176f3a506 | ||
|
|
1db5167795 | ||
|
|
c3e4ee4138 | ||
|
|
56e9844528 | ||
|
|
bbc062ae86 | ||
|
|
dc2a49a744 | ||
|
|
c0bf87b789 | ||
|
|
e1d8756b51 | ||
|
|
83ec67dd36 | ||
|
|
de3e23dde9 | ||
|
|
446c9b8381 | ||
|
|
f78a45653d | ||
|
|
775bbe2368 | ||
|
|
35f34ad27a | ||
|
|
624507c74b | ||
|
|
77a790f43b | ||
|
|
bfd2f43b10 | ||
|
|
cb86e186dc | ||
|
|
ce8bb4d8b0 | ||
|
|
3a8e4abadb | ||
|
|
c68a29fed8 | ||
|
|
92e82469f2 | ||
|
|
8feda29eb4 | ||
|
|
bbec5e97f1 | ||
|
|
ec213e0336 |
No files matched your search
@@ -1,5 +1,6 @@
|
|||||||
# build/deps
|
# build/deps
|
||||||
node_modules/
|
node_modules/
|
||||||
|
.turbo/
|
||||||
|
|
||||||
# runtime credentials — never commit, never copy into the image
|
# runtime credentials — never commit, never copy into the image
|
||||||
.env
|
.env
|
||||||
|
|||||||
+267
@@ -5585,3 +5585,270 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r
|
|||||||
2026-10-24T23:37:46Z | Sage | Row 329 (#1827, P1 pinned model proxy, Magica) LANDED 61ebf2c34, pushed 23:31:27Z 10-24. Before: refactor at 669cdf42c. After: Magica's 4 commits (94cde633e, c65fb34ee, d1f6f2b19, 61ebf2c34) cherry-picked onto 669cdf42c, diff vs the gated tree limited to drift paths, range-diff in scratch. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r329l/wt (gate.sh 8b4978887 c8a9bcf94), started 23:08:12Z at load 14.35, GATE GREEN 23:29:14Z at load 8.67, no rerun, no test or timeout edit (mos-1634). Host note: two Codex workers cleaned T3 worktrees from about 23:14Z (mos-1639, Vikunja 632). Approvals: Dewey r2 c31643 rev 4047, Boyd r2 c31642 rev 4048. #1827 comment 31650, closed. Vikunja 237 comment 1109 (stays open for P2-P7); C4 P10 red filed as Vikunja 631. Queue: note rev 4063, done rev 4064, committed b24d917ec. DEFERRED: N2 and R2-N1 bound to row 331, N1 bound to P7. Overlap: row 284 (packages/bus/src/broker.mjs) and row 157 (scripts/mosaic-config.mjs) rebase onto 61ebf2c34 before their gates.
|
2026-10-24T23:37:46Z | Sage | Row 329 (#1827, P1 pinned model proxy, Magica) LANDED 61ebf2c34, pushed 23:31:27Z 10-24. Before: refactor at 669cdf42c. After: Magica's 4 commits (94cde633e, c65fb34ee, d1f6f2b19, 61ebf2c34) cherry-picked onto 669cdf42c, diff vs the gated tree limited to drift paths, range-diff in scratch. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r329l/wt (gate.sh 8b4978887 c8a9bcf94), started 23:08:12Z at load 14.35, GATE GREEN 23:29:14Z at load 8.67, no rerun, no test or timeout edit (mos-1634). Host note: two Codex workers cleaned T3 worktrees from about 23:14Z (mos-1639, Vikunja 632). Approvals: Dewey r2 c31643 rev 4047, Boyd r2 c31642 rev 4048. #1827 comment 31650, closed. Vikunja 237 comment 1109 (stays open for P2-P7); C4 P10 red filed as Vikunja 631. Queue: note rev 4063, done rev 4064, committed b24d917ec. DEFERRED: N2 and R2-N1 bound to row 331, N1 bound to P7. Overlap: row 284 (packages/bus/src/broker.mjs) and row 157 (scripts/mosaic-config.mjs) rebase onto 61ebf2c34 before their gates.
|
||||||
2026-10-25T00:15:48Z | Sage | Row 284 (#1789, C2-05c library.get scope, Della) LANDED ce0b6ed41, pushed 00:09:52Z 10-25. Before: refactor at 9e2689dff (row 329 landing docs). After: fast-forward to Della's 7 rebased commits 78b932feb..ce0b6ed41; 8 paths, manifest-r4 de505cfd matches the landed tree. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r284l/wt (the 329 gate.sh with D and the compose project renamed), started 23:51:19Z at load 1.62, GATE GREEN 00:09:04Z at load 5.20, no rerun, no test or timeout edit. Counts: bus 1020/0, business 283/0, cli 999 pass 1 allowed skip (FED R7), harness 177/0, library 156/0, seat 218/0, webui 458/0, every scripts/test-*.sh rc 0; queue 34 and task 87/93 skips are the standing ones. Della's whole-file runs on ce0b6ed41: library-lookups 12/0, library-tools 5/0, query 34/0. Approval: Webby round 2 delta c31654 rev 4070 (round 1 rev 4062). Overlap sweep: rows 13, 157, 309, gyro/row310 and fethry/row332-p1 clean. #1789 comment 31655, closed. No Vikunja task for the row. Queue: note rev 4071, done rev 4072, committed 7c8dc2033. DEFERRED: Webby N1 (whole-tree listing per get) bound to the next library read-path row; N2 needs nothing; N3 is this gate.
|
2026-10-25T00:15:48Z | Sage | Row 284 (#1789, C2-05c library.get scope, Della) LANDED ce0b6ed41, pushed 00:09:52Z 10-25. Before: refactor at 9e2689dff (row 329 landing docs). After: fast-forward to Della's 7 rebased commits 78b932feb..ce0b6ed41; 8 paths, manifest-r4 de505cfd matches the landed tree. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r284l/wt (the 329 gate.sh with D and the compose project renamed), started 23:51:19Z at load 1.62, GATE GREEN 00:09:04Z at load 5.20, no rerun, no test or timeout edit. Counts: bus 1020/0, business 283/0, cli 999 pass 1 allowed skip (FED R7), harness 177/0, library 156/0, seat 218/0, webui 458/0, every scripts/test-*.sh rc 0; queue 34 and task 87/93 skips are the standing ones. Della's whole-file runs on ce0b6ed41: library-lookups 12/0, library-tools 5/0, query 34/0. Approval: Webby round 2 delta c31654 rev 4070 (round 1 rev 4062). Overlap sweep: rows 13, 157, 309, gyro/row310 and fethry/row332-p1 clean. #1789 comment 31655, closed. No Vikunja task for the row. Queue: note rev 4071, done rev 4072, committed 7c8dc2033. DEFERRED: Webby N1 (whole-tree listing per get) bound to the next library read-path row; N2 needs nothing; N3 is this gate.
|
||||||
2026-10-25T00:18:35Z | Sage | Follow-up tasks for mos-1647 item 3 (Q109): Vikunja 633 (P7 cutover, CLIProxyAPI 8.0.42 startup Grok-npm and antigravity version refreshes, from row 332 isolated runs) and 634 (row 284 Webby N1, library get lists the whole tree). DEFERRED gains the 633 entry and the 634 number for row 284 N1. Filing script and receipt in agents/sage/work/vikunja-setup/.
|
2026-10-25T00:18:35Z | Sage | Follow-up tasks for mos-1647 item 3 (Q109): Vikunja 633 (P7 cutover, CLIProxyAPI 8.0.42 startup Grok-npm and antigravity version refreshes, from row 332 isolated runs) and 634 (row 284 Webby N1, library get lists the whole tree). DEFERRED gains the 633 entry and the 634 number for row 284 N1. Filing script and receipt in agents/sage/work/vikunja-setup/.
|
||||||
|
2026-10-24T22:15:07Z | Herb | row 214 #1715 C2-11a focused evidence | Before: wikilinks are ordinary editor text; raw/sig retention keeps no-edit bytes, but the model has no inert node. After: inert inline wikilink atom preserves spelling through neighbouring edits; invalid attrs share HTML/entity escaping. On herb/row214-r2 base487500a16, grant sage-4286 lane B: baseline10/10 roundTrips equal (outcome A); baseline structural0/1 expected red; four whole editor files40/0, both mutants killed0/1 and restored1/0, whole webui69 files455/0 in174.189s with MOSAIC_REQUIRE_EDITOR_BUILD=1, nice19, no skips/cancellations. A mistaken preliminary7-file subset28/0 is logged and excluded from gate evidence. CSS byte-identical, final process sweep0, scratch TMPDIR removed. Filbert candidate review and every scripts/test-*.sh gate remain pending; no click, target resolution or library save change.
|
||||||
|
2026-10-25T04:36:47Z | Sage | Row 214 (#1715, C2-11a editor wikilink node, Herb) LANDED 3a8e4abad, pushed 04:27Z 10-25. Before: refactor at 78b69e1e6. After: Herb's six commits cherry-picked onto 78b69e1e6 and fast-forwarded. Gate GREEN 04:10:34Z: 18 package suites rc 0 (webui 471/471, cli 999 plus the allowed FED R7 skip), every scripts/test-*.sh rc 0, queue package via test-queue.sh 156. Design skips: queue 34 (not the canonical root), task 87/93 (row 244). Filbert APPROVE c31679 rev 4093. Range-diff equal except commit 5's BUILD-LOG context; 40/41 paths same blob, BUILD-LOG additions only. #1715 closed c31680. Queue note 4094, done 4095, committed ce8bb4d8b.
|
||||||
|
2026-10-25T04:36:47Z | Sage | Row 193 (#1691, threads user roles design, Morgana) LANDED 35f34ad27, doc-only: five design commits cherry-picked onto ce8bb4d8b, adding only agents/morgana/work/queue-193/DESIGN.md (verify-commit ok, 1 path). Duckworth APPROVE c31676 rev 4088 (posted and recorded by Sage; Duckworth has no Gitea credential). No test reads queue-193. Build rows from the design: 204/#1702, 205/#1703 (landed), 275/#1780, 206/#1704, 207/#1705, 208/#1706.
|
||||||
|
2026-10-25T04:58:30Z | Sage | Row 255 (#1760, Vikunja 458, bundled Pocket ID design for Q203, Launchpad) LANDED de3e23dde, doc-only: Launchpad's three design commits e29d8ec90, 9f60021a0 and c8f2bc723 cherry-picked onto 775bbe236 (range-diff equal), adding only agents/launchpad/work/queue-255/DESIGN.md. No test reads queue-255. Webby APPROVE round 1 c31689 rev 4103 (posted by Sage; Webby has no Gitea token). Mos rulings in mos-1666: M1 approved with conditions (rollback removes components before the pointer goes back and the STATE check confirms the key is absent; the loader stays strict inside the key; four test-config.sh cases), R1 chosen, M2 dropped. Sage gate check against Q203, O6, REQ-WEB-2 and REQ-INST-1: consistent. One PRD text gap goes to Mos: REQ-INST-2 says the stack writes the providers entry, and R1 prints it for the user to paste. Webby N1 and N2 bind P4; N3-N8 carry into the P1-P6 build rows, all post-v1.
|
||||||
|
|
||||||
|
2026-10-25T07:46Z | Sage 1ef1e4f8 | Row288 quiet-host handoff (#645), late phase registration | Before: unchanged diag2 refused exit9 after07:00:05-07:30:18Z with neither base/head processing file started; no fullGREEN/run4 evidence. Faceless READY07:37:14Z and final A02 drain acknowledged. Bounded host observation07:38:31-07:43:31Z produced11 half-minute load/CPU-pressure/process-name samples at /mnt/storage/scratch/sage-r288l/quiet-20261025T073714Z/samples.jsonl. Magica331 r4 occupied the preceding slot until07:41:00Z; after its end, sampled load1 remained8.03/7.97/10.02/9.40/9.22;07:43:36Z follow-up8.97 and no gate visible. After: no288 test or run4 started, unchanged load1<4 precondition unmet. Explicit RELEASE delivered to faceless master sage-4466 and Mos sage-4467;645 c1172 read back, done=true with original title/description preserved. This closes only the bounded handoff/measured-inability/release task; row288 diagnostic and fullGREEN acceptance remain unmet. No thresholds, test deadlines, scheduling settings or running jobs changed. Earlier interrupted/refusal logs preserved separately.
|
||||||
|
2026-10-25T07:46Z | Sage 1ef1e4f8 | P2/P4 prerequisite state | Magica331 r4 on0965fe1ea under sage-4459 stopped at full-list file69 project-runtime.test.mjs: exact Broker import closure lacks new common.mjs import. Probe30/30,68 full-list files green; aggregate707/706pass/1fail/0skip/cancel;193 remaining files, config and mutants/controls unrun. Receipts8d88a6029; rawlog ee430ce92543c4027b4aa78f343c703fd00bb55433e6ed40d54b61668a5914d4 read. Static trace confirms real sandbox defect: common.mjs and top-level-read PIN absent from RUNNER_FILES, as is new first-output.mjs. Magica holds read-only; proposed pure validation module/two readonly code binds/exact guard revision sent to Mos for scope ruling sage-4468, Q246 independent review still required. Poe prepared e7438743f regression manifest8/8 verified and git show --check clean; product patch unapplied at review. Next test-first404 block CLEAR sage-4469: intended two-caseRED before narrow exactGET404 normalization, then both new whole files+8focused/acceptance/named mutants/controls, stop on unexpected outcome. Global landing gate remains afterP2. No composite green, landing or push performed by Sage.
|
||||||
|
|
||||||
|
2026-10-25T08:03Z | Sage 1ef1e4f8 | Row331 r5 narrow review and full-builder verification phase | Before: r4 deterministic import-closure RED retained; r5 focused sixteen whole files181/181 passed, zero skips/cancel, real sandbox/session controls verified with raw16hashes. Fresh independent Claude Opus5.5/high Q246 round1 APPROVE8d88a6029..4948ece0e; no blocker/high/medium. Purity-regex/no-new-test-pre-fix-RED and confined-startup-only limits retained; verdict agents/sage/work/r331-r5-review/round1.json. Full P2/global/landing not approved. Now: accepted fresh import-derived269 list on unchanged reviewed code4948ece0e, packet2ff10ffac: old262 preserved+validation+six sandbox-dependent collateral files. Graph17sources/zero parsefailures, all11packetartifacthashes verified3993f7d3; listfd724dd9 equals graphbed8a700 tests. Runnerdiff changes only comment/artifact filenames/list/count. CLEARsage-4477 wholeprobe->269wholefiles->same test-config->four original mutants/restored controls, same deadlines/flags/scheduling, stop first unexpected outcome/no retries.646 remainsopen. Result pending, not a composite green or landing claim. Mos informed sage-4478.
|
||||||
|
|
||||||
|
2026-10-25T08:23Z | Sage 1ef1e4f8 | Row331 r5 full builder verification result | After CLEAR4477, builderblock finishedrc0 at08:19:20Z on2ff10ffac/code4948ece0e, receipt/docd62c69c86; package source unchanged. Independently verified279step logSHA/bytes and exact269inventory, final11artifact/280rawlog(including driver) manifestf1b6ee9b, receiptf95b14d7. Whole2692427tests/2426pass/0fail/1skip/0cancel; probe30+config55 gives2512tests/2511pass/0fail/1skip. FEDR7 scratch acceptance skip explicitly UNVERIFIED until scripts/test-federation-acceptance.sh at its authorized/global stage. Four mutants killed by named behavior; restoredwholecontrols30/30 each and sourcead5b37f3 restored byte-for-byte. Real sandbox11/session13 passed, no confined skips. Childnice19all279, driver16two recorded host-renice observations; no timeout/retry/control edit. Slot returned; no automatic nextgate. FullP2 Boyd first review/credential landing review/Sage global gate and row288 remain outstanding; narrowr5ClaudeAPPROVE is not fullP2/landing approval.646 staysopen. Supplied verifiedBoydID and full-scope handoff requirements sage-4479, Mos informed sage-4480; builder's already-invoked canonical queue move pending, no duplicate mutation.
|
||||||
|
|
||||||
|
2026-10-25T08:25:08+00:00 | Sage 1ef1e4f8 | Correction to08:23Z row331 verification entry | The final manifest/check-and-track helper stopped on KeyError bytes before its Vikunja post, because r5-full-driver.log is hash-only; shell continuation appended the08:23 entry prematurely. Earlier independent279step logSHA/bytes/count checks were already complete. Corrected final checker now verifies all11artifacts+280rawlogs: allSHA match, byte counts match wherever supplied; only driver log lacks bytes metadata. Restored sourcead5b37f3 matches allfour mutant events.646 comment1178 posted and read back OPEN now. No product/test or run result changed. Boyd0047 confirms fullP2read-only review underway on d62c69c86/base78b69e1e6, writerC included. Initial queuein-review move refused missing --candidate rc2 without mutation; one corrected candidate-bearing operation remains pending, no duplicate operation.
|
||||||
|
|
||||||
|
2026-10-25T08:33:18+00:00 | Sage 1ef1e4f8 | Row331 first full review CHANGES and request fallback | Boyd0049 fullP2review CHANGES onehighB1: runtime modelRuns empty afterrestart until bind, no-launch neverbinds oldpersistedsessions, sweep treats emptyasnoruns and removesretiringkey beforefuturegrace/confirmedstop. Magica andSage source-onlytrace confirm; writerC no otherblocker. No newtest/fixrun. BoundedB1preparation4483 underoriginalP2acceptance: authoritativeidentitycheckedpersistedrunview before retirement, retainfailclosed onunknown/discovery/stop failure, preserve no-launch/no newstopauthority; staticruntime/restartregressions/proposal first, no productfixuntilintendedRED/futureCLEAR. Requestfallback: ownGETuserjarvisverified, canonicalreviewrequest newop4481 completedrev4121/4122 posted31700, readbackauthor/issue/candidate/markersverified. FullBoydverdict relayed verbatim31701 with explicitBoydindependentreviewer/SageJarvisrelay attribution onBoydexplicitrequest, readbackverified; Boydasked4485 torecordCHANGESasboyd againstd62c69c86. Original4119/4120missingMagicacredentialfailurepreserved, no rowmove repeated/sharedorBoydcredentialused. Queuecurrentround1posted; verdictrecordpending.646global/P2gatesstillopen; no landingor288claim.
|
||||||
|
|
||||||
|
2026-10-25T08:50:48+00:00 | Sage 1ef1e4f8 | B1/647 intendedRED verified, bounded runtime/focusedGREEN phase | Before: correctednewtestca0e83337 onunchangedproduct4948ece0e ran EXACTONEwholemodel-restart under4490:12tests/2pass/10fail/0skipcancel, all10expected old-key-remotely-installed assertions, bothboundnonrunnerstop/confirmeddeadcontrolspass. No fixture/control/cleanup/observer/timeouterror. Raw13f41a18/19069bytes/names/counts and5producthashes independentlychecked; receipte99d225a/resultmanifeste69b1ac9 match, evidence-only41e909bcc. Now:4491 authorizes b1-proposal six-step minimalruntime.mjs-only implementation/privatehoststricthelpers andfocused8wholefiles(newrestartfirst). Seedauthoritativecheckedpersistedviewbeforetimer, mergeboot/fresh/bound, unknown/discovery/identity/stopfailure retains; no-launch/no discovery-derivedstopauthority preserved. Samepublicschema/refusal/IPC/mount/config/writer/grace/stop/timer/oldassertion/deadlines; ifruntime-onlyinsufficientstopforruling. Focused stopfirstunexpected/noretries, noautomaticfullgate/landing.647c1180readbackOPEN; freshnewcandidate/fullreview/Q246/global/FEDR7/288acceptance outstanding. Mos4492informed.
|
||||||
|
|
||||||
|
2026-10-25T09:01:42+00:00 | Sage 1ef1e4f8 | B1/647 boundaryRED verified, exact two-file/focusedGREEN resume | Boundary4495ONEnewwholefile produced2tests/0pass/2fail/0skipcancel; bothintendedMissingexpectedrejection(prePUT/prelocaldelete), no fixture/cleanup/timeoutfailure. Raw911d2a59/1994bytes/exactnames/counts/5unchangedproducthashes checked; receipt7fa8e123/resultmanifest8c49df81 match; evidenceonlyc90dcc4b1, original12RED41e909bcc retained/notrerun. Conditional4493/Mos1702prerequisite met. RESUME4496minimalruntimecheckedpersistedboot+fresh+trustedboundview plus EXACTprivateModelKeysconfirm-at-two-boundaries delta only; preserve no-launch/no newstopauthority/strictidentity/unknownretain/confirmedexit; no publiccontract/mount/writer/refusal/timer/grace/assertion/deadline change. Focused9newrestart12thenboundary2thenexisting7wholefiles, sameflags/nice/privatecfg, stopfirstunexpected/noretry; no automaticfull/mutants/landing. Newcandidate/freshfullP2/Q246/global/FEDR7/288acceptance remains. Mos4497informed.
|
||||||
|
|
||||||
|
2026-10-25T09:11:09+00:00 | Sage 1ef1e4f8 | B1/647 focused result and fullbuilder phase | Code81cbdea37 changes only runtimeprivateinventory and exactapprovedModelKeysconfirmdelta; bothpreviousREDphasespreserved. Focused4496ninewholefiles131/131,0fail/skipcancel, nine rawSHA/bytes and receipt6c2ff448/resultmanifest78c1b8fa8artifacts+10rawlogs(incldriver) verified. Candidatecontent704a2469all111Gitblobs/pathinventory checked; testedsourceunchangedinevidencepacket e5a4ade07. Realconfinedstartup/sessioncontrols pass; sleepfixture doesnotproveauthorizedrealrunnerSIGTERM, limitretained. Freshfull271list=old269+exactrestart/boundary2, graph17sources0parsefailures/all271match4e01c2e8, listd6b403f0, all10fullpacketartifacts007a2adf match. Runnerdiffonlycomment/artifactnames/listcount. CLEAR4498probe->271wholefiles->sameconfig1800->4namedmutants180000+restoredcontrols, sameflags/priority/privatecfg, stopfirstunexpected/noretry/no extrarun. Resultpending; FEDR7unverified/freshfullP2round2/Q246/global/landing/row288 remain.647c1183readbackOPEN; Mos4499informed.
|
||||||
|
|
||||||
|
2026-10-25T09:35:26+00:00 | Sage 1ef1e4f8 | B1/647 newfullbuilder result and reviewROUND2 | Builder4498rc0/code81cbdea37/checkoute5a4ade07, evidenceonlyd817e5840/sourceunchanged. Independentlychecked281stepSHA/bytes/exact271list;whole2441tests2440pass0fail1FEDR7skip, probe30/config55->2526subtotal2525pass0fail1skip. All4namedmutants killed andrestored30controls/sourcebf96f941, all281driver/child19atstarts; no retry/timeout. Result20347f8a all11artifacts+282rawlogs(incldriver)verified;FEDR7UNVERIFIED/global/realrunnerSIGTERMlimitsretained. NewfullP2Boydround2request4501 includesoriginalB1/response/currentwholeP2/evidence/limits; notnarrowreview. Sequentialownerqueuetransitions4500pending. Queuecandidate standard33pathSHAmanifestfb0a7b68 pinsallchangedsource/test/script/publicdocs+DEFERRED; onlyappend-onlylogs/agents evidence excludedfromqueuepinbutretainedin111content/fullresultmanifests. Scopechoice+tradeoffstoredround2-source-scope.json: permittracking/evidenceevolution withoutweakeningsourcepin. Formalround2request/verdictrecordsawaitreceipts; freshfullClaude/Dewey/global/FEDR7/288stillrequired.647open/Mos4502informed.
|
||||||
|
|
||||||
|
2026-10-25T09:41:59+00:00 | Sage 1ef1e4f8 | Full P2 round 2 source approval and security review | Boyd0053 independently APPROVE whole P2 base78b69e1e6..d817e5840/source81cbdea37, B1 closed, no actionable findings; this is not landing approval or a recorded queue verdict yet. His 111-source-blob/11-committed-artifact checks and coverage limits remain attributed. Fresh full P2 Claude Opus5.5/high Q246 review dispatched as a NEW delegate_task, clientRequestId sage-4503-r331-full-r2-q246; prior narrow r5 approval is not reused. Dispatch metadata saved full-round2-dispatch.json. Review is read-only committed Git, no tests/proxy/live data or external writes. Queue owner moves succeeded4124/4125, round2 opened;4126 request failed due unset Magica credential, preserved in6a645188d. Sage GET user again verified jarvis; one canonical existing-round2 fallback request sage-4504-row331-round2-review is RUNNING(exec3218), not yet claimed posted. No duplicate operation; candidate fb0a7b68 unchanged.647 open; fresh review, recorded approvals, global/FEDR7/landing/row288 acceptance remain.
|
||||||
|
|
||||||
|
2026-10-25T10:03:36+00:00 | Sage 1ef1e4f8 | Full P2 round 2 corrected CHANGES / bounded preparation | Canonical fallback4504 completed4127/4128, request31702 read back jarvis/issue1829/round2/frozen33path fb0a7b68. No pending Sage queue operation. Initial independent Boyd APPROVE0053 relayed31703; fresh full Claude Q2464503 REQUEST_CHANGES saved full-round2-verdict.json and relayed31704, full range78..d817/source81. Original B1 closed but M1 terminal evidence lost on later PID reuse and M2 proxy admission suppressing historical recovery end/release are confirmed. Boyd0054 independently adjudicated CHANGES, superseding his assessment31703 without rewriting history; exact attributed correction31705 posted/read back. Boyd4515 instructed formal-pin verification then one CHANGES record as actorboyd; no round2 verdict record claimed yet. Prior narrow r5 approval and all builder receipts remain scoped; 271-file green cannot prove untested M1/M2.
|
||||||
|
Static source trace confirms known inventory loses terminal observations and exact old Broker launch matching precedes cleanup only after runtime admission; claims persist. Magica4513 authorised TEST-ONLY preparation, no product/Node/test/proxy/mutant/queue/newround launch: M1 sticky per-exact-identity strict confirmed-exit proof, separate outer/runner, stale registry protection, initial corrupt ticks/key still HOLD; no blanket mismatch=>exit or authority expansion. M2 persisted launch/claim restart matrix and negatives, exact Broker-owned cleanup proposal before any contract change; no usable cap/modelRuns/rotation-stop authority from cleanup. Marker direct-confined test may be drafted without mount expansion. L1 isolation and L3b orphan-key rehire confirmed; precise scope/repair proposals with Mos4514. L2 missing-boot hold documented tradeoff and L3a race remains fail closed. First-output clock currently starts at session launch before any model turn; Mos4511 owner-intent ruling pending, no timing/protocol edit. Source81/candidatefb0 frozen, global/FEDR7/row288/Dewey landing remain unfulfilled; no source approval or landing.
|
||||||
|
|
||||||
|
2026-10-25T10:06:00+00:00 | Sage 1ef1e4f8 | Mos1703 consolidated P2 intent/scope | Clock intent settled by Mos technical D17 reading, not a new Jason quote: one existing120s first-output budget starts at FIRST actual adapter/model turn; idle before it unarmed, no per-turn reset/extension. Task650 requires exact brief amendment/method/caller/marker delta + idle/silent/output/direct-confined cases before any product/run CLEAR. M1 task648 strict per-identity independently monotonic outer/runner confirmed-exit proof under existing absent/reaped rules only; no first mismatch or prior-live mismatch inference, no stop authority. M2 task649 Broker-owned exact immutable UNENDED cleanup, no capability/modelRuns/rotation-stop binding/new launch; exact unapplied contract/caller/negative controls must return to Mos. L1/L3b task651 static proposal/test-only prep authorised: independent instance work followed by original first error, unchanged1s/refusal; post-registration state/confirmed membership vs removed orphan/fresh issuance rules, no stale-key restoration. L2 documented hold accepted, L3a race explicit fail-closed follow-up.
|
||||||
|
Sage4517 delivered full bounded ruling to existing Magica thread; M1/M2 packets should return independently of clock/lows. Parent independently GET-read tasks647-651 OPEN/project19/owner Sage title; receipt mos1703-task-readback.json. Updated review ledger and saved exact relay. No source edits, Node/tests/proxy/sandbox/mutants/queue round/global/landing/row288 CLEAR. Boyd's ONE CHANGES record0002 remains pending per0055; no duplicate or inferred success.
|
||||||
|
|
||||||
|
2026-10-25T10:06:40+00:00 | Sage 1ef1e4f8 | P2 R2 formal CHANGES receipt | Boyd0056 definitive original command exit0; parent independently read canonical row331 round2 receipt opboyd-331-verdict-0002/rev4129/reviewerboyd/CHANGES/comment31705/frozenfb0a7b68 and exact manifest text/digest. Sole round2 verdict receipt is CHANGES; prior APPROVE31703 was never recorded. No pending Sage/Boyd queue operation; do not repeat. Saved round2-boyd-canonical-verdict-result.json and updated ledger. Mos1703/Magica4517 static-only prep648-651 remains unchanged, no product/test/newround/global/landing/row288 grant.
|
||||||
|
|
||||||
|
2026-10-25T10:19:11+00:00 | Sage 1ef1e4f8 | M1/M2 static packet review and M1 intended RED CLEAR | Inspectedbc6942412/test-onlynewmodel-terminal-proof7/model-historical-cleanup17/sharedfixture and exact UNAPPLIEDruntime/Broker+IPC proposals. Bothpreparedmanifests3666f737/b818438d each6artifacthash/bytes+9producthashes independently verified against source81; packages diffONLY3newtest/helperfiles. M1 independentownchildrenexit/reap, originalsweepcompletion observer, exactformerownPID syntheticproc only/restorednamedbuiltins+signalguard; firstcorruptticks/keyhold controls unchanged, no actualPIDreuseclaim. M2 actualStoreclose/reopen/persistedclaim/Launcher recovery, no fixturecleanupimplementation; oldfailures behavioral notundefinedfuturemethod.
|
||||||
|
CLEARsage4520 EXACTONEwholemodel-terminal-proof file pre-fix onsource81/testpacketbc6942412; expected2RED/5GREEN only, notobserved. Samewholeflags/nice19/measuredprioritiesload/privateconfig/cleanup/no retry/no productfix/M2/extra check/newround. Stop/reportwholefile; slot pending. M2 has NO execution CLEAR yet. SentMos4521 exactM1diffSHAa9189c01 andM2diffSHA92f3b899: new trusted recoverLaunch LAUNCH_OPS/Broker-ownedproof/sharedendSession/caller replaces bind+endRun, no cap/runs/modelRuns; real contract needs ruling beforeimplementation. Mos1703 required exactunapplied proposals now supplied; no global/landing/288 claim.
|
||||||
|
|
||||||
|
2026-10-25T10:21:52+00:00 | Sage 1ef1e4f8 | M1 intended RED verified / M2 intended RED CLEAR | M1sage4520 onbc6942412/source81 whole7exact5pass/2intendedfail, no skip/cancel/timeout/observercleanupfailure. Parent independently verified raw7562b5b6/7232bytes/all7names+assertions/counts; failedlatergenerationretirement andinitialcorruptkeyalreadyexitedretention, all5refusal/livecounterpart controls pass. Ownchildren exits/reaps precede syntheticproc; NOTactualOSreuse. FinalnoSignalscounterassertion inexpectedfirstfail wasnotreached; guard/interceptionrestoration remaincode/cleanup evidence, nooverstatement. Evidence-onlypacketpending; reportreceiptcc1726d6. Parent CURRENTcheckout9producthashes==81 +all6M2artifacthashbytesverified.
|
||||||
|
Mos1704 ACCEPTSexactM1a9189c01 +M2trustedcontract92f3b899 CONDITIONAL onbothintendedRED andboundedfocusedpacketinspectionbeforeapply. Sage4522 CLEAREDONLYONEwholeM2model-historical-cleanup file onunchanged81/pinnedtests; expected17/9pass/8failnotobserved, samewholeflags/nice/privatecfg/measurements, stopafterfile/no retry/productfix/extra/queue. Requestedstaticfocusedinventory/candidateplan plusNEWtest-only actualtrustedprocessIPC dispatchcoverage; existing17inprocessstandin isnotIPCproof. NoIPCtestexecutionorimplementationyet. Mosconcreteresult4523delivered. Old647REDs/narrowr5review/fullreceipts preservedatactualscope; no clock/lows/global/FEDR7/288/landing CLEAR.
|
||||||
|
|
||||||
|
2026-10-25T10:23:52+00:00 | Sage 1ef1e4f8 | Both M1/M2 intended REDs verified; implementation held at focused prerequisite | M2wholeRED4522 source81/testbc6942412 exact17tests9pass8intendedfail0skipcancel, no timeout/fixture/control/cleanupfailure. Independently rawf5f7a22e/15148bytes+all17names/outcomes/8namedassertions match preparedmap; CURRENT9productpaths byteidentical81. EarlierM1exact7/5pass/2intendedfail rawverified with signalcounter-notreached and synthetic-onlyreuse limits retained. Parent independentchecks saved separately; builderreceipt M2reported5aff9915, committedreceipt-manifestverificationpending.
|
||||||
|
Bothrawprerequisitesnowverified, notimplementationCLEAR: inspectstaticfocusedwholefileinventory/controls/newcandidateprovenance andactualtrustedprocessIPCcoveragepacket first (existing17inprocessonly). Magica0066preparingstaticpacket, no productfix. Mos4524 concrete result / Magica4525 verified nextprerequisite delivered. Tasks648/649 comments posted/readbackOPEN [{"task": 648, "commentId": 1190, "readBack": true, "done": false, "bodySHA256": "173c05ddd38776b94c2d29b3e3d6a21877f47de071059593e27fb0661fe78c8a"}, {"task": 649, "commentId": 1191, "readBack": true, "done": false, "bodySHA256": "2944d5578dafc77d47e6ab9e2b3d851a3216ac271f3cc64811f2bf34b3b7f33e"}]. Exact2diffconditionalMos1704 scope stays; clock/lows separate, no additionalexecution/newround/global/FEDR7/288/landing authority.
|
||||||
|
|
||||||
|
2026-10-25T10:32:33+00:00 | Sage 1ef1e4f8 | ActualIPC/focused prerequisite inspected | Magica0067 separateM1/M2 evidencec3eb95242 andstaticIPCpacket05d6a3336. Parent verifiedbothREDresultmanifests a5d5c48c/14059b83: each9committedartifacts+2raw/driver hashes, byteswherepresent/beforeafterequal. No earlierreceiptverificationpending. ActualIPCpreparedmanifestc5373f1d all11artifacts+9unchangedproducthashes/currentfilesverified. New9cases realstartHostfork->processboot->runtime/Broker, requiredreaderboot, ownedhost-firstcleanup, persistedSQLiteclaim/endhistory, directops+actualLauncher; no mockeddispatch. Existingordinaryfreshadmission/no-launchcontrolspreserved, newrefusalsmustleavechannelusableafterfix. OldunknownIPCpathcancloseownhostasintendedRED, notclaimednewchannelproof.
|
||||||
|
AcceptedboundedFOCUSED20wholefiles exactb5448102 +staticdependency/forkjustification: threeM1/M2/IPCregressions, originalrestart/boundary/modelkeys/stop/proxy, Broker/routes/import/sessions/threadclaims/end/process, seatrealconfinedsession/sandbox, CLIhost/launcher/sessionlaunch. Currentcandidateprovenanceplanretainold81/fb/R2CHANGES; correctedproductcommitAFTERapplicablefocusedGREEN, contenthashcanfreezeuntestedworktreefirst.
|
||||||
|
CLEARsage4527 EXACTONEwholemodel-historical-ipc.test pre-fixsource81/05d6a3336test expected9/2pass/7intendedREDnotobserved. Samewholeflags/nice19/measuredpriorities/load/privatecfg, actualforksnooverclaimedmeasurement; stop/reportwholefile/no retry/fix/otherfile/mutant/queue. ImplementationNOresumeuntilintendedIPCREDverified; exactMos1704two-diffscopeonlyafternewCLEAR. Mos4528informed. No clock/lows/global/FEDR7/288/landing grant.
|
||||||
|
|
||||||
|
2026-10-25T10:36:24+00:00 | Sage 1ef1e4f8 | All intended REDs verified / EXACT M1+M2 focused resume | ActualIPCRED4527 on05d6a3336/source81 exact9tests/2pass/7intendedfail0skipcancel, nofixture/harness/cleanup/timeoutfailure. Parent raw6ba10393/13478bytes/all9names/outcomes+assertionschecked andCURRENT9producthashes81. Separateevidence07292713b/resultmanifest16f058a1 all9committedartifacts+2raw/driver hashes/byteswhereprovided checked, machine testedCheckout05d6a3336 andbeforeafterequal. Human-summary e05typo remainshistorical, machinepin correct. Limits: onlyfirstdirectopcapturedinvalid-host-request; otherpredicateinnercodesnotcaptured andpostrefusalchannelassertionsnotreached. Nestedforkpriorityinheritednotindividuallymeasured; no pre-rootlockinventoryassertion.
|
||||||
|
AllMos1704conditionsnowmet: bothoriginalM1/M2intendedREDs+actualIPCREDverified, acceptedfocused20exactlistb5448102/dependency/realforkpacket/newcandidateplan inspectedbeforeapply. RESUME/CLEARsage4529 EXACTcombinedM1a9189c01 +M292f3b899, ONLYfourproductfiles broker/runtime/process/launcher. Freezeappliedsource/testcontent/runner/listbeforeexecution andcompareagainstexactcombineddiffs. Run20serialWHOLEfiles orderfrozen, sameflags/nice19/actualmeasurements/privatecfg; STOPfirstunexpected/no retries/fixtureassertiondeadlineedits/otherrepairs. IPCGREENmustreachpreciserefusal/channelguards/no cap/no proxyPUT/modelStallbinding; M1mustreachnoSignalscounterafterretirement. Confinement unavailable=UNVERIFIEDnotgreen. CommitproductONLYafterapplicablefocusedGREEN, thenmapcontenttocandidate. Readonlypinnedparsergraph/list/fullpacketpreparationafterGREENallowed; full/mutants/acceptance/newround remainSEPARATECLEAR. No clock/lows/global/FEDR7/288/landingauthority. Mos4530concretestate delivered;647-651open.
|
||||||
|
|
||||||
|
2026-10-25T10:45:39+00:00 | Sage 1ef1e4f8 | M1/M2 focused GREEN independently verified / final gate sequencing | Magica0071SLOTBACK4529: all20wholefiles254/254pass, zero fail/skip/cancel/timeout. Parent resultmanifest5596c74f all7artifacts+20rawSHA/bytes andcounts verified, frozen29files38c7a9e6/source26e3aef0 unchanged; separately appliedbothacceptedpatches to81 inownedtempscratch andbytecomparedall4products. ProductcommittedAFTERGREEN5868d77f18abeb01d2822cb475df48ce1336ae58, packet860582c27. All180content63642ecf blobs+37fullsourcebehavioura1cec8b5 entries independently checked; frozen29testedfilesmapexactlycodecommit, no oldtests/ModelKeys or packet-tip packages/scripts/DEFERREDdelta. IPC9 now reachesexactrefusal/channel-survival/no-cap/no-proxyPUT/modelStallrefusal/claimrelease/fresh/no-launchassertions; M1reachesnoSignalscounter; actualsandbox11/session13 passnonskip. RealOSreuse/realrunnerrotationSIGTERM/nestedforkprioritymeasurement/independentpre-rootlockinventory NOTclaimed. Manual0070header time correction10:39:41Z retained; rawmeasuredtimestamps unchanged.
|
||||||
|
Fullpacket98e601a9 all13artifacts/list274/graph17 verified: prior271retained+EXACT3newtests, no othercollaterals/omissions; fullrunnerdiff onlycomment/evidencenames/listcount. UNEXECUTED/no fullCLEAR. Sage4531 toMagica immediateALREADYauthorisedSTATIC650clock/651lowcontracts+testprep; finalwholebuilder+freshfullP2/Q246reviews sequencedafterremainingknownsourcecontractssettle tovalidatefinalsource, no scope/gatewaiver orcompositegreen. Mos4532concreteresult/orderinformed; anyacceptanceorderingconflictreturnedbeforeextraexecution. No650/651productedit/run/newqueue/global/FEDR7/288/landinggrant. Tasks648/649updated/readbackOPEN [{"task": 648, "commentId": 1192, "done": false, "readBack": true}, {"task": 649, "commentId": 1193, "done": false, "readBack": true}];647-651remainopen.
|
||||||
|
|
||||||
|
2026-10-25T10:52:07+00:00 | Sage 1ef1e4f8 | Static651 L1/L3b inspection before RED | Magica0073 prepared0ec63de70: independent each6artifacthash/bytes+9unchanged5868producthashes match L1manifest3b73bbcb/L3bbe635be2. NoNode/run/productchange. L1exactdf4ee0f4 per-instance try/catch serialsweep/firstErrororiginal/rethrowafterothers/valuefreeoutcomes meetsdirection, sentMos4535forcontractruling. New4tests expected3RED1GREENnotobserved. L3b46e68bc6 postregisterhold+freshsentinelledmembershipbeforecachedreturn/freshkeyGETPUTGET ifmissing preservesold.retiring, new6unitexpected5RED1GREENnotobserved. Concretebranch discrepancy: explicitrotate appendsoldcurrentevenifconfirmedabsent while reportclaimsnoinventedretiring; recommended appendonlyrotate&&present, exactstate/rule returnedMos4535beforecode.
|
||||||
|
Sage4534 STATIC corrections only: fixture valueFree losesclosedorremovedmodelkeys, requireimmutablehistoryscanningallfixturessecretvalues withoutprinting; attemptallownedcleanup. Requireexactstate/table/preservationcontrols andseparateactualruntimeorganizationhireorphan+failure/revokingmembershipcontrols, notcontrollercontinuationoverclaim. L1mayreturnindependentlyofL3b/650. NORED/CLEAR/productimplementationgranted; clock650staticcontinues. Task651comment1194posted/readbackOPEN. Finalfull274/reviewsremainunexecuteduntilstablecandidate; no gatewaiver/compositegreen/global/landing/288.
|
||||||
|
|
||||||
|
2026-10-25T10:57:41+00:00 | Sage 1ef1e4f8 | Mos1705 exact low-branch ruling and L1r3 intended RED verified | Mos1705relayed4537: L1removeunconditionalcomplete receipts, keeprefused-only/existinglifecycle receipts/1s+firsterror; addnoopreceiptcontrol. L3bpreserveold.retiring ALLbranches, appendcurrentONLYrotate&&confirmedpresent, noabsentcurrententry; initial/postregisterhold/freshserializedGET/sentinel/GETPUTGET/privatepersistbeforepublication unchanged. Fulltable/no-record/revoking+actualruntimehirecontrolsbeforeRED, noimplementationgrant.
|
||||||
|
Magica0074helperr2history/canary/guardedcleanupinspected; correctedL1r3 745875432exactdiff93e4de1e andmanifestd2a62d03 all6artifact/9CURRENTproductbytes5868verified. CLEAR4538 ONLYonewholemodel-sweep-isolation file unchanged5868/pinnedr3 expected5/2pass/3RED. SLOTBACK0076 actualexactexpected, zero skip/cancel/fixture/cleanup/timeout. Parent resultmanifest89adad47 all8artifacts+raw416ec873/3514bytes/allnames/assertions/counts/beforeafter+CURRENT9productsverified. Exactoriginalfirsterroridentityassertion passedbefore laterfailure visitation; bothnormalretirement/historycanary and3no-op/no-churncontrolsGREEN. Ownedroots0/nolivechildfixtures reported. Evidencecommitpending; no productfix oradditionalrun. Mos4540/Magica4541verifiedstatusdelivered. Task651c1196readbackOPEN.
|
||||||
|
No L1implementationresume: boundedfocusedplanneeded; L3bcompletebranch/runtimepacket+650clock stillSTATIC on5868. RejectedPUTpayloadcapturehistoryrequestedAFTERL1slotback/newpins (currenthelper503beforebody missesattemptedfreshvalue), oldexecutedr3anchorpreserved. Final274/fullreviewpacketstaysunexecuteduntilstablefinalscope; Mos1705acceptssequencing, no gatewaiver/compositegreen/global/FEDR7/288/landing.
|
||||||
|
|
||||||
|
2026-10-25T11:03:27+00:00 | Sage 1ef1e4f8 | Clock650 static protocol inspection / no run | Magica0077 clockpacket994ead40a b26004a3 independently8artifacthash/bytes+5unchanged5868productpins verified. ExactUNAPPLIED0875b66f+D17amendment3ea62438 returnedMos4543 beforeimplementation/RED: adapterchildspawn armingboundary, newexportinexistingmountedfirst-output, ownrunDiratomic0600temp/linknoreplace, bounded64byteNOFOLLOW/NONBLOCKread, absentunarmedvsnewmalformed/future/unreadableimmediatestallpolicy, internallegacydefaultfalse/managedtrue. SharedclockoriginLinuxINFERENCEfromprimaryNodeHrtimeBigInt->uv_hrtime->preciseCLOCK_MONOTONIC pluslocalsandboxuser/pid/ipcnamespacesnot-time; actualbwrapboundsuntested. Upstreamsource/doclinks savedclock650-static-inspection.json; no localNode execution.
|
||||||
|
Foundstaticnewreaderdefect: .toString(ascii) strips highbitsperofficialNodeBufferdocs, so proposedexactASCIIvalidationnottrue. Mos4545/Magica4546 sentstrictUTF8+ASCIIregexorrawbytecheckrevision/highbitnegatives; original0875byteshistoricalnotacceptedfinal. Magica4544 additionalSTATICnegatives symlink/FIFO/nonblocking/size/mode/shape/zero/future/lateembeddeddeadline andproducer-spawn-callbackfailurecleanuptrace; no broaderhandler/sourceeditwithoutcontractruling. Current3newfiles9casesexpected5RED4GREEN NOTobserved; no clockRED orproductCLEAR. Task650c1197posted/readbackOPEN. L1evidence2a2b0136b committed8artifactsnowverified; originalL1REDrawalreadyverified. L3bfulltable/runtimepacketstatic. Noactivegate/queue, product5868 unchanged; finalfull274/reviewsunexecuted/no gatewaiver/global/FEDR7/288/landing.
|
||||||
|
|
||||||
|
2026-10-25T11:07:40+00:00 | Sage 1ef1e4f8 | Mos1706/1707 clock boundaries relayed, exact revised bytes pending | Sage4548 relayed1706: successfuladapter/bin/shspawn acceptedboundary; embeddedonce120deadline/firstoutputcancel/readNOFOLLOWNONBLOCKregular0600currentuid<=64positive-nonfuture acceptedLinuxinferenceonlypendingrealconfinedtest. Invalid/future/unreadable=>singleexistingtrustedstop/valuefreereceiptaccepted; ENOENTunarmed. Internallegacywatcherdefaultfalse acceptedONLYmanagedlaunchertrue/no userconfig. StrictrejectANYbyte>127 beforedecode+exactASCIIshape, highbitprefix/digit/newline+extra/trailingcontrols required; original0875NOTacceptedbytes. Producerfailure mustbecaughtwithinlifecycle, ownedgroupboundedTERM/KILL+reap, controlledcleanup/exit/nolaterturnfirststamp/fixeddiagnostic. TempownershiponsuccessfulexclusiveOPEN, guardwrite/close/unlink/collisionpreexistingneverremoved. Revisedexactdelta beforeclockRED/productCLEAR.
|
||||||
|
Sage4549 relayed1707: preserveNONPROXYbehavior, no unconditionalnewhardlink/timestampdependency, no session.json/publicconfig/envschema; smallest internaloptin within4files, host-ownedrunDirmarkerproposalallowedbutexactbytespending, addnonproxycontrol. Parent read-onlycallertrace runTurnlanding540/message581/retry630, top-levelawait/eventcallbacknocatch; mainnormalserver/toolcleanup androle.release onlyEXIT.stopped; hostexitendRunreleasesclaim/records/unregisters/lockcleanup. Senttrace/no genericcatchclaim/clearescalationtimerafterchildclose/reap. No parentorchildproduct/testexecutiongrant.
|
||||||
|
OriginalL1RED4538/evidence2a2b0136bverified; L3bowner-resolvedstate/runtimepacketstatic; currentproduct5868 unchanged/focused254, full274unexecuted/finalfullfreshreviewsafterstablecontracts. No gatewaiver/global/FEDR7/row288/landing authority.
|
||||||
|
|
||||||
|
2026-10-25T11:21:49+00:00 | Sage 1ef1e4f8 | L3b exact scope, fixture diagnosis/correction, both intended REDs verified | Inspected311f49d51 L3br3 manifest3305ad47 all10artifacts+9CURRENT5868products; full14controller/3actualruntimehire/sharedhistoryrejectedPUTbefore503/guardedruntimecleanup. Exact43c14 #issue only matches1705resolvedtable. Mos1708 conditionalexactcontractaccepted, EXISTINGmodelOrganization failedhirecleanupaccepted unchanged: existedfalsebeforeorphanregister canrevoke/deleteconfirmedunpublishedorphan onfailure; controllerfileimmutabilityonly, runtimeexactmembership/no stale restoration/nousablecredential, NOTnoHTTP/immutableorphanfile/atomicrollback. No wrapperedit.
|
||||||
|
InitialCLEAR4551ONEcontroller endedUNEXPECTED14/4pass/10fail:7intendedassertions+SETUPcredential-format2/13/14. Parent verifiedraw8b61b9d8/11487bytes andCredentialsinstant exacttoISOString validation; newfixturetimestampslacked.000Z. Stopped/noauto-retry.4552authorisedONLY3canonicalnewfixtureliterals(controller2/runtime1), noassertion/deadline/helper/productweakening. Unexpectedevidence6f12b6df7/resulta6c1a31b8artifacts+rawverified/preservedseparate. a27f07e20 r4manifest814d2849 all11artifacts+9CURRENTproductsverified, bytecomparison EXACT3timestampchanges vs311only2testfiles; originaltestblobspreserved.
|
||||||
|
NewCLEAR4555ONEcorrectedcontroller actual14/6pass/8intendedfail1,2,3,4,5,7,8,10;controls6,9,11,12,13,14GREEN, no setup/cleanup/timeouts/skips. Parent verifiedresultf3d609e98artifacts+raw364f864f/8743bytes/allnames/assertions/current9products. SeparateCLEAR4557ONEruntimehirefile actual3/0pass/3intendedfail, parent verified6cf6235e8artifacts+rawe36fb211/2855bytes/names/assertions/products5868. Realinprocessruntime/Broker/SQLite/organization/fakeHTTP NOTprocessIPC. Evidencecommitpending; no productfix oradditionalrun. Mos4553/4556/4558/4560resultsrelayed; Magica4559nextfocused/candidatepacketbeforeapply. L1r3+L3bexactproposalsstillUNAPPLIED.
|
||||||
|
Source-onlycross-scopehypothesis4554: knownliveoldcurrent ->confirmedremoteabsence->newgenerationdropsoldcurrentmetadata ->M1keyassociationcanholdbeforeterminalproofevenafterOSexit. Mos1709 created652/openproject19ownerSage, explicitlyUNVERIFIEDconservativeavailabilityinteraction NOTconfirmedregression/blocker orpermanentacceptedlimit. STATICregression/proposalonly relayedMagica4557; exact5868+accepted43c14combinedcontext/ensure-rotate/separateouter-runnerOSexitvsterminalproof/laterretirement/staleRegistry-norun-corruptkeynegatives/map/minimalfuturewholefile scope withnextfocused/implementationpacket. NOextraexecution/fix/keyguardweakening/oldkeyretiringre-add/remoterestore/knownerasure/stopauthority. Finalfullreviews MUSTreceivependinginteraction+eventualexplicitdisposition. Currentruntimetestpathnotblockedby652prep.
|
||||||
|
Tasks651/652updated/readbackOPEN [{"task": 651, "commentId": 1200, "done": false, "readBack": true, "title": "Full P2 low findings: record L1-L3 dispositions and bounded follow-ups (owner Sage)"}, {"task": 652, "commentId": 1201, "done": false, "readBack": true, "title": "Investigate M1/L3b lost key association and later retirement availability (owner Sage)"}]. Currentproduct5868/focused254 unchanged; noactivegate/queue. AwaitexactL1r3+L3bfocusedinventory/candidateplan+652proposal and650revisedprotocol/strictbyte/fatalcleanup/nonproxyoptintests; finalfull274remainsunexecuted, no gatewaiver/compositegreen/global/FEDR7/288/landing.
|
||||||
|
|
||||||
|
2026-10-25T11:24:51+00:00 | Sage 1ef1e4f8 | Bounded low-focused packet and652 static proposal inspected beforeapply | Magica0083 packet13d6782dd manifest4ded0ff6 independently33artifacthash/bytes+CURRENT9products5868verified. ALL3 intendedREDresultmanifests recursively8committedartifacts+raw EACH verified, L3b pendingcommitverificationresolved; unexpected4551remainsseparate. Exactfocused23 list7f07e95e=3newL1/controller/runtime first +old20unchangedorder/noomission. Parentindependentownedtempscratch apply EXACT93e4de1e+43c14 to5868 ModelKeys gives815b92c8e0b7b6eca8495ea745c0ec7cfdc91296a44d9b0a62b94ed9b5bc9e1d, no worktreeapplication. Freezeactualcandidate/base/list/runnerbeforetest/commitafterGREEN planinspected; productModelKeysonly/no wrapper/reconcile/runtime/clock change.
|
||||||
|
Read652STATICproposalb993ae6e andcontext713110d6: no testauthored/executed/fixselected. Old5868ensurefailsknownL3bsetupprecondition/rotateappendstheoldcurrent; combinedacceptedbranchdropsabsentold thenhypothesizedincompleteproofassociationhold afterobservableOSexit. Proposedfuture1runtimefile ensure/rotate×staleRegistry/[]+terminal/no-run/corrupt/ticks/partial/changedidentitycontrols, no guardweakening/erasure/re-add/authority. RemainsUNVERIFIED/notblockerorpermanentacceptedlimit.
|
||||||
|
Mos4562 EXACTimplementationprogression+652scopeRULINGrequested: recommendonlyaccepted2lowdiffapply+inspected23focusedGREEN thenMEASURED652followupbeforefinalreview, firstauthoriseSTATIConefiletestpreptheninspect/separateboundeddiagnosticCLEARonfrozencombinedcandidate; noadditionalfix/limitbeforeevidence. Magica4563verifiedpacket/stateinformed NOapply/focused/652testauthoringgrantyet; existing650staticworkcontinues. Noactivegate/queue/productchanges;5868current/focused254,full274UNEXECUTED, freshfullreviews/global/FEDR7/288/landingstillunfulfilled.
|
||||||
|
|
||||||
|
2026-10-25T11:29:08+00:00 | Sage 1ef1e4f8 | Mos1710 exact low implementation resume, staged before actual run | MosauthorisesONLY93e4de1e+43c14 appliedto5868, soleModelKeys productblob815b92c8; exact23wholelist7f07e95e. D2requiresSAGEinspectactualdriver/list/config/baseHEAD/uncommittedcandidateblobs/soleproductdelta/all23tests/sharedinputs/9baselineproductsBEFORErunning. Relayed4564apply+freezeactualpacketNOWbutNOtestexecutionuntilparentinspectsandissuesactualrunCLEAR. Samewholeflags/nice/privatecfg/stopfirstunexpected/no retry/testhelperassertiondeadlineedit/extras; productcommitafterapplicableGREEN/mapfrozenblobs, receipt-tipsdistinct. No wrapper/reconcile/runtime/clock/guard/timer/refusal/authoritychange.
|
||||||
|
MosD4choosesMEASURED652followupbeforefinalfull-reviewacceptance. ONLYAFTERfocusedGREEN newcandidate frozen: staticauthorship/preparation1futuremodel-key-loss-interaction runtimefile/neededapprovedtesthelper underb993/context713/ownprocesses/realHTTP/originalsweeps/matrixnegatives andexplicitOSexitvsproof; NOexecution/prodseam/fix/guardweakening/implicitpermanentlimit/blockerclaim. CompletepacketthenSEPARATEdiagnosticCLEAR. FullfinalP2/Q246briefspreserveunresolvedinteraction+eventualdisposition.650staticindependent, finalfull/Q246/global/FEDR7/288/landingremain. Currentlaneidle/noqueueop; pendingactualappliedfreezeinspection.
|
||||||
|
|
||||||
|
2026-10-25T11:35:16+00:00 | Sage 1ef1e4f8 | Actual low pre-run packet inspected / RUN CLEAR4565 | Magica0084 soleModelKeys exact815b92c8 appliedUNCOMMITTED; receipt-only46c00e741, basebeforeapply13d6782dd. Parent verifiedmanifestd142c7ba10artifacts+CURRENT36frozeninputs0ebc27f9+41SCOPEDsourcepins643c5f72(all23tests/sharedhelpers/9criticalproducts/driver/list), 9baseline5868products (8unchanged+soleModelKeysdelta). Independentlyagainappliedaccepted93e4de1e+43c14inownedtempscratch andbytecomparedactualModelKeys. No stagedproduct. Actualdriverfe65fe8e/config301d4865/list7f07e95e/baseHEADinspected. Independent6503testdraftsdirtyOUTSIDE23scope; no clockproductchange, 41scopedmanifestnotclaimedallunrelateddrafts. BoundedNodeprocessscan no competingtest/gate.
|
||||||
|
ActualRUN CLEARsage4565 delivered EXACT23serialWHOLEfiles, receiptactualclear+frozenCandidateSha2560ebc27f9; sameabsolute--test--test-reporter=tap/defaultoutertimeout0/perfiledeadlines/nice19measureddriverchild+load/privateHOMEconfigTMPDIR. STOPfirstunexpected/no retry/frozenhelperassertiondeadlineedit/extra/full/mutant/config/acceptance. ProductcommitONLYafterGREEN/map36/41testedcontent BEFORE652helperauthorship; don'tstageindependentclockdrafts. AfterGREENonlyMos1710STATIC652onefuturetest/helper, no diagnosticexecution/seam/fix. Mos4566concretestateinformed;651c1204readbackOPEN. ResultPENDING/laneRESERVED,no passingclaim. Finalfull/Q246/global/FEDR7/288/landing remain separate.
|
||||||
|
|
||||||
|
2026-10-25T11:39:57+00:00 | Sage 1ef1e4f8 | Lowfocused GREEN independently verified /652static preparation resumes | Magica0085SLOTBACKsage4565 exact23whole276/276zero fail/skip/cancel/timeout/cleanup. Parentresultmanifestfe6652a8 all8COMMITTEDartifacts+23rawhash/bytes/perfilecounts/priorities verified; actualreceiptCLEAR4565/frozenCandidate0ebc27f9 matches. All36frozeninputs+41SCOPEDsourcepins643c5f72 mapexactlypostGREENproductcommit6d3edea61f0d46654771a51b505cd21473617679. packages/scripts deltafrom46receiptONLYModelKeys815b92c8 acceptedcombined, no clockdraftsstaged. Perfilecounts5,14,3,7,17,9,12,2,30,7,14,16,4,3,7,6,3,8,13,11,43,34,8. Driver/testchild19all23; nestedforkinherited/notallmeasured. ActualIPC9/sandbox11/session13nonskip;650directmarker/timestampUNEXECUTED. SleepnotrealrotationSIGTERM/PIDreuse/independentpre-removallockinventory limitsretain.
|
||||||
|
Mos1710D4conditionalnowmet: Sage4568resumedONLYSTATIC652onefuture runtimefile/neededtesthelper preparation onFROZEN6d withproposalb993/context713, ownprocesses/realHTTP/originalsweeps/OSexitvsacquiredproof/matrixnegatives. NOdiagnosticexecution/prodseam/fix/guardweakening/oldcurrentreadd/remoterestore/stopauthority/permanentlimit/blockerclaim. Separateinspectablepacket/map thenfutureCLEAR/disposition; fullP2/Q246briefmustcarryunresolved652. Mos4569concreteresultinformed. Existing650revisedexactprotocol/negative/failure/nonproxy packetreadyindependenthandoffpending, no clockproduct/REDgrant. Slotfree/noqueuepending. Full274historicalunexecuted/finalgraphandgatefreshreviews/global/FEDR7/288/landingremainunfulfilled.
|
||||||
|
|
||||||
|
2026-10-25T11:48:57+00:00 | Sage 1ef1e4f8 | Revised650 exactprotocol/tests inspected / no RED | Magica0086 packet9507e2ee4 manifest4284d712 all21artifacthash/bytes+5CURRENTclockproducts identicaltestedlow6d verified. Parenttemporaryapply exactUNAPPLIED755290c5ef575a3e68d714bf42fffbb5ffe21e00fd34766cf0cfbebaad4afc71 to6d yields4proposedclockproducts (noModelKeysdelta): first-output6263d358/runnerd4bfea03/model-stall0bdc91dc/launcherd2527440. D17/brief amendmentabd21fcb. Strictbytes>127BEFOREASCII/canonicalpositivefullcontent/64/NONBLOCK-NOFOLLOW-fstat-uid/FDclose/onceembeddeddeadline inspected. ProducerexclusiveOPENowns immediately; independentwrite/link/close/unlinkfixederror/collisionnoownership. Proxy-onlyhostenablefile/runnerprivatecachedexistsafterJSON/no publicschema; managedwatchtrue/internallegacyfalse. Controlledspawnerrorcatch withinPromise, TERM+tracked5sKILL, waitclose/reap+cleartimers, fixedprivateresult, all3callersafterusageendterminate, exit2/server-socket+role.release/hostend path inspected.
|
||||||
|
Readall5newtestfiles/fakechildprobe+actualunconfinedpubfailurepreload: narrowownedfspath/fd/groupinterception/restorenamedbuiltins, actualBroker/libraryguard/currentchildprocess, notconfinedfault orTERMresistantproof. Readerinvalidcount/single-stop/FDcleanup/FIFOownedchildbounded; oldexpectedfailuresassertionsnotnewtimerpolicy. Wrongowner/unreadable-valid0600 UNVERIFIEDexplicit. Actualbwrapstdout/nonproxy/timestampbounds UNEXECUTED. RemainingNEWunexecutedsource-grepmanagedcaller test mirrorsimplementation; Sage4570requestedmovetoexplicitcoordinatorinspectionnotes (callerinspected), preserveALL5actualclockbehaviorcases; likelyrefresh36total31RED5GREEN instead37/32/5. No oldtests/assertionschanged/no clockrun; exactprotocol755unchangedbytest-scopecorrection. SentMos4571 exactproduct+doccontractforfinalruling, currenthash755NOTapplied/REDauthorized. Task650c1205readbackOPEN.652staticonefileprepindependent/currentlow6d276verified. Noactivegate/queue/full/global/FEDR7/288/landinggrant.
|
||||||
|
|
||||||
|
2026-10-25T11:53:25+00:00 | Sage 1ef1e4f8 | Clockr3 testscope verified /Mos1711 exactcontractacceptedconditional | Magica0087 1ac21d36c r3manifest54a7ecfb all21artifacthash/bytes+5CURRENTclockproducts==testedlow6dverified. Parentbytecomparison950..1ac ONLYnewunexecutedsource-grep testcase removed, ALL5actualbehaviorcases unchanged/otherpackage-scriptfilesunchanged; map36total31expectedRED5GREEN NOTobserved. Independentlowmapping852a8da71 artifactl1-l3b-tested-commit-map.json9a5bf68f checkedall36Gitblobids/hashbytesat6d(41scopedsourcepreviouslyindependentlyverified); maprecordedbefore652authorship.
|
||||||
|
Mos1711 conditionallyACCEPTSEXACTUNAPPLIED755290c5fourclockproductdelta+abd21fcbtwo plan-docamendments, readsallsource/tests/diffs/appliedonlytempscratch. Boundaryoptin/strictmetadata/ownedcleanup/nonproxy/limitsunchanged. NOclockproductapply/focusedgrant. SequentialONEWHOLEperREDclear allowedONLYafterSageinspectsrevisednotes/test/helper/maps/pins+currentclockproducts/lowmapping. One remainingnotes-onlycorrection: JSdollaranchor withoutmultilinematchesinputend (not optionalfinalnewline); keepfullmatch-lengthguard/trailingnegativeunchanged. Relayed4573 staticnotesrepinbeforefirstRED. ParentcheckedTC39primaryCompileAssertionURLread(noNodeexecution), linkretained. ActualconfinedcasesMUSTnonskip/unavailableSTOPprogression; no aggregate/unconfinedsubstitute, no in-flightedits/retries. Wrongowner/unreadable0600/TERMresistance/unconfinedfaultlimits retained.
|
||||||
|
Noactivegate/queue;clock755UNAPPLIED;lowtested6d276current. Awaitnotes-correctedclockmanifest thensequentialRED firstfileCLEAR;652staticdiagnosticpacketindependent/noexecutionfix. Finalfull/Q246/global/FEDR7/288/landingunfulfilled.
|
||||||
|
|
||||||
|
2026-10-25T11:59:06.171733+00:00 — Sage — row331 clock650: inspected r4 eac71305 pins, corrected notes and unchanged low6d products; issued ONE-file intended RED sage-4574 (5 expected:3pass/2fail); no clock product application. 652 static packet received, no execution.
|
||||||
|
|
||||||
|
2026-10-25T12:02:48.839223+00:00 — Sage — row331 clock650 firstthree separate intended REDs verified: clock5/3/2, reader19/1/18, producer7/0/7. Producer failure stops before ownership/fault checks; no proof claim. Nineproducts/frozeninputs match low6d. Issued4580 ONLY actual confined file2cases expected1controlpass/1missingmarkerRED; skip/unavailable stops. Task650c1207 read back. 652static packet sentMos4576 awaiting exact diagnostic ruling, no execution. No clock application/full/global/landing. Next4581.
|
||||||
|
|
||||||
|
2026-10-25T12:08:14.044541+00:00 | Sage4584-4585 | ALL5clockREDindependentlyverified36/5pass31intendedfail, allnamedassertions/frozeninputs/nineproducts==low6d,0skip/cancel/timeout/cleanup. Parent aggregate clock650-all-five-red-audit.json, individualauditchecks persisted. Finalraw9837707f/2961/result441954f5. No clockproductapply, actualclockfocused/contentpacketpending.652exactdiagnosticMos1712conditionalactualdriverinspectionpending/noexecution. Next4586.
|
||||||
|
|
||||||
|
2026-10-25T12:21:07.402725+00:00 | Sage4592-4594 | #652ONE4590 diagnostic13/9safetyCONTROLpass/4final-livenessFAIL. All4ensure/rotate×stale/[] reached finalretirementassert aftervalidsetup/postphaseoriginalsweeps/realHTTPkeyloss/freshrepair/independentOSreaps. Parent10resultartifacts+rawc147036b39395/0c88bc5a/ninebeforeafter==6d/source42currentverified;0skip/cancel/timeout/cleanup,19/19,ownroots0. SentMos4592 explicitdispositionrequired, recommendboundedSTATICrepairproposal notpermanentlimit; NO652fixselected/sourceedit. Clock755UNAPPLIED/all5REDverified/focusedstaticpacketpending. Actualunused4588/hold4589/sole4590machinecontextpreserved; humancontextsentence typoexplicitinsummary. Next4595.
|
||||||
|
|
||||||
|
2026-10-25T12:25:05.918909+00:00 | Sage4595-4596 | Clock650focusedpacket8046314af/4058a60a independentlyverified26artifacts+5REDpins/currentbytes.15wholelist0bd38b5d, reasons/driverread; OWNtempscratch exact755+abd applies current6dbase andmatchesall6virtualSHA/bytes/Gitblobs, realproduct/docsUNAPPLIED. SentMos4595 exactapplication/focusedruling request:ONLY4products+2docs; actualpre-runfreeze+SageCLEARbefore15run, commitonlyGREEN. Broadercollateral FINALgraph;noneof15usesnew652helper; markerproductioncallerSOURCEonly; wrongowner/unreadable/currentLinuxbounds/unconfinednotTERMresistance limitsretained. #652measured13/9controls/4finallivenessfails awaitsMos4592EXPLICITdisposition beforeANYfix/permanentlimit. Allcurrentsource6d/ModelKeys815unchanged; no activegate/queue. Magica4596auditACKdelivered, no additionalrun/editCLEAR. Next4597.
|
||||||
|
|
||||||
|
2026-10-25T12:26:15.846556+00:00 | Mos1713 disposition #652 CONFIRMEDAVAILABILITYDEFECT measured6d, remediationREQUIREDbeforefinalP2acceptance; no permanenthold/restartresolution/notauthoritygain. Parent4597relayedSTATICruntime/privateinventoryproposal ONLY: perexactidentity positivekeyassoc+strictbothprocessvalidation beforemonotonicprovenance; afterloss allowonlystrictabsence/reaped/samestartzombie, LIVE/unknown/mismatch/readerrorhold. Preserveinitialguards/boot/stopauthority/L3btable/allpubliccontracts, noabsentkeyreadd/restore/knownerasure. ReturnEXACTunapplieddiff/statetable/existing13mapping/newnegativecontrols/boundedfocusedplan beforeANYnewexecution/sourceedit. Clock8044058separateunderMosinspection. Next4598. Singlequeue-next2503pendingnoduplicate.
|
||||||
|
|
||||||
|
2026-10-25T12:29:22.883268+00:00 | Mos1714 /Sage4600 | AuthorizeONLYclock755fourproducts+abd2docs, sixpaths; virtualc0732a15independentlymatchedbyMos+Sage. Relayed4600APPLICATIONONLY toMagica, accepted15wholelist0bd38b5d but NOtestuntilparentactualpre-run sixblob/sharedinput/driver/config/list/9baselineinspection and separateCLEAR. CommitonlyfocusedGREEN/mapbeforelateredits; exclude652drafts from650commit/frozeninputs. ModelKeys815/runtime652unchanged;652STATIC1713only/confirmeddefectmustfixbeforeacceptance. No full/newreviews/queue/global/FEDR7/288/landing. Next4601; singlequeue-next72430pendingnoduplicate.
|
||||||
|
|
||||||
|
2026-10-25T12:40:15.546966+00:00 | Sage4603-4604 | FINALclockactualpacket3f52ce9b1/c747a85a ALL10artifacts verified,current6candidateSHA/bytes/Gitblobs approvedvirtual. Finalfrozen7281d6416+1184sharedinputhash/Gitblobs allrechecked,15tests included/652helperexcluded,9baselinemappings/currentonly6pathsdelta. Prior9053objectnotavailable so no independentonly10diffclaim, allFINALpinsverified. Driver46c/configd31areadunchanged. Narrowboundedreal--test/devgate scan EMPTY. ActualrunCLEAR4603issued ONLY15/list0bd38b5d (189reference expectedallGREEN), firstunexpectedskip/cancel/timeout/unavailableSTOP, no edits/retries. Realbwraptimestamp/mode/once/temp/noproxy/outputandownership/FD/exit2/release/signalassertionsmustreach; limitsretained. Sourceuncommitted755+abd;ModelKeys815/runtime652unchanged;652STATIC1713only. CommitonlyapplicableGREEN/mapfrozenbeforelateredit. Mos4604stateackdelivered. Next4605.
|
||||||
|
|
||||||
|
2026-10-25T12:47:13.660608+00:00 | Sage4605-4609 | FOCUSED4603STOPafter2files:clock5/5GREEN,reader19/18pass1unexpectedFIFO nice16!=19. 24total23pass1fail0skip/cancel/timeout;driver/testchild19. Rawfirstf51bc7071120,reader8a5d1b9e4393 audited. FIFO childrc0/nonblocktimeoutfalse/stop1BEFOREnicepassed;FD/receiptAFTERniceNOTreached. Source6+frozen1184unchanged/currentverified, ownclock/readerroots0. Remaining13filesNOTRUN/no189GREEN/noproductcommit/retry. ToldMagica4605preserveexactevidence, Mos4606boundary. ParentUNAPPLIEDstaticfixtureproposal4607 SHA58d08778 changesONLYprobe importsetPriority andsetPriority(0,19)beforewatcher; finalgetPrioritymeasurement/strict19assert unchanged. Oldhelperd711c0b8->a937f504917bytesOWNtempscratchchecked. Cause16UNPROVEN/nohostreniceclaim;laterdriftstillfails. AwaitMosexactfixture/rerunrulingandMagicaresultmanifest. Magica4608coordinationdeliveredNOactualedit. #652STATIC1713outsidefrozen scope/confirmeddefectunresolved. Next4610.
|
||||||
|
|
||||||
|
2026-10-25T12:51:40.585221+00:00 | Mos1715 /Sage4610-4611 | Exactfixture58d08778 acceptedCONDITIONALold4603fullaudit. Parentnowverified66c734f2 ALL10artifacts+2rawf51bc707/8a5d1b9e, all1184+sixpostSHA/bytes/Gitblobs/nineproductmappings==pre;24/23pass1nestednice16failure,0skip/cancel/timeout,ownroots0/hooks0100. Savedparentmanifest/full-audit. Relayed4610APPLICATIONONLY afterworkerreceiptpreserve: helperd711->a937f504917bytes onlysetPriority(0,19)beforewatcher,FINALmeasurement/strict19assertuntouched. No actualexecution yet; NEWV2actualfreeze/currentbaseHEAD/15list/driverconfig/newhelperpinrequiredthenparentreinspect+separateCLEAR SAME15FROMSTART, no readercomposite/oldRED rerun. Keepoldrecordsimmutable,source6clockbytes+ModelKeys815/runtimec5unchanged,sevenpathsremainuncommitteduntilfull15GREEN/map. #652STATIC1713outsidefrozenonly. Cause16UNPROVEN/laterdriftstillfails/nohostpolicyinvestigation. Mos4611conditionauditACKdelivered. Next4612. Queue-next27074singlependingnoduplicate.
|
||||||
|
|
||||||
|
2026-10-25T12:57:37.417489+00:00 | Sage4612-4614 | V2actual6a9c79de3/c15260d0 ALL10artifacts+frozende50de49(1184+six)CURRENT SHA/bytes/Gitblobs verified. Old/newinventoryDIRECTcomparison ONLYhelperd711->a937semanticrow+oldgate->v2metadata row;allsixvirtual/controlrowsunchanged. Driveronlycomment/evidencenames/configlimitsunchanged;old66/10artifacts2rawpreserved,exact7uncommittedsource/doc/helperpaths,ninebaselinemappingsverified. Boundednarrowgate/testscanEMPTY,issuedACTUAL4612 SAME15wholeFROMSTART only(189reference),no composite/readeronly/oldRED/full. Commit/mapONLYfull15GREEN;652STATICoutsidefrozen/no product652change. Mos4613stateACKdelivered. Next4615.
|
||||||
|
|
||||||
|
2026-10-25T13:05:38.430394+00:00 | Sage4615-4618 | V2focused4612STOPafter3files31/30pass1exclusivecollisionFAIL,0skip/cancel/timeout/cleanup. Clock5/5;reader19/19nowreachedFIFOrealnice19/FD0/receipt;producer7/6pass1 atpreexistingcollisionexistsfalse. Fixeddiag+unlinkCalls0beforeexistpassed;closeCalls0afternotreached/NOdeletionattribution. Parent141e94b8 ALL10artifacts+3raw/post1184+sixcurrentSHA/bytes/Gitblobsverified,roots0,remaining12filesUNRUN,noproductcommit/retry. Rawproducer9d5b6662/2477. ParentEXACTUNAPPLIEDtest-onlyproposal a5484cf9 toMos4616: first-turn.test.mjs d184->d2aacf294639bytes, savedoriginalopenwx/create+writeNUMERICfd+closefinally collision preseed; addcollisionCreatedflag/assert,ALLexisting7/assertions/countersunchanged,NOproduction/timingdelta. OWNtempscratchapplychecked. StaticNode26.8.1matchinginstalledHEADER fs.js2795-2846/getOptionsutils311-330 supportsreentrantpathnamewrite missingencoding; NOactualruntimecalltrace/Nodeversionexecution claim. URLs inproposalJSON. ToldMagica4617holdnoapply/rerunawaitMosruling,preserveV2receipttip. #652STATIC1713outsidefrozen/unresolvedconfirmeddefect. Next4619. queue-next27074resolvedrow7ledger;current331scopecontinues/no pendingqueue/gate.
|
||||||
|
|
||||||
|
2026-10-25T13:08:57.501876+00:00 | Mos1716 /Sage4619 | ExactUNAPPLIEDcollisionfixturea5484cf9ACCEPTED afterV2postpreserve/audit alreadycomplete141e94b8. Relayed4619APPLICATIONONLYtestfirst-turn d184->d2aacf294639bytes, savedoriginalexclusiveopen/numericFDwrite/closefinally+setupflag/assert, ALL7cases/existingassertions/counters/fixeddiagretained. Preserveold4612/4603records,staticNodeinferenceNOTexecutedtrace/version/deletionproof. NeedNEWactualV3fullfreeze DIRECTV2 ONLYnewsemanticrowfirstturntest;FIFOhelpera937+sixvirtualsource/docs+ninebaselinesunchanged,15wholeFROMSTART afterparentreinspect/separateCLEAR. No currenttestclear/gate/productcommit;8candidatepathsUNCOMMITTED. #652STATIC1713outsidefrozen/confirmeddefectstillmustfixbeforefinalP2acceptance. Next4620. Singlequeue-next6948pendingnoduplicate.
|
||||||
|
|
||||||
|
2026-10-25T13:13:36.331743+00:00 | Sage4620-4622 | V3actual2b4c099b0/f2400b62 ALL11artifacts+7ce729b2ALL1184shared/sixcandidateSHAbytesGitblobsverified. DIRECTV2ONLYfirstturntestd184->d2aacf29semanticrow+V2gate->V3metadata, FIFOa937/sixvirtualproductdocs/ninebaselinesunchanged;driveronlycomment+3evidencenames/configlimitsidentical. Exact8uncommittedpaths/botholdunexpectedrecordsintact/narrowgate-testscanEMPTY. IssuedACTUAL4620 ONE SAME15FROMSTART only189reference,firstunexpectedSTOP/no edits/retries/composite/oldRED/full. AllcollisionCreated/existence/unlink/close/producerFD/actualbwrapLinuxmarker/controlledexitassertionsmustreach;commit/mapONLYcompleteapplicableGREEN beforelateredits/exclude652drafts. ModelKeys815/runtimec5unchanged/652STATIC1713confirmedblocker. Mos4621stateACKdelivered. Next4623. queue-next6948resolvedrow7ledger;active331scope/no pendingqueue.
|
||||||
|
|
||||||
|
2026-10-25T13:21:40.454724+00:00 | Sage4623-4625 CLOCK650SCOPEDGREEN | Actual4620 V3whole15FROMSTART189/189/0fail/skip/cancel/timeout. Parentf92b3f16 ALL10artifacts+15rawSHA/bytes/TAPcountsverified15driver/testchild19/finalcomplete. All1190frozenrows(1184shared+6candidate)CURRENT+GitcommittedSHA256/bytes/blob/tree/multiset mapd86735387f to PRODUCTee375c1fba562a0def63743e6515fd0a33f42387 independentlyverified; commitAFTERrun/exact8acceptedpackage-planpaths/no652draft. Receipttip4d4fad7e3sourceidentical. RealbwrapLinuxmarker timestamp/mode/once/temp/noproxyoutput, collisioncreated/existence/unlink0/close0, FIFOreal19/FD0/receipt, actualUNCONFINEDlanding/message/retryexit2/release/ownTERM/nolaterturnallreachedGREEN. Limitswrongowner/unreadable600/confinedfault/forcedTERMresistance/productioncallerE2E/realrotation/nestedpriorityretained. CleanupHONESTnewclockrootsclear/hooksdone, oldprivatecontrolfixture dirs12launcher+2sessionlaunch+15modelproxyretained/inventoried;NOextra cleanup/processlockcensusclaim. Parentclock650-v3-green-independent-check.json. Mos4623resultdelivered;Magica4624prioritizealready-authorized1713STATIC652packet currentbaseee375/4d4. #652CONFIRMEDblocker stillUNRESOLVED/runtimec5andModelKeys815UNCHANGED;original4590diagnostic6dcontextpreserved. NOnew652product/test/Nodecheck/graph/full/freshreview/queue/global/FEDR7/288/landingCLEAR. Task650remainsOPEN despitefocusedGREEN. Noactivegate/queue. Next4626.
|
||||||
|
|
||||||
|
2026-10-25T13:42:54.530646+00:00 | Sage4626-4630 #652STATICreview | Initial039/d1bb10artifacts+9ee375products+25testpins/old23tail/a957old13/47behelperverified;tempscratchfb runtimec34497a154200/blob956ffe7e. FoundnewcounterambiguityBEFOREexecution: refresh->readSessions->seat/session401startTimeOf(runnerPID) incrementsanyprocread. Directed4626ONLYNEW2casesRegistry[]afterinitialview+lose BEFOREfault, preserveALL7assertions/old13/helper/fb. StaticfindingNOTobservedtestresult; oldR1UNEXECUTEDpreserved. R2packet50cb32959/44ac69a5ALL14artifacts+9products+25pins/actualfrozenbc3397edALL1190CURRENTsha/bytes/Gitblobsverified. Newtestc1b24468, DIRECTdiffONLYwriteSessions[]setup;driver/configreadwhole/privatecfg/nice/original1s+5s budgets. ExpectedONEnew7/5controlsPASS2exactstrictrecheckRED NOTobserved. SourcefbUNCHANGEDUNAPPLIED/runtimec5+ModelKeys815+clockee375unchanged. SentMos4628 exactcontract+ONEnew7REDrequest beforeANYexecution/application;focusedfuture25=new7+old13+EXACTold23. Needexplicitnullrecordbranch/coldbootlimitruling: priorvalidatedMapcanstrictdeadcheckifrecordnull,controllerSKIPsno-recordunchanged;initialcoldunassociatedholds/noallgenerationclaim. Validatedacqassociated&&atleastoneLIVE AFTERfullsame-instance success;fullydeadusesM1bits. Magica4629holdactualbytes/noextraactions. No activegate/newqueue;next4631.
|
||||||
|
|
||||||
|
2026-10-25T13:53:05.506689+00:00 | Mos1717 /Sage4631-4633 | EXACTfb7203contractACCEPTEDconditional NOapplication. ExplicitnullmodelRecord=associationloss forEXACTpriorvalidatedidentity->sameSTRICTbothterminalproofallowed,NONEWprovenance;controller no-recordSKIPunchanged/null-specificcoverageUNVERIFIED. Coldunassociatedbootfailclosed/warmrepairONLY/noallgenerationclaim. ParentFINALcurrent50cb/44ac14artifacts+9unchangedee375products+25pins/bc3397ed1190SHAbytesGitblobsverified;runtimec5/ModelKeys815/fbUNAPPLIED;narrowtestdevgatescanEMPTY. IssuedACTUAL4631ONLYwholeNEWmodel-key-provenance7 pre-fixRED expected5safetyPASS2namedread/ticksREDatstrict-recheckassertion,NOexpectation-evidenceconfusion. Samewhole/privatecfg/19priority/original1s5s/owncleanup,firstunexpectedSTOP/noretryedits/extraold13. Mos4632stateACKdelivered. ReturnverifiedRED+separatelyinspectableactualSTATICfocused25driver/list/config/content+virtualruntimec344candidate BEFOREimplementation/focusedauthority. Clock189/mapd867stable; nofull/graph/mutants/review/queue/global/FEDR7/288/landing. Next4634. Singlequeue-next3939pendingnoduplicate.
|
||||||
|
|
||||||
|
2026-10-25T14:17:38.642944+00:00 | Mos1718 /Sage4636-4638 | Prerequisitec1af7/5safetyPASS2exactRED/10artifactsrawf495/1190postpinsverified.033focusedvirtual9artifacts+9products+25pins/1210rowsverified/currentc5separatevirtualc344. Relayed4636APPLICATIONONLYfb runtime1path;actualc34454200/blob956. NEWactualc6c7a5aa0/38720db6 ALL10artifacts+89e32674ALL1212CURRENTpins verified. DIRECTvirtual1210 ONLYruntimec5->c344+2actualmetadata rows,all25tests/helperold13/ninebaselinesunchanged;scratchbytecompare fb=actual. Soleuncommittedproductruntime,configcontrolsidentical/driveronlymetadatanames,033+c1af/4590/clockmappreserved. BoundednarrowtestdevgatescanEMPTY;issuedACTUAL4637ONEwhole25FROMSTARTnew7->old13->exact23/296REFERENCEonly,firstunexpectedSTOP/no edits/retries. Mos4638stateACKdelivered. Commit/mapONLYcompleteGREEN beforelateredits;AFTERGREEN+map ONLYreadonlyfreshgraph/list/fullpacketprep,no full/mutants/review/queue/global/FEDR7/288/landing. NullcoverageUNVERIFIED/coldunassocfailclosed/warmonly/noallgeneration/realrotation. Laststatus22filesfinished/host23running, noaggregateclaimyet. Queue-next3939resolvedrow7ledger/no pendingqueue. Next4639.
|
||||||
|
|
||||||
|
- 2026-10-25T14:54:30.601485+00:00 | Sage row331 final builder BEFORE | Verified c210/b445 current16 artifacts,456 committed candidate paths,51 behavior pins,671 selected/graph files and1212 focused pins; lane clear. Mos1719 authorized one builder, actual sage-4643 running on8e54. Standing FED R7 skip remains unverified; no broader acceptance/landing.
|
||||||
|
|
||||||
|
- 2026-10-25T15:06:56.091482+00:00 | Sage row331 final builder AFTER/STOP | Probe+163 whole files:1639 tests,1637 pass,1 fail,1 authorized FED R7 skip; no aggregate acceptance.164 raw logs independently verified, remaining121 files/config/mutants/controls unrun. Source8e54 unchanged,ModelKeys815/runtimec344 restored. Separate one-step driver16/child19 recorded without cause attribution. Exact fixture forwarding proposal3aa973dc remains unapplied pending ruling; no assertion/deadline change.
|
||||||
|
|
||||||
|
- 2026-10-25T15:23:00.032777+00:00 | Sage row331 fixture AFTER | Exact dispatch forwarding correction passed whole session-clear5/5 with measured19/19, no skip/cancel/timeout. Result42932d7a/raw0b7d1497 and1216 frozen rows independently verified against2da21e13;map1e11f6d4 committed87ee30b1d before later prep. Original stopped builder637 retained; no composite acceptance. Read-only refreshed full packet and unapplied priority proposal await separate ruling.
|
||||||
|
|
||||||
|
- 2026-10-25T15:34:29.723336+00:00 | Sage row331 R2 full BEFORE | Verified actual6dc9cf3a/b1013592 all1622 inputs,13 artifacts,nine products,52 behavior and671 graph inputs againstcode2da; exact3e4/5982 priority-guard driver. Cleared one probe/284/config/four-original-mutant-control block from START underMos1721/sage-4657. Old637 stop and priority16 preserved; only namedFEDR7skip permitted unverified. No source/review/landing changes.
|
||||||
|
|
||||||
|
- 2026-10-25T15:50:10.065429+00:00 | Sage row331 R2 full AFTER/STOP | Probe+174 files:1756 tests,1754 pass,1 old thread-revoke failure,1 permitted unverifiedFEDR7skip.175 raw logs audited,all19/19,no cancel/timeout/signal.110 files/config/mutants/controls unrun. All1622 frozen inputs and52 behavior/671 graph code pins unchanged;runtimec344/ModelKeys815. Test host mirror lacksrecoverLaunch before runtime; exact fixture proposal being prepared without execution. No composite acceptance.
|
||||||
|
|
||||||
|
- 2026-10-25T16:05:33.469862+00:00 | Sage row331 thread fixture AFTER | Exact runtime dispatch forwarder passed thread-revoke3/3,measured19/19,nonskip/no cancel/timeout. Result86975ce3/rawc9a5d06a and1625 frozen/current/committed rows verified;sole fixture commitfffbe05af,map1d867353 committede906cfc8a before later prep. End/claimrelease/no-newlaunch checks reached. Prior stopped full runs retained; no composite acceptance. Read-only full packet refresh pending separate ruling.
|
||||||
|
|
||||||
|
- 2026-10-25T16:24:45.965804+00:00 | Sage row331 R3 full BEFORE | Verified f99b10ec/be9bc6e0 all1628 current inputs,13 artifacts,nine products,53 behavior/671 graph againstcodefffbe;exact2965 driver. OldR2driver and all stopped/scoped evidence preserved. Cleared one probe/284/config/four-original-mutant-control block FROMSTART underMos1723/sage-4671. Only namedFEDR7skip allowed unverified;no source/review/landing authority.
|
||||||
|
|
||||||
|
- 2026-10-25T16:54:21.093174+00:00 | Sage row331 R3 full AFTER/scoped VERIFIED | Result63d440bf/evidencee5b4a8d1, all14 committed artifacts+294 raw SHA/bytes/TAP/order checked. Whole2842552tests2551pass0fail1 authorizedFEDR7skip(unverified),separateprobe30/config55/4wholecontrols120 pass.4ORIGINALnamed mutants killed1/1/1/3 assertionfailures,all6ERR_ASSERTION,815 restored each/end. ALL294 real19/19,0cancel/timeout/newskip;all1628frozen/53behavior/671graph/nineproducts unchanged.13 private-control scratch retention inventories preserved,no census. FullP2/reviews/global/FEDscript/row288/landing remain open; next review brief is DRAFT only pending ruling.
|
||||||
|
|
||||||
|
- 2026-10-25T17:21:57.367080+00:00 | Sage row331 formal review BEFORE | Correctedbrief17972714 preservesoriginal0418. Existing53-sourcebb/codefff/evidencee5b/result63d frozen. Formalround3request31706 posted ownJarvis and independently read back with correctissue1829/author/markers/entiremanifest. IndependentBoydCodex+ONEfreshClaudeQ246(high) started afterprovenance verification; no tests/sourceedits/queueverdict/landing authority.
|
||||||
|
|
||||||
|
- 2026-10-25T17:52:23.336296+00:00 | Sage row331 source review AFTER/CHANGES | Both independent reviews identifymissinglauncherbinding blocker. Boydqualifiedlows/consentpreserved,ownJarvisattributedrelay31707 readbackverified;actualBoydcanonicalCHANGESrecord4135 independentlychecked. Existingbuildergreen remains scoped,fullP2unaccepted. ConditionalMos1725 nowauthorizesSTATIC653-656packetpreparation only,653/654first;no sourceapply/test/full/newreview/landing authority.
|
||||||
|
|
||||||
|
- 2026-10-25T18:24:29.738793+00:00 | Sage row331 #653 test-first AFTER / #654 coverage BEFORE | Mos1726 one-file sage-4701 reproduced exactly two managed proxy launch failures after successful preflight; three nonproxy/refusal/no-launch controls passed. Result76feb41a, rawc3bc72a3/4035 and all1633 frozen/current/committed inputs independently checked; no source application, post-target proxy binding/watcher checks unreached. Mos1727 actual packet39be7914/freeze445dc825 independently verified with lane returned/clear; issued sage-4703 for one current pending-organization coverage file expecting four passes, outcome pending. Productfff/old53bb and prior reviews/evidence retained; no acceptance/landing claim.
|
||||||
|
|
||||||
|
- 2026-10-25T18:31:16.393237+00:00 | Sage row331 #654 coverage AFTER | One whole current-source file passed4/4, zero skip/cancel/timeout; resultb60936e7/rawb5e83990/1293 and all1633 frozen/current/committed rows independently verified. Mapcc651951 to64e0a982 publishedb442 after GREEN and before later edits; sourcefff/nine products/53 manifest unchanged. Covers exercised pending organization-busy branch only, not generation ownership. Separate #653 import-only/focused15 virtual packet20af76b3 inspected and sent for scoped ruling, no product application/run or final acceptance.
|
||||||
|
|
||||||
|
- 2026-10-25T18:34:30.320932+00:00 | Sage row331 #653 repair BEFORE | Mos1728 authorizes exact launcher named fs import binding only and matching focused15 driver preparation. Parent rechecked unchanged old53/nine products atb442 and sent4708 exact application/preparation instruction. New applied freeze and independent current-input/lane inspection are required before a distinct test CLEAR; no test run or fixed-behavior claim yet. #655/#656 remain unresolved, historical review/RED/GREEN/maps preserved.
|
||||||
|
|
||||||
|
- 2026-10-25T18:39:00.750135+00:00 | Sage row331 #653 focused BEFORE | Applied launcher equals exact approved import-only373d; current driver equalscfd. Before any execution parent caught an omitted consumed-list path in input inventory; metadata-only superseding packet8e6dd390/freeze97e24ceb preserves prior1636 and adds that existing list row. All1637 current inputs/10 artifacts/15 tests/nine products and historical654 map independently verified, no competing Node test/gate; issued actual focused15 CLEAR sage-4712 underMos1728. Outcome pending, no fixed/acceptance claim or additional source authority.
|
||||||
|
|
||||||
|
- 2026-10-25T18:57:50.207677+00:00 | Sage row331 #653 focused AFTER / #655-656 static contracts | Verified complete15-file173/173 nonskip, all15 raw logs and1637 tested/current/committed rows mapped93ae todf75 afterGREEN, map firstpublished9ced before38b static preparation. Actual managed-launch5 reaches pre-spawn enable/trustedbinding/idle and first-turn clock/real stall stop/output controls. Product change only missing import. #655 original serialization-only proposal030 rejected byMos1729 for duplicate credential effects; exact shared-validation revision and isolated tests authorized STATIC only. #656 partial-state/durable-intent disposition remains open; no recovery implementation/test or full-P2 acceptance/landing granted.
|
||||||
|
|
||||||
|
- 2026-10-25T19:01:13.027004+00:00 | Sage row331 #656 design BEFORE | Mos1730 selects static narrow matching-temp/durable-revocation-intent proposal and isolated test preparation; broader only-temp/differing-generation states get separate nonlaunchable-intent design only. Relayed4720 strict all-key remote/run/file proof, intent-before-temp-removal/retry and truthful atomicity requirements; no product application or execution. #655 shared-validation revision remains independent static work. Testeddf75 source preserved, full acceptance/closure pending.
|
||||||
|
|
||||||
|
- 2026-10-25T19:04:29.712397+00:00 | Sage row331 #656 static boundary | Verified4547-byte atomicity note1f2b7864/sourcepins. Existing descriptor/stat checks plus pathname unlink provide no inode-conditional final syscall against arbitrary external sameUID replacement. Returned concrete concurrency-contract choice toMos4722 before recovery code/test authorship; no workaround/experiment applied. #655 static revision and broader656 design remain independent, testeddf75 source unchanged.
|
||||||
|
|
||||||
|
- 2026-10-25T19:08:56.725413+00:00 | Sage row331 #656 qualified static design RESUME | Mos1731 accepts cooperating-writer/private-store concurrency for proposal/test authorship, explicitly excludes arbitrary external sameUID replacement after final verification from guarantee. Relayed4724 strict synchronous revalidation/tmp-first intent ordering and complete cooperating-callsite trace requirement; any current ordering bypass returns before proposal acceptance. No atomic compare-unlink claim, product application or runtime test grant. #655 and broader656 design remain separate, source testeddf75 unchanged.
|
||||||
|
|
||||||
|
- 2026-10-25T19:25:50.472210+00:00 | Sage row331 #655 revised static review RETURN | Verified c7/ce7 nine artifacts, current product/source/test pins,1637 prior mapped inputs, and scratch-only three-file ef299 proposal. Before execution identified expected-map first-failure mismatch in cases14-16, cleanup launch-log scan omission, and need to carry original captured revision into locked publication rather than fresh revision substitution. Returned4726/4727 for static corrections/contract ruling; no source applied, Node/test/proxy run or acceptance granted. #656 static work remains separate.
|
||||||
|
|
||||||
|
2026-10-25T20:03:48.870029+00:00 — Sage row331/#655 correction: previous static A/C objection missed OptionC injected-writer R0 override; withdrew after full source trace/Mos1733. No publication API expansion. Preserved4733 unexpected whole-file fixture errors and all evidence; exact NEWhelper variable correction106 only, audited superseding01ac/1647 inputs and cleared ONE whole rerun sage-4742 underMos1736. No product application. #656 narrow static model-final-order work separate; #657 broader recovery-intent DESIGNONLY ownerSage perMos1737, no executable/path creation authority. FormalR3CHANGES/tasks647-657 remain open.
|
||||||
|
|
||||||
|
2026-10-25T20:27:02.650878+00:00 — Sage row331 #655 bounded verification: independently audited intended pre-fix e219 (exact9targetsRED+9controlsPASS), exactef299 applied underMos1738, focused sage-4750 COMPLETE22files300/300PASS0skip/cancel/timeout, all22real19/19. Exact3products committedafterGREEN27f68; all1652testedrows mapped88a92/firstpublication67394 beforelateredits. Separate unexpected068/priorformalnegative retained, not compositefull. #657 DESIGNONLY proposals3ce07/108780 with manifests c13/a6b returnedMos; prospective before-PUT ownership design, no privatepaths/code/tests/experiments. #656narrowstatic remains independent/open, no full/newreviews/queue/global/FED288/landing/closure.
|
||||||
|
|
||||||
|
2026-10-25T22:02:57.713692+00:00 — Sage row331 STATIC656/657/658 and first656 measurement: audited complete narrow14678/fd503 virtuals/all1657 inputs, acceptedtestfirstMos1749; exactactual1665/driverae284 inspected and sole4778runtimewhole cleared. Verifiedca07/raw5bca37584:39=32exacttargetRED+7controlsPASS,0skip/cancel/timeout/signal,real19/19,allpostpinsunchanged/source27f68/oldfixtureUNAPPLIED. Nextcompletionfile REQUESTEDonly4781; no automaticrun/application. #657A/source+newtests ONLY ownedunapplieddiffs/unparsed/unexecuted, selectedSELF/eventgrace and helper-onlyproposal static; #658generationconfig-last design returned, Mos1750selectsexplicitprovision-new coexistence STATICnextscope, oldbootstrap/T-I1unchanged. All acceptance/closure gates remain open.
|
||||||
|
|
||||||
|
2026-10-25T22:34:26.180461+00:00 — Sage row331 #656 three separate intended-RED phases verified: ca07 runtime39=32R7G,44c2 completion21=19R2G,cb13 remove21=16R5G; all exact first targets/raw/postpins/currentGit, strictreal19,0skip/cancel/timeout/signal. Scopedcontrols only/posttargets unreached, no compositeGREEN. Independently audited STATICfocused33 packet4799129b/1688 current vs3virtual changes; Mos1757 permits ONLY exactfd503+7a1dapplication/204cdrivercreation and NEWactualfreeze preparation, relay4798; actualrunCLEAR pendingindependentinspection. #657 selectedprivateclockproposal f579 under1756 +fixturecompatibilitystatic scope; allowned657diffs unparsed/unapplied/unexecuted, needintegrationrefresh after656. #658 explicitprovision-new coexistence staticwork remainsopen, oldbootstrap/T-I1unchanged. No full/review/queue/global/FED288/landing/closure.
|
||||||
|
|
||||||
|
2026-10-25T23:33:24.741369+00:00 — Sage row331 #656 AFTER / #657/#658 static continuation: independently audited actual1694/driver204c packet then sole sage4799 focused33 FROMSTART. All511PASS/33raw203652B/zero skipcancel timeout signal/33real19pairs; new81formerposttargets reached in frozen source. Exact3paths committed AFTERGREEN38ba5762, all1694+16pins mapped69ce57a5 firstpublication30dcef before later receipt4a02. Mos1759 independently accepted APPLICABLEfocused only;656OPEN. Audited read-only interim ed8b/581378:65behavior/788changedblobs/677graphpins, recorded18roots0parsefailures/294selection recomputed from recordededges; allold284+6new+4businesscollateral, grant-scope/lifecycle-settings UNRUN current. NO fullgate/run/re-pin. #657A refreshed to38ba/031383e6 ownedUNAPPLIEDdiff only, incompleteB/legacyhold/case15 retained. Static positive revocation seed/caller packet4999 returned4807 with actualtrustedgeneration/ownedruntimeoriginalsweep queue/failedGETintent design, not executed; Mos1776 selected only extraFIFOawait1e998e74, inventory superseded preservingoriginal4999. Positivehelper/A-B/case7 exactguards stillunaccepted; #658 explicitprovision-new sourceproposal not yet authored. All647–658OPEN/no newfull/config/mutants/review/queue/global/FED288/landing/closure.
|
||||||
|
|
||||||
|
2026-10-25T23:41:11.932432+00:00 — Sage row331 #657 STATIC next packet: sent4808 runtime-clockcontrols manifest38c1a325/4808, NEWisolated helper/testdiff6a09c2b2/14524 and9UNOBSERVEDcases; native/default,6invalidvalues-beforeStore, actualruntimeisolation andsamewarm ORIGINALdue/strictidentity/terminal path. OnlyownedDIFFS/data, no actualsource/testinstallation, parser/Node/FS/proxy/test. All1694 mapped current SHAbytesblobs rechecked unchanged against38ba/map69ce. Seedpacket superseding87633310 marksMos1776 FIFOcallerSELECTED, original4999 preserved. Positivehelper/A-B/case7exactguards remainunaccepted; fullBGC/allcooperatingcallers/warmoldfixture and658sourceproposal remain work, no gate/full/review/queue/global/landing/closure. Nextstableoperation4809.
|
||||||
|
|
||||||
|
2026-10-25T23:44:53.880497+00:00 — Sage4809 #657 unaccepted-draft correction: source-read found A031383 second descriptor fstat omittedbigint:true while all other identity fields usedBigInt, so stable validfile wouldrefuse strict equality. No runtime reproduction. PreservedALLoldartifacts and4808manifest references; separate r4 combinedf1b5a13a/35866 newmoduled2d783f4/18928 manifestb2baf075/1573 changesONLYsecondfstatoption. ReturnedMos4809; current38ba/1694inputs untouched/noactualsource/helper/testinstallation/parser/Node/FS/proxy experiment. BGC/warmfixtures/658 remainstaticunfinished; no gate/acceptance/closure. Nextoperation4810.
|
||||||
|
|
||||||
|
2026-10-26T04:17:47.724968+00:00 — Sage STATIC continuation AFTER owner heartbeat1822: scope recovered without queue/Node invocation because explicit current no-queue/no-runtime ruling supersedes routine cadence. Preserved38ba code and all1694 mapped rows+16 packet pins, rehashed current SHAbytes/Gitblobs. Sent4810–4819 owned-only contract/clock/canonical/publisher/reader/GC/outcome boundaries; Mos1824/1826/1830/1833/1837/1841/1842/1843/1844 selected bounded STATIC directions only. Reader-r3 0edf corrects unresolved helper references, childc365 beforeStore/reconcile fences, host3ba beforeleftover/Registry/root writes, common240d internalreadonlyguard,7 new controls ad69 unobserved; exactRAM dependency reconstruction, packet396f. GCf196 finalnativeintentcheck only, actualreentrantproof invalidation stillunfinished. Actual captured-R0 failed-unpublished-hire enum selected1842, extra publication-outcome boundary17c sources rename/fsync/log/lockrelease/settingsread;1844 writer-ownedtoken nativephases now proposed d767+12 unobserved tests6df2 and separately inspectable prosehold c0d7; actualB consumer/restartpositiveproof stillunimplemented/unselected. Single trackerposts6571293/1294/1296 and6581292/1295 all definitive exactbody/author13/readbackOPEN; an initial read-only comments response-shape mismatch preceded any write and was corrected via items pagination, no duplicatepost. No source/helper/test install, parser/Node/process/test/FS/proxy experiment, full/config/mutants/newreview/queue/global/FED288/landing/repin/taskclosure. Oldmaps/partials immutable; nextoperation4821 after substantive4820 handoff.
|
||||||
|
|
||||||
|
2026-10-26T04:47:04.289784+00:00 — Sage4821–4822 STATIC continuation: Mos1845 inspected utilities only; authoritative phase successor77c866 rejects created AFTERpublish unless actualprivateflow proves invocation never occurred.14 new unobserved writer requirements77a2 preserveold12 and demonstrate ignored/misrouted option ambiguity. Scopedpositivepublication question6dd/5bd selected1846 ONLYforfutureownedUNAPPLIED13-field witness, noactualconstructor/reader/GC installation. Tracked6571297/1298 exactbody/author13/OPEN readbacks. Additional required origin/decision coupling returned4325025a/7920 manifeste97a8c60/3251 BEFOREbytes: immutable PER-OWNER bounded64 registration because actualmodel-keys.test47/49/121/161/167 repeatsModelKeys SAMECredentials; no blanketone-managerrestriction/oldtestedit. Proposedopaque actualrequest→nativegenerationticket BEFOREPUT +monotonicpublicationhold onretainedhostcontext, notJSON/ephemeralhelperproof. Independent658 visiblepartialpointer guardf788/3947 centralizedselectedreadonlyrootclassification BEFORENEWexistingpointervalidate shortcut;2newcontrols8afa/1706 UNOBSERVED, controlledpendingnotactualcrashproof, packet41fe. Freshall1694+16SHAbytesGitblobTREE checkedcode38ba,source/indexcandidateunchanged. No source/helper installation/parser/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure. Nextoperation4823 after4822substantivehandoff; actualBcallbacks/factory/joint656epochs/intentlastGC/warm/658fullinterruption/hosttransport remainauthoringwork.
|
||||||
|
|
||||||
|
2026-10-26T07:26:33.036846+00:00 — Sage4823–4824 STATIC continuation BEFORE/AFTER: candidate38ba and1694+16 pins remain exactGit/current, source tracked diff empty; no candidate edits/runs.1847 selected per-owner C-native brand/request-to-ticket-beforePUT/monotonic retained-host latch now has actual owned source bodies, actual adapter/ModelKeys intended-writer phase consumer and13-field positive publication writer/reader. Nine exact joint-r2 diffs text-reconstructed but explicitly INCOMPLETE/not installation-ready: actual B factory/native confirmation/typed656 proof-name-epoch join/full GC remain unwired; old511/REDs unaffected. Independent1848 native identity supplement fb22/e28be adds original pointer/root/pending dev/ino/nlink guards, and six new nativeEIO controls b359/8157 remain unobserved, not crash/concurrency/transport proof; later faults/types/oldcopy matrix open.1849 cold recovered-final-absence model-only proof scope recorded6571302, not native656 finished/absence authority and not implemented yet. Warm intent-only progress f425 plus context one-use/reconcile-null and closed-C guards897f/cf24 authored as corrected unaccepted overrides; no observed fix. Exact next interruption window after metadata cleanup before orgDELETE requires new external negative-handoff DESIGN decision b41e3113 before any path/schema/code. Tracker6571299/1302,6581300/1303 definitive entirebody author13 OPEN. No source/helper/test installation, moduleparse/Node/FS/process/proxy/test experiment, new gate/full/config/mutants/review/queue/global/FED288/landing/repin/closure. All647–658 remain OPEN; scoped source/evidence historical maps preserved.
|
||||||
|
|
||||||
|
2026-10-26T09:36:48.905968+00:00 — Sage4825–4826 STATIC continuation BEFORE/AFTER: code38ba and1694+16 exactcurrent/Git rehashed09:31, old511 scoped/history unchanged.1854 negative-only design d073/14916 fields+state/callers returnedb583, no marker implementation. Found current4actual656retry/reboot positives vsoriginal-request-only/freshHOLD conflict and returned3e500 before weakening/assertion changes;1855 selected one DESIGN comparison. NewR2comparison3c837/18999 proposes SMALL metadata-only registration+terminal chain, actual publisher/writer sealing and source-present native authorization; supersededunpublished1a2c had over-assumed originalphysicalsource mustsurviveuntilpub, correctedpreservingprovenance. No largearchive recommended/newpath/schema/outcometag/clear branch chosen. Independent actual native controller confirmation now source-authored from actual remove/confirmGET/401/fullview and moduleprivate registry; bothModelKeys.prepare callers pass token; Credentials CONSUMES snapshot/record/epoch beforeTMP andfirstfinal, readonlyactualfinished check neverabsenceauthority, runtime stop-map invalidation, existinglifecycleCrev guard mapping. Exact3diffsa84a/da9d/0d46 textreconstructed; higherBfactory/classifier/typednames/GC stillUNWIRED; nativeFIFO/bookkeeping mustnotbeclaimedreachedafterearlierprovenancehold.1854/55 tracked6571307/1308 definitiveactualauthor13/readbackOPEN. No source/helper/test installation, parser/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/repin/closure. Nextstableoperation4827; currentformats/sealing/succession stillawaitseparateselectionbeforebytes; independentB/658remainopen.
|
||||||
|
|
||||||
|
2026-10-26T10:09:33.266521+00:00 — Sage4827 STATIC Mos1856 before/after: preserved current38ba/1694+16/511 and ALL original artifacts. One exact nested schema table now proposes final/tmp/intent native fingerprints and complete independently validated origin/publication digests, explicit decimal native stat encoding and organization/controller observation domains. No durable constructor/reader/path authored pending selection. Bound arithmetic largest variants2383/1118 bytes below8192, not protocol object creation. Writer seal and actual one-use raw publisher source proposals68da375f/4d480f5a direct38ba text-reconstructed ONLY, virtual7f96/9acc; sealed token refuses beforelock, same actual wrapper pending request/close ordering, created-after-invoke UNKNOWN, thenable hold, capturedR0/case15/hook semantics retained. These are publication-only utilities: native all-operation ledger/terminal producer/factory/typed656/GC/result-lease consumer NOT complete. Concrete actual valid-to-revoking C.issue unlink(model.tmp) occurs before future original revoking snapshot/intent ID; no future identity/exemption invented. Contract returns chain/postcleanup distinct result-lease/retirement directions,20 UNOBSERVED reached-boundary requirements. Packet5fa13344/9572 sentMos4827; OPEN657 comment1309 single201 exactbody/author13/readback. Source candidate remains unchanged; no installation/parse/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure. Next4828; existing B/658 independent work remains authorized.
|
||||||
|
|
||||||
|
2026-10-26T10:32:05.431575+00:00 — Sage4828 Mos1857 STATIC before/after: current38ba/511 and1694+16 rehashed10:30 exactSHAbytesGitblobTREE; no product/helper/test delta. Corrected literal schema4f50793d removes nonexistent valid field and records1857 selection, leaves exact original formats/history preserved. Newowned UNAPPLIED DATA-only source readera3299bba/16029 virtuale2d3/15682 plus10DATAunit dcb466cb/6083 only inside diffs. Canonical exact type/domains/count-before-allocation/bounded nofollow readonly whole-chain/native reread code, no mkdir/write/unlink or ready/terminal constructors; actual factory/workledger/constructor/retirement still UNWRITTEN. Undelivered067/99ff/22dsource drafts preserved; strict hash/UUID string guard correction source-only no measuredfault.20oldcontrols unchanged plus14native/8reader reached requirements UNOBSERVED; absent module import not intendedRED. Separate ordinaryVALID->REVOKING DESIGNcomparison40165044/14819 identifies TMPunlink then finalreplacement before current strict intent; staging-only insufficient. R1 terminal-only proposal3bb corrected BEFOREdelivery because controller-only has no composite root/validterminal. CandidateA asks originalVALID Bintent +small actual transition witness/newnullableCurrentSources member selection, NO newtransition field/path/code authored/selected. Native write/receipt crash and allotherholds honest, no permanentordinaryvalid limitation. Packetb71063fd/11952 sentMos4828; OPEN657comment1310 single201 author13 entirebody/readback. No JSparse/Node/FS/process/proxy/test/runtimeexperiment/application/gate/full/review/queue/global/FED288/landing/closure. Next4829; nativeBfactory/GC/worklifetime/658independent remain.
|
||||||
|
|
||||||
|
2026-10-26T10:59:39.269094+00:00 — Sage4829 STATIC1858 literalrefinement BEFORE/AFTER: schema31c29/13030 exact17witness fields, order4f65/30567, consumers3fb9/8102,26unobservednative controls825b/5691; current38ba/1694+16/511 preserved. Proposedintent/attemptv2 requiredsixmember makesoldfive/v1 incompatibilityexplicit, no nullalias/migration; Wv1 progress/historicaloldVALID/nativecurrentREVOKING distinct. Budget131072/128MiB completepathentriesinclalias bytes beforealloc, witness8192, staticarithmetic3601notserializerproof. ReferenceW->I yieldsW-beforeIonlynativefullproof/noconsumer thenIlast/pub-before-origin/joinedrootlast; no missingfinal/cold/native656prooffromfingerprints. No transitioncode authoredunder1858; OPEN6571311 single201/exactbody/author13/readback; sentMos4829packet80b8/10016. Mos1859 nowselectsschemaversion/caps/nativeproducer/order for ownedUNAPPLIED sourceonly. Continuing4830actualsource, no sourceinstall/parse/Node/FS/process/proxy/test/gate/full/review/queue/global/FED288/landing/closure.
|
||||||
|
|
||||||
|
2026-10-26T12:21:16.986782+00:00 — Sage4830-4831 STATIC1859 BEFORE/AFTER: exact17W/v2I+attempt/six/sharedcaps/nativeproducer/WbeforeIselected, products38ba/511/1694+16 unchangedSHAbytesGitblobTREE11:25and12:14. Source-only fourutilitypartsfde9/14077: budget9ccb/r4 resourcecounternoauthority, attempt2/W1decoderreaderb044 typedlimitsintent262144/origin131072/pubW8192; ten+eightDATA tests9908/6f4UNOBSERVED. Sharedbudgetpercompleteactualtypedphase note3e25 forbidshelperreset/unknownwork; actualnativeCbinding/allfamilyrouting unimplemented. Continuednative2sourceadd152/10133 C5bae/MKee609: actualprivatequeue scopes/contextbinding3sites denyqueued/oldB borrowingA, sameR0/owner/privatefailed-newhireseal, oneusenativeclockdecisionbodyrevalidatesafterclock. CSourcePrepMaphasNOregistrationproducer/privatecapturehasNOcallsite, no positiveplaceholder/nativeCwriter/W/terminalproof; fullfactory/ledger/GC stillunwritten. CombinedemitterE2BIGprocesscreationfailedbeforeanyfilewrite, splitperfiletextemissioncompleted; sourceiterationspreservedunexecuted. Oneconcretenewcallerboundary10f6/8010: current38ba adapteronlypendingR0; uninstalledoutcomedraftinjectsA intoallinstanceSettingswriters, sealedA couldrefuselegitimateunrelatedhumanwrites; lease-running/firstwriteheuristicunsafeunderreentrancy. Recommendopaque intendedcommitbinding sixTHINTERNALruntime arg/privateopts/nativeWbinding, target/actor/args identity, preserveunrelatedR0+writerhooks;NOadapterdeltauntilscope. Alreadynolistedfiretransactionnull/noWriter remainsseparateunresolvedno-writeauthority. OPEN6571312/1313 single201/exactbody/author13/readback; sentMos4830/4831substantive. No sourcehelperinstall/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4832; actualCfactory/progress/metadata-key401/GC/result/658independentremain.
|
||||||
|
|
||||||
|
2026-10-26T13:14:58.870767+00:00 — Sage4832 STATIC1860 before/after (registered after authoring): baseline38ba/511/map69ce unchanged, all1694+16 SHA/bytes/Gitblob/tree remeasured13:10:37Z and source diffempty. Newowned four direct38ba diff proposals77e8 manifest17854,22artifacts+6dependencies/14sourcepins: Wcc9f virtualfd45/29585; MKr28350 virtual1ed2/50383; runtime5752 virtualb500/57247; businessdffc virtual4df2/31648. Sixth INTERNAL opaque binding passes onlymanagedhire/fire/DELETE, actualmethodchecks before native ticket, native consumptiononce/correlationNOTauthority, unrelatedB originalpendingR0/noglobalAoutcome and lockfence. Rejectwrong/replay beforeAoutcome mutation, createdafterinvoke/ignored UNKNOWN, preserve originalerrors during independentclose/release, case15 remainsbeforepublisher. InitialR1 preserved; source-only R2 prevents accessor/proxy SET falling through to unprepared lifecycle path, no product/test/assertion/helper/deadline change.34controls1aff2 UNOBSERVED requirements only. Native Cprep producer/rewrite/W/workledger/factory/metadata401/joint656/progress/GC/result remain incomplete, cannotinstall utilitygraph. ActualdelistedpresentmodelFIREtransactionnull/noWriter separate question13fd/2297 returnedbefore no-write enum/result/clear/restart bytes; no permanentavailabilitywaiver. OPEN6571314 single201/ENTIREbodyexactauthor13/readback. Substantive T3 handoff4832 delivered Mos. No sourceinstall/applicationparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4833 independentnativeB/658 static remains authorized.
|
||||||
|
|
||||||
|
2026-10-26T13:23:26.975486+00:00 — Sage4833 STATIC1861 BEFORE: bounded DESIGNONLY for actual already-delisted/model-present FIRE branch; preserve38ba/1694+16/511 and all4832partial source. Trace original read/fireChecks/revoke/read, actual completeRevoke/C onefinalunlink and original runtime nonmodel/residual cleanup. Propose native branch+current local result association, oneuse closed-work consumer, distinguish writer CREATED/UNKNOWN/no terminal/rename fact; return any1854/56/59 clearing extension before bytes. No source/helper install/parse/Node/FS/process/proxy/test/gate/review/queue/landing authority.
|
||||||
|
|
||||||
|
2026-10-26T13:38:59.424908+00:00 — Sage4833 STATIC1861 AFTER: finalR2design f49c/18934 +actualidentity/worktable34e5/10353+caller3c98/6268+30unobservedrequirements1227/14749; manifestddd3/14867 pins9owned+8deps/16Gitcurrent38ba sources. Exact actual settings conditional404/revoke405/readreturn406 (R1line403commentnav corrected/preserved). Proposed nativefactory/branch enter-return/resultsidecar onlyactualmethod, actualCtypedlowerfinish/servicebookkeeping/residualprogress+closedbinding/lease/ALLcapablework/latestepoch/every401/freshWHOLEruns/storage/latches before intendedoneuseconsumer. Rawpublisher remainsSYNC; outerexistingasyncdrainoutsidewriterlock; management/local unknownnotterminalizedbyexception. Cresult factory/workledger/nativeW/metadata401/GC stillunwritten; no positiveplaceholder/localcompletionfromcallback/read/transactionnull. Proposed checked-snapshotR0 afteroriginaladaptercheck and finalR0afterread/reload/drain explicitlyNEWnonlockingpredicates, no ABA/globalimmutability; unrelatedB originalR0/noAtoken untouched. NativewriterCREATEDafterinvoke remainsUNKNOWN/no rename/nonattempt/dummywrite; cold1849/native656/result/no-record distinct. ONEscopequestion b09f/4384: separate SAMEHOST exactnoWriteFIRE eligibleexternalretirement replacesonlywriterresultconjunct1854/56/59, allothers/rootLAST retained. No suchrule/enum/clear/restartcode selected, no positiveDELETE/freshmissingfinal/latchreset/permanenthealthyholdwaiver. NativeC/source/W/ledger/B/GC/658independentcontinue. Full1694+16hashbytesblobTREE38ba13:36, prior4832all28artifact+14sourcesunchanged, scoped511/case15/fouroldretryrebootcontrols preserved. OPEN6571315 single201 ENTIREbody/author13/readback and MosT3substantivereturn4833 delivered. No source/helper installation/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4834.
|
||||||
|
|
||||||
|
2026-10-26T13:41:46.493164+00:00 — Sage4834 STATIC1862 BEFORE: prepare owned UNAPPLIED actual settings branch/factory/forwarding and adapter/predicate/closedbinding/local-result consumer source bodies; typed C native completion/closed-work/B/GC dependencies remain mandatory, not callback labels. Preserve38ba/1694+16/511/current old source/4832+4833 packets. No installation/parse/Node/process/FS/proxy/test/gate/review/queue/landing.
|
||||||
|
|
||||||
|
2026-10-26T14:12:46.483842+00:00 — Sage4834 STATIC1862 AFTER: selectednoWritebranch+samehostconsumer direction source-drafted5direct38ba diffs/virtual pins8485manifest21601,26owned+8deps/16sources. Wb0b6->31b1/31931; MKr2df0b->6d08/58361; runtime4dea->f7f9/57882; business647d->5310/35054; Cr2948b->dc0c/61666. Native actualfactory config/adapter attachbeforeoperations; onlyactualfireconditional nativeentry, originalrevoke/read return +exactnativeprivateforward; fifthINTERNALrevoke scope. Writer unusedbinding/firebranch separatefromcheckedcommit/outcome, originalR0/noAtoken forunrelatedB. Selectednew snapshotR0 afteroriginaladapter guard and finalR0 afterclosedwork/proofawaits areNONLOCKING; finalproxyconflictavoidsfalsekeptreceipt. NativeC capture actualconfirmation/snapshot/context BEFOREactualunlink/confirmed deletion; finished nativeflag ONLYafterownunlink/bookkeeping; private finished/currentcontext verifier; readonly completedroute no secondfinish. C native declaredservice method/residual observations, unknowninflightnotguessedsettled. Outer native source guards close-first/drain/readonlyprepare/ONEconsumption and nativebeforeafterinspector; ignored/substitutedmethodsuccessnotauthority. R1parts preserved. CRITICALhighernativeB/work/chainauthorityWeakMap ZEROregistrations, no publicsetter; native source/workledger/metadata401/WHOLEruns/storage/holds/latestprogress/typedGC/rootLAST factory UNWRITTEN, higherpositiveconstructorunreachable; no utilityinstallation/healthyavailabilityclaim. NativeCstrictlowercannotrebasedthroughtypedGCbyguess; genuineempty/coldassembledcompatibilitystillopen.30oldrequirements+3newguardsd7ccUNOBSERVED. Concrete currentclientpromise lacksnativeownedreq/res terminalticket; question006ac/6236 asksboundednativebeforeeffectworkgate+readonlyinspector internaloptions/no reverseimport/newendpoint/publicfield/stopauthority, UNKNOWNtransportnotremotehalt. No sixthclientdiffauthored. Full1694+16/past4832/4833 artifacts+sourcerehashed14:04 SHAbytesblobTREE38ba, source diffempty/scoped511/map69ce/names/assertions/deadlines/case15preserved. OPEN6571316 single201 ENTIREbody/author13/readback; substantiveMos4834delivered. No source/helperinstall/JSparse/Node/FS/process/proxy/test/full/gate/review/queue/global/FED288/landing/closure. Next4835independentnativeB/658 authorized; clientcouplingneedsselectionbeforebytes.
|
||||||
|
|
||||||
|
2026-10-26T14:19:05.310945+00:00 — Sage4835 STATIC1863 BEFORE: selected actual ManagementClient native workgate/readonly observation plus actual ModelKeys-beforeHTTP ledger; preserve ungated semantics/receipts/timing. Pin Node26.8.1 official docs/source and static localheader inference, no node process. Capacity128, no payload per-unusedgate duplication/no releaseforget-livework, preserve expected401disposal versus UNKNOWNerror. No install/parse/Node/FS/process/proxy/test/gate/review/queue/landing.
|
||||||
|
|
||||||
|
2026-10-26 Sage mos1864 course correction BEFORE:657/658 parked OPEN backlog at4835 static packet; no design applied. Source fixes641/642/643, assertions retained, independent Codex review, quiet-host full gate4 then authorized green/reviewed landing. Existing unrelated work preserved.
|
||||||
|
## 2026-10-23 — Row 288 C2-02 build starts (Bubba, #1793)
|
||||||
|
|
||||||
|
Before: agents can read the library; supporting-path and push-credential dependencies are separate unlanded heads. After intended: per-seat supporting writes/deletes with exact notices, human revert and one commit per Console save. Work is on bubba/row288, chained on original 283/285/286 commits; 284 tool base still pending. Plan and acceptance evidence: agents/bubba/work/queue-288/BUILD.md. Untested; no Node/test/build/gate run before Sage CLEAR. Landing waits for every dependency's own gate.
|
||||||
|
|
||||||
|
2026-10-25 | Bubba | Row288 #1793 gate after landed284 | Candidate2848d832e:289 whole files rc0 (2604 pass,1 covered FED skip),12 scripts rc0,6 mutants killed/restored controls rc0. Own bare-delete and fixture reds fixed with driver restarts; no pre288 red. Per-run hashes/rc in agents/bubba/work/queue-288/gate-r6-results.tsv. Slot returned Sage bubba-0034; manifest review/landing pending.
|
||||||
|
|
||||||
|
2026-10-26 Sage BEFORE Mos1864 source timing repair: isolate193774 row288; distinguish interpreter probe timeout, deterministic owned-socket idle-clock test, async copy child completion, retain assertions; one independent Codex review then quiet fullgate4.657/658 are backlog, not landing blockers.
|
||||||
|
2026-10-26 Sage SOURCE CHECKS Mos1864:641 injected ETIMEDOUT regression RED thenGREEN; keep1000ms fail-closed probe bound, distinct interpreter-probe-timeout.642 real-socket manual idle clock/readiness preserves assertions, ordinary-timeout mutationRED/restored.643 async owned child-close signal/readiness, all156 original assertions retained; combined39/39 zero anomaly; bus package1035/1035 zero skip. Independent Codex thread mcp:9245555c-5430-42f9-8afc-f77a70fc09ee pending; fullgate4/landing pending. No657/658 applied.
|
||||||
|
2026-10-26 Sage Codex review/fix Mos1864: independent thread mcp:9245555c-5430-42f9-8afc-f77a70fc09ee found one introduced P2 (detached copy descendants escape external timeout TERM). Fixed via fixture-only active-pool signal handling/native child close; actual regression RED→GREEN. Final affected40/40 zero skip/cancel/fail; all original assertions retained, productionserver unchanged. One review, no extra design gate; fullgate4 now pending quiet-host launch.
|
||||||
|
|
||||||
|
2026-10-26 Sage Mos1864/1881 model join AFTER verification: reviewed330/331 product362893d043ff96fdd35f18e326cce683db031471/treea7f7fcd7fc2cc4ba06efad78627f5f04929a0740 has321whole-file native PASS plus actual FEDR7 1/1; originalR2 orchestratorrc1 counter defect preserved separately. Whole bus1349/model-proxy100/webui490 PASS on unchanged product. Final PIN8.0.42, config55, all4P4+4P2 exact named mutant kills and whole restored controls PASS. Counter independent Codex review found2P2, reproduced7RED then23/23fixtures GREEN; failclosed unknown/missing summary and either-format failures. Commit/tree recorded before/end same; all1968 current+committed inputs mapped49c162c99 before later artifacts. Source join fix isolates runner-safe vocabulary from host ProxyPage imports; exact graph expectations retained. Original setup/timeouts/cleanup failures preserved; no657/658 installed/backlog remains. Documented Poe acceptance alias is byte-identical tested helper, not separately executed. Authorized landing next; source frozen.
|
||||||
|
|
||||||
|
2026-10-26 Sage LANDING Mos1864/1881: origin/refactor52ba14c5f now contains product362893 plus map/evidence49c162c99 and documented acceptance alias. Canonicalrefactor fast-forwarded by CAS with only136 exact accepted paths restored; unrelated8Rocko staged deletions and all untracked preserved, source/index clean for packages/scripts. Product1968hashes still match before/end freeze. Full source641–643/row288 previously63ec/acd; now330/331 landed same authorized window with applicable gates complete. Actual queue331 done refused rc2: round3 no recorded Boyd/Dewey approval;330 remains Poe in-progress with no formal round. No review impersonation/bypass; metadata closure is separate hard-rule wait. Tasks655/656 comments1336/1337 exact wholebody/author13 GET-verified, remainOPEN;657/658backlog unchanged. Ops660 runner update1334 independently GET-verified; no heavy gate active/no VM selected. No further source or gate work needed for this landing.
|
||||||
|
|
||||||
|
2026-10-26T17:51:50Z Dewey POST-LANDING REVIEW Mos1909/Mos1915 (retrospective review-phase receipt, not a build): BEFORE code already landed under1864 at52ba14c5f/product362893d04; historical round3 CHANGES and missing approvals preserved. AFTER independent source/original-task/evidence review saved agents/dewey/work/queue-331/postlanding-mos1909/REVIEW.md; sha256 ab7edcb484a32093e9cb541032def275665f1572aa97bb118d2742f1f29fa97c. Scoped APPROVE;646-648/652-655 FIXCONFIRMED,656 PARTIAL against broader original wording with matching-revoking-tmp/single-final-completion repair confirmed. All1968map inputs match current+committed product;339existing raw log hashes verified; relevant owner execution outcomes inspected with FED skip/dedicated native1/1 and original R2rc1 distinctions preserved. New findings none;657/658 remain backlog. FILE ONLY: no actual verdict comment, queue approval, task closure, source/helper/test changes, Node experiments or new gate.
|
||||||
|
|
||||||
|
2026-10-26T17:56:44Z Filbert POST-LANDING REVIEW Mos1909/1915 #1828 row330 (retrospective review receipt): BEFORE product362893d04 already landed underMos1864 at52ba14c5f; canonicalround1 request4137/4138 failed pre-send, no comment/approval. AFTER independent static source/brief/evidence review APPROVE for landed originalP4 repairs/current-generation P2join; saved agents/filbert/work/queue-330/postlanding-mos1909/REVIEW.md sha256 0f93bc883f1db2d2e136323040eaff2ad79aa184fa5ab140c94a0ae906f70ffe. All1968committed mapped blobs/bytes/SHA256 match product/candidate/cited0e1dd0a95; current1966match plus2queue-tracking differences; all43 evidence hashes match. OriginalR2rc1 preserved separately from supplied321whole+FEDR7/native1 and completed package/PIN/config/eightmutant+restore phases. NEW-330-01 retiring-key Console metadata gap is task-ready separate follow-up only, no reopening/newgate. No test/helper/source edit or run, live/secret access, formalpost/queue mutation, commit/push/closure;657/658 BACKLOG unchanged.
|
||||||
|
|
||||||
|
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
|
||||||
|
|
||||||
|
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
|
||||||
|
|
||||||
|
2026-10-28T22:18:42-05:00 | Codex FIX-A4-001 project19 #710 BEFORE/AFTER | Isolated branch work/q284-web-fetch-ipv6-ssrf at exact base09a847ed; source pine5a7b647 and A4 report39380B/5ee6f798 verified. Focused web test baseline7/7; regression-first exact mapped-IPv6 literal/DNS/redirect run6pass/4fail; canonical-bit implementation then10/10pass. Changed only web source/test plus append-only receipts; no live/internal probe, scratch, dependency/install, heavy/full gate, commit, push, PR or API mutation. Full CI/cross-family/PR/release remain parent-owned.
|
||||||
|
|
||||||
|
2026-10-29 | Sage | #710 independent-review follow-up | Claude source approval of 4cf888c04 records LOW NAT64 policy disclosure: canonical classification refuses exact 64:ff9b::/96; the old text prefix also refused some addresses outside that range. Added explicit boundary tests; production source unchanged. Zone-suffixed inputs also fail closed. Other IPv6 transition/special-use ranges remain a separate deployment-dependent follow-up, not resolved here. Prior author no-commit statements describe that earlier session; local commit and Mos PR1834 publication followed. No native/CI/merge claim.
|
||||||
|
2026-10-28T22:29:01-05:00 | Vikunja-19 FIX-156 legacy worker mounts BEFORE (late phase receipt) | Isolated worktree clean at exact base09a847edaa25b609bac7728ff83f224708a29399, branch work/vikunja-19-156-q284-worker-mounts. Required queue probe refused in linked worktree and was not bypassed. A2 SHA/whole report, I1 direction and legacy task/interactive/probe callers traced. Focused baseline13/13; TDD RED17 total=13 pass/4 intended failures for absent typed mount builder/per-path task argv. Receipt appended after first source pass rather than backdated; no container/native/live/provider/full-gate/API/PR/commit/push operation.
|
||||||
|
|
||||||
|
2026-10-28T22:36:00-05:00 | Vikunja-19 FIX-156 legacy worker mounts AFTER/source-verified | Static Compose root/control mounts removed; typed task/interactive/probe builder emits fixed per-file RO task/mission/user/SOUL/skill/control/fork inputs, only selected workspace/session RW, private mode0600 per-container prompt and no root/run-evidence/sibling/broker path. Unsupported/missing inputs refuse before runtime registration. Exact-base parsed Compose characterization fails with /var/lib/mosaic and /var/lib/mosaic/control present; focused RED13pass/4fail then user-file narrowing RED7pass/2fail; final two-file18/18 pass, syntax/diff checks and direct user+mission prompt mode600 check pass. Author self-review found no remaining Critical/Important source issue; no independent review by explicit no-children scope. No native confinement/container/provider/full gate or generic credential read; no commit/push/PR/API/release.
|
||||||
|
|
||||||
|
2026-10-28T22:35:03-05:00 | Correction to immediately preceding FIX-156 AFTER receipt | Its 22:36 timestamp was rounded one minute ahead; actual clock checkpoint was 22:35:03-05:00. Substance and evidence are unchanged.
|
||||||
|
|
||||||
|
2026-10-28T22:41:42-05:00 | Vikunja-19 FIX-156 atomic-control continuation BEFORE | Parent intake found the per-file `control/processing.json` bind pins the inode that `state.mjs` later replaces by temp-file rename, allowing a post-mount halt/generation change to escape final entrypoint admission. Exact branch/base remain work/vikunja-19-156-q284-worker-mounts at 09a847edaa25b609bac7728ff83f224708a29399; source-only TDD repair will restore a narrow rename-visible read-only control view without the data-root root, evidence, sibling state, socket, native/container/full-gate/API/credential operations, or integration authority.
|
||||||
|
|
||||||
|
2026-10-28T22:44:07-05:00 | Vikunja-19 FIX-156 atomic-control continuation AFTER/correction | Source trace confirmed `state.mjs` publishes `.state-<uuid>` with `renameSync` over `processing.json`; a file bind can retain the old inode. The typed launch now mounts exactly `<dataRoot>/control` at `/var/lib/mosaic/control:ro`, preserving rename-visible final halt/generation admission while leaving the data-root root, run/evidence/workspace/session trees and `bus/broker.sock` absent. Audited source-produced contents are `processing.json`, transient `.state-*`, and `runtimes/`, `stops/`, `run-stops/` runtime/stop metadata with transient `.receipt-*`; no socket producer targets `control/`. This supersedes the 22:36 per-file-control/no-runtime-receipt wording and clarifies the 22:41 "sibling state" phrase: read-only shared runtime/stop metadata is intentional, while sibling data trees remain absent. Focused TDD RED was 10 pass/1 intended fail (missing directory mapping) after real writer halt/clear inode replacements; standalone GREEN 11/11 and final two-file source GREEN 19/19, node checks 4/4, shell syntax and diff check all rc0. Existing native read-only mount negative and container CI were not run and remain required; no Docker/Podman/bwrap/native/live/provider/full gate, credential, commit/push/PR/API/release action.
|
||||||
|
|
||||||
|
2026-10-29T00:29:45-05:00 | Vikunja-19 FIX-156 R3 review repair BEFORE | Independent review report 12437B/SHA256 70daa15fdddfc83654821c99149dc84210a9bd7078614b60ff8e630e4fcb8a77 read in full. Branch is clean at published ee151685e9e15511407904397d73e4d82c37c85b, original base/merge-base 09a847edaa25b609bac7728ff83f224708a29399. F1 source trace confirms only the session-fork file bind is selected from inside a worker-writable directory and remains daemon-resolution TOCTOU; task/mission already use host-owned current-run write-once snapshots. Focused baseline19/19. Controls will require no-follow bounded descriptor copying to same-run evidence, original/foreign source refusal, immutable bytes after original substitution, and probe unsafe-user refusals; no native/container/full gate, install, credential, API, commit/push/amend or review dispatch.
|
||||||
|
|
||||||
|
2026-10-29T00:33:07-05:00 | Vikunja-19 FIX-156 R3 review repair AFTER/source-verified | F1 fixed without a new schema: newest session fork is opened O_NOFOLLOW/O_NONBLOCK, fstat regular/current-uid checked, capped at 16777216 bytes before allocation, copied from that descriptor only after stable size/mtime/ctime checks, and published `wx` as current `runs/<id>/session-fork.jsonl`; `workerLaunch` accepts only that exact same-run snapshot and refuses shared-session/foreign-run sources. Real fixture substitution after snapshot cannot change mounted bytes; newest symlink copies/mounts no target; oversize refuses before publication/Docker. F2 documented honest unselected-tree boundary and retained selected managed-business/discord namespace collision; parent follow-up must choose dedicated legacy prefix or explicit collision refusals/migration. F3 probe symlink/nonfile/colon refusals documented and fixture-covered. F4 exact deferred #660 list now includes `scripts/test-darkwing-launch.mjs`; list not run. INFO dispositions: I1 stale comment and unused Docker-client MOSAIC_DATA_ROOT removed with 9pass/1RED then10/10; I2 raw basename comparison eliminated by same-run slot; I3 accepted RO control metadata unchanged; I4 worker-owned private prompt unchanged; I5 gated placeholders unchanged; I6 incomplete predispatch run pattern unchanged; I7 external-path Pi fork remains native #660 evidence; I8 pre-existing Claude adapter env gap unrelated/unchanged. Baseline19/19; principal RED18pass/5intendedfail after one fixture-only setup correction; F1 GREEN23/23; final23/23, four Node checks and diff check rc0. No full package, shell suite, Darkwing compatibility, build, Docker/Podman/bwrap/native/live/provider/network/credential/API/PR/review/commit/amend/push/merge/release action; #660/native/cross-family gates remain.
|
||||||
|
Q284 / #470 source-only security fix 2026-10-29T03:33:00.640624+00:00: pin worker base Node24.22.2 multi-platform indexsha256:c86ecead9e55a5210ac1727de38a4ca840bf03dcaf34dc9749addbf383b1920c, official registry metadata retained under docs/security/q284-node-base. Hash/digest/platform references checked; no image pull/build/runtime/test/CI/deploy. Current deployed Node states remain UNKNOWN. No frozen packet change; dedicated CI and cross-family merge review pending.
|
||||||
|
|
||||||
|
2026-10-29 | Sage | #470 independent-review repair | M1 binds preparation/verification baseDigest to exactly one literal digest-pinned Containerfile FROM; stale cached tag metadata cannot be substituted. Focused fixture TDD: 0/3 RED then 3/3 GREEN, fake build/inspection only, no Docker command or image operation. L1 docs corrected. L2 additive registry config hash/version binding retained; prior metadata receipt preserved with correction. Earlier no-commit statement describes initial source session; Mos then published PR1837. #660 admitted runner and fresh independent review remain required; frozen H1/packets unchanged.
|
||||||
|
2026-10-29T03:27:31Z | Codex implementation sub-agent | #385 OIDC-only writer preparation on exact base 09a847edaa25b609bac7728ff83f224708a29399 | Added fail-closed CLI, programmatic and service-render refusals for `--send` without `--sso`; retained read-only header preview/proof; migrated inventoried writer tests to real in-process OIDC login/callback sessions and updated docs. Focused regression 5/5 and selected service cases 4/4 pass; syntax and diff checks pass. The broader writer suite is blocked before execution because the clean checkout has no `node_modules` and exact pinned `[email protected]` is unavailable; no install, commit, push, PR, queue move or green/completion claim.
|
||||||
|
2026-10-29T05:49:53Z | Codex Daybreak Blue xhigh implementation sub-agent | CORRECTION and Mos2255 #385 review repair R2 | The 03:27:31Z dependency/no-commit statements are historical: exact pinned `[email protected]` is now materialized through the ignored `node_modules` fixture with no install, and original preparation is committed at `9936a1be1a37fdb30ba53cf2f14b7897225c3e4a`. On that unchanged HEAD, uncommitted R2 source/tests/docs make Case 2 library preview read-only until #412, drop inherited non-SSO `--send` during release planning, and refuse duplicate service `--send`. Focused RED was 0/2, 0/1, 0/1; focused GREEN and selected T53/T55/T57/T58 fixture blocks pass. No root/native/live/full-suite/CI action, commit, push, PR/API, merge or frozen/live-pin change.
|
||||||
|
2026-11-02T18:03:53Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R3 on ab2bc23c7 | R2-F1: `scripts/stack-upgrade.sh` `read_args` now scans the serve argv after `--` and refuses `args-unreadable` before anything stops when the profile is library (no `--profile`, or the last one says library, as `case2-unit.sh` reads it) and `--send` is present; the message names the remediation, and the args file is never rewritten. `do_upgrade` and `do_rollback` both call `read_args` first, so rollback is covered; factory and tester paths are unchanged. RED on ab2bc23c7: new stack-upgrade case 0/1 (exit 2 rollback-failed, A4 and render-old failed, both units stopped), controls 1/1; GREEN 2/2. R2-I1: one component case runs the real `sso_for_target` then `send_for_target` on a legacy preview `--send` pointer, carried after `--sso` and before `--tester-socket`. R2-I2: TOOLS.md says a same-copy plain activate on a legacy pointer refuses already-active and needs `--no-send`. R2-I3: no code change; `uninstall`/`status` with `--send --send` exit 1, not 4, fail-closed either way. host-run-sheet section 7 gains the migration step. Whole files, one at a time: stack-upgrade 23/23 (69 s), stack-release 225/225 (608 s; a first run was cut by my 600 s background limit at 221 passing, its orphan fixture holder killed), case2-unit 48/48 (73 s). No root, systemd, container, network, push, PR or live action.
|
||||||
|
2026-11-02T18:19:04Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R4 on d0ddfa8de | R3-F1 fixed fail-closed, no migration: `scripts/stack-upgrade.sh` adds `legacy_console`, called right after `read_args` in `do_upgrade` and `do_rollback`. For the library profile (same default and last-wins rule as R3), an installed Console unit under the driver's UNIT_DIR whose ExecStart has a `--send` token after `serve` refuses new code `console-unit-legacy` (exit 3, nothing stopped). A missing unit is left to `read_old` (`units-unreadable`). The R3 args refusal stays. `case2-unit.sh`, factory, tester, stack-release.sh and OIDC/#412 untouched. Tests in stack-upgrade.test.mjs run the real base renderer (`git show 09a847eda` of case2-unit.sh and both templates) in the module fixture with fake getent/systemctl to make the legacy unit, prove the current case2-unit.sh refuses it, then drive upgrade and rollback with the real current renderer as A4's RENDER. Controls: read-only library unit, factory host, missing Console unit. RED on d0ddfa8de code 24/25 (the main case exits 2 rollback-failed, both units stopped), GREEN 25/25 (70.1 s). host-run-sheet section 7 now gives a read-only grep of the unit and says stop and report when it carries `--send`. TOOLS.md lists the code. No hash pins on changed files. stack-release.test.mjs and case2-unit.test.mjs read no changed file and were not rerun. One local commit, no push.
|
||||||
|
|
||||||
|
2026-11-02T18:58:01Z | Q284 lead: FIX-156 release bump to 0.0.13 | The lead gate on lead/q284-land 418f00bce failed scripts/test-task.sh "mission and private prompt paths delivered to adapter" twice (94 pass, 1 fail). Cause: the local worker image mosaic-poc-agent:0.85.1-r0.0.12 was built 2026-10-21 from pre-#156 source; its baked src/run-agent.sh:39 exports MOSAIC_SYSTEM_PROMPT_FILE=/var/lib/mosaic/system-prompt.md over the launcher value. The test is right. #156 changes the image contract both ways: its run-agent.sh refuses when the launcher does not set MOSAIC_SYSTEM_PROMPT_FILE, which no pre-#156 launcher does, and its launcher with an old image drops the user context directory and the private prompt path. Rebuilding the shared 0.0.12 tag would break the live pinned copy and every rollback target, so RELEASE moves to 0.0.13 and the new image gets its own tag (compose builds it from source on first use; release.sh ensure aligns an instance). No code change. Live activation of 0.0.13 belongs to the next re-pin. |
|
||||||
|
2026-11-02T18:55:26Z | Claude Sonnet 5.5 implementation sub-agent (lead T3 c5c1e8ba) | #385 PR 1836 repair R5 on 484aef7e2 | Test-only fix; no product file changed. The asset test in packages/webui/tests/chat.test.mjs still fetched `http://127.0.0.1:PORT/chat.js` bare, but since 9936a1be1 its `setup()` runs `sso: auth.sso`, and `serve.mjs:726` answers any non-public Host with 403 `public Host required` (the lead found it in the landing gate on lead/q284-land). The server is right, the test was stale. The test now fetches chat.js and chat.css through `c.get` on the public Host with the signed-in session (new `asText` option on the test `http()` so an asset body is not JSON-parsed), asserts 200, the content type and a non-empty body, asserts the same asset on the loopback Host gets 403 `public Host required`, and adds one line pinning that an unauthenticated public-Host request gets 303 to `/auth/login?return=%2Fchat.js` (`serve.mjs` 736-739), so the asset is not public. RED on 484aef7e2 29/30 (403 !== 200 at chat.test.mjs:350), GREEN 30/30. Whole packages/webui run 495/495, 0 fail (65 s). A first whole run gave 487/8, all 8 in pinned-copy.test.mjs: `fixtureRepo` copies `git ls-files -co --exclude-standard`, and a symlink named `packages/webui/node_modules` is untracked and not ignored (`node_modules/` matches directories only), so cpSync refuses it. That is an artifact of the symlink; the rerun used a real ignored directory of links. Observation, not changed: in `c.get` the `host` option is overridden by `baseHeaders.host`, so the existing POST assertion passing `host: 127.0.0.1:PORT` sends the public Host and exercises the Origin fence. No hash pins on changed files. One local commit, no push.
|
||||||
|
2026-10-25 — Rockerduck row334 (#1832), before: Case 2 renders bus/Console only. Plan: reuse P1 proxy template/runner under --proxy, enforce three-unit re-install checks and proxy→bus→Console starts, cover refusals and both named mutants. Tests held for Sage CLEAR; design in agents/rockerduck/work/queue-334/BUILD.md.
|
||||||
|
|
||||||
|
2026-10-25 — Rockerduck row334 (#1832), RED evidence: whole case2-unit.test.mjs against baseline has 48 pass/33 expected new fail; whole case2-install.test.mjs has 27 pass/1 expected new fail. All 74 older tests pass. Implementations restored. Sage sage-4390 authorizes seat-branch candidate commit/push before GREEN; GREEN/mutants held until separate CLEAR after row331. Per-failure evidence: agents/rockerduck/work/queue-334/red-results.txt.
|
||||||
|
|
||||||
|
2026-10-26 — Rockerduck row334 Mos1961: integrated old candidate onto 09a847eda using documented rebase after diagnosing merge queue-guard refusal; old RED preserved. Whole case2-unit 81/81 and case2-install 28/28 pass; named After and direct-ExecStart mutants killed, restored tests 2/2 pass; all nice19, private temp roots, zero skips. No source edits after integration beyond temporary restored mutants, no push/live action. Source c4bba5d2a; evidence agents/rockerduck/work/queue-334/BUILD.md. Full landing gate belongs to Sage; live behavior UNVERIFIED.
|
||||||
|
|
||||||
|
2026-11-02T19:10:25Z | Claude Sonnet 5.5 implementation sub-agent (lead T3 c5c1e8ba) | row 334 (#1832) R2 on lead/r334-land at 2b3e3ec83 | F1: the test "row334 no-proxy renders stay byte-identical to the pre-row renderer" took its baseline from `git show 78b69e1e6:scripts/case2-unit.sh`, which still requires `--send`; #385 removed `--send` from the library flags, so the merged tree failed `1 !== 0` ("case2-unit: serve flag --send is required"). The baseline is now the frozen fixture `packages/cli/tests/fixtures/case2-unit-pre-row334-renderer.sh.txt`, the bytes of `418f00bce:scripts/case2-unit.sh` (git blob d669e8cbd), and the test checks the fixture blob id before it runs. The fixture ends in `.txt` and is mode 0644, so no `*.sh` listing picks it up; stack-copy and stack-release already exclude `packages/*/tests`, and COPY_PATHS does not name it. F3: the re-install refusal in `scripts/case2-unit.sh` now also names `--proxy`; the pinned regex at case2-unit.test.mjs:593 follows it, and one new test covers adding `--proxy` to a no-proxy install (refuses, bytes unchanged, no systemctl call). F4: the "both units" comments (header, re-install comment, and the WantedBy comment near line 467) now name the bus and Console units, and the proxy unit under `--proxy`. No product logic changed. RED on 2b3e3ec83: the one test fails `1 !== 0`. GREEN: that test passes; case2-unit 83/83 (82 s), case2-install 28/28 (11 s), each run once; the three row253 C4 clock tests passed on the first run. Hash pins: the grep over `packages/*/tests/*` and `scripts/test-*.sh` found one pin in a file that names case2-unit.sh (case1-accept.test.mjs:802, which hashes case1-accept.sh); none on a changed file, and case1-accept.test.mjs was not run. F2 (stack-upgrade.sh and `--proxy`) is not touched. One local commit, no push.
|
||||||
|
2026-11-02T19:04:01Z Lead sub-agent (Claude Sonnet 5.5) ROW 173 R3 #1671 (Seen-intent test fix on lead/landing-batch1, base 09a847eda): BEFORE `MOSAIC_REQUIRE_EDITOR_BUILD=1 node --test packages/webui/tests/board-held.test.mjs` gave 4 tests, 3 pass, 1 fail ("a Seen or Unsee click that waited out a Board read keeps its meaning"), timing out at board-held.test.mjs:207 on the sessions table and held rows before any click. CAUSE: the row 173 test called setup(false), which starts the page with Show machine sessions off, so table.sessions never renders; its sibling at :168 uses setup(true). Not base drift: the same single test fails identically on a detached checkout of dewey/row173-r2 tip 6d15eb5fc20a (based on 78b69e1e6). The test had never run (BUILD.md: "no runs yet"). FIX: board-held.test.mjs:198 setup(false) to setup(true), one token; app.js unchanged. AFTER the test passes (1/1); whole board-held file 4 tests, 4 pass, 0 fail; whole webui package `node --test tests/*.test.mjs` 491 tests, 491 pass, 0 fail, 0 skipped. Teeth check: with app.js reverted to the pre-row-173 behavior (no intent check, seen: !r.seen) the test fails at the announce wait; app.js restored byte for byte. Hash-pin grep (packages/*/tests/*, 33 hex lines, positive control account-migration pin found): no pin names board-held.test.mjs or app.js. Comparison worktree and links removed. Not run: scripts/test-*.sh (lead gate). Corrects the r2 BUILD.md claim of no runs; no earlier entry edited.
|
||||||
|
2026-11-02T19:27:10Z Claude Sonnet 5.5 (child of lead c5c1e8ba) row 267 (C2-15, #1772) R2, F1 search hits carry their source universe: BEFORE `search()` in packages/library/src/query.mjs returned hits without `universe` in both shapes (normal and excerpt_too_long); find already carried it; hybrid.test.mjs reduced search hits to paths and passed. AFTER both shapes carry `universe: file.universe` after `scope`, as find does; hybrid.test.mjs asserts the source universe under both exclude forms (own file and a source's canon) plus a new oversized-line case through the hybrid; the broker C2-15 case asserts it on library.search; query.test.mjs:178 shape pin gains universe. RED 4 of 21 failed on the missing field. GREEN the two files 21/21, library 182/182, business 284/284, bus 1351/1351 (see correction). Mutants: universe off the normal hit killed by 3 tests, off the excerpt_too_long hit killed by 2. F2 (hybrid source exception ignores source scope in reader and guard) not touched, lead files it. Correction recorded honestly: the first bus run in a checkout without node_modules failed 3 tests in model-hire-ownership.test.mjs, also failing on base 09a847eda, and pass with node_modules linked; a second bus run with the link failed 1 test in model-final-completion.test.mjs that passed 3 of 3 alone on this tree and on base; a rerun was 1351/1351. No push.
|
||||||
+11
-5
@@ -1,7 +1,10 @@
|
|||||||
# Minimal Mosaic Stack POC agent image.
|
# Minimal Mosaic Stack POC agent image.
|
||||||
# Base: maintained Node.js image (same family as Pi's documented
|
# Base: maintained Node.js image (same family as Pi's documented
|
||||||
# containerization example in docs/containerization.md).
|
# containerization example in docs/containerization.md).
|
||||||
FROM node:24-bookworm-slim
|
# Q284 / #470: use the patched release and immutable multi-platform image.
|
||||||
|
# Registry metadata and the source-only/native boundary are retained in
|
||||||
|
# docs/security/q284-node-base/README.md.
|
||||||
|
FROM node:24.22.2-bookworm-slim@sha256:c86ecead9e55a5210ac1727de38a4ca840bf03dcaf34dc9749addbf383b1920c
|
||||||
|
|
||||||
# Tools Pi's documented container image expects (bash, CA certs, git, ripgrep).
|
# Tools Pi's documented container image expects (bash, CA certs, git, ripgrep).
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
@@ -28,10 +31,13 @@ RUN chmod 0555 /opt/mosaic/contracts /opt/mosaic/contracts/* \
|
|||||||
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
|
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
|
||||||
&& chmod 0555 /opt/mosaic/adapters /opt/mosaic/adapters/*/adapter.sh
|
&& chmod 0555 /opt/mosaic/adapters /opt/mosaic/adapters/*/adapter.sh
|
||||||
|
|
||||||
# Writable state, workspace, and pi agent directory (auth.json is
|
# Private per-container prompt/output paths, the fixed narrow-mount targets,
|
||||||
# bind-mounted read-only at runtime; nothing is copied into the image).
|
# workspace, and pi agent directory (auth.json is bind-mounted read-only at
|
||||||
RUN mkdir -p /var/lib/mosaic /workspace /home/node/.pi/agent \
|
# runtime; no host data root is mounted).
|
||||||
&& chown -R node:node /var/lib/mosaic /workspace /home/node /opt/app
|
RUN mkdir -p /var/lib/mosaic/private /var/lib/mosaic/input/user /var/lib/mosaic/input/skills /var/lib/mosaic/control /var/lib/mosaic/session /workspace /home/node/.pi/agent \
|
||||||
|
&& touch /var/lib/mosaic/input/task.json /var/lib/mosaic/input/mission.json /var/lib/mosaic/input/agent-soul.md /var/lib/mosaic/input/session-fork.jsonl /var/lib/mosaic/control/processing.json \
|
||||||
|
&& chown -R node:node /var/lib/mosaic /workspace /home/node /opt/app \
|
||||||
|
&& chmod 0700 /var/lib/mosaic/private /var/lib/mosaic/control
|
||||||
|
|
||||||
USER node
|
USER node
|
||||||
WORKDIR /workspace
|
WORKDIR /workspace
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ not implemented (see BRIEF.md, "Explicit exclusions").
|
|||||||
|
|
||||||
## L0 — Implemented: container returns MOSAIC_HELLO_OK
|
## L0 — Implemented: container returns MOSAIC_HELLO_OK
|
||||||
|
|
||||||
One image (`mosaic-poc-agent:0.84.4`, built on `node:24-bookworm-slim`, non-root,
|
One image (`mosaic-poc-agent:0.84.4`, built on digest-pinned `node:24.22.2-bookworm-slim`, non-root,
|
||||||
pinned Pi) runs one Pi agent one-shot. Four immutable local contract files are
|
pinned Pi) runs one Pi agent one-shot. Four immutable local contract files are
|
||||||
loaded in fixed order into the generated system prompt
|
loaded in fixed order into the generated system prompt
|
||||||
(`/var/lib/mosaic/system-prompt.md`). One real model request is sent
|
(`/var/lib/mosaic/private/system-prompt.md`, private to that container). One real model request is sent
|
||||||
noninteractively; the response must equal `MOSAIC_HELLO_OK` exactly or the
|
noninteractively; the response must equal `MOSAIC_HELLO_OK` exactly or the
|
||||||
verification exits nonzero. Authentication is supplied at runtime only
|
verification exits nonzero. Authentication is supplied at runtime only
|
||||||
(read-only mounted pi auth file, or a provider API key environment variable).
|
(read-only mounted pi auth file, or a provider API key environment variable).
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ production-ready.
|
|||||||
BRIEF.md requirements for the original container proof
|
BRIEF.md requirements for the original container proof
|
||||||
BUILD-LOG.md append-only build/verification log
|
BUILD-LOG.md append-only build/verification log
|
||||||
LAYERS.md implemented layer (L0) and deferred layers (L1-L6)
|
LAYERS.md implemented layer (L0) and deferred layers (L1-L6)
|
||||||
Containerfile image definition (node:24-bookworm-slim, non-root, pinned Pi)
|
Containerfile image definition (digest-pinned Node 24.22.2 Bookworm slim, non-root, pinned Pi)
|
||||||
compose.yaml one service: mosaic-agent (one-shot; configured via env)
|
compose.yaml one service: mosaic-agent (one-shot; configured via env)
|
||||||
package.json pins @earendil-works/pi-coding-agent at exactly 0.84.4
|
package.json pins @earendil-works/pi-coding-agent at exactly 0.84.4
|
||||||
package-lock.json resolved lockfile used by npm ci in the image
|
package-lock.json resolved lockfile used by npm ci in the image
|
||||||
@@ -170,20 +170,37 @@ Inside the container:
|
|||||||
|
|
||||||
```text
|
```text
|
||||||
/opt/mosaic/contracts immutable contract files
|
/opt/mosaic/contracts immutable contract files
|
||||||
/var/lib/mosaic generated runtime state (mounted from configured dataRoot)
|
/var/lib/mosaic/input selected task/mission/user/role inputs (read-only mounts)
|
||||||
/workspace agent workspace
|
/var/lib/mosaic/control processing and runtime/stop metadata (read-only mount)
|
||||||
|
/var/lib/mosaic/private generated prompt in this container only
|
||||||
|
/var/lib/mosaic/session selected session target (read-write when declared)
|
||||||
|
/workspace selected workspace (read-write when declared)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The configured data-root root, evidence outside the current run, unselected
|
||||||
|
run/workspace/session trees, control sockets, and broker sockets are not mounted.
|
||||||
|
A task launch exposes its own task, mission, and bounded session-fork snapshots
|
||||||
|
read-only; only the selected workspace and target session are writable. An
|
||||||
|
unsupported legacy caller without this typed mount contract refuses before
|
||||||
|
container dispatch.
|
||||||
|
|
||||||
|
Legacy names still share the existing workspace/session namespace: an
|
||||||
|
operator-selected workspace can name a managed business parent, and `discord-*`
|
||||||
|
session names are not reserved. This mount repair does not resolve that selected
|
||||||
|
namespace collision; a follow-up must introduce a dedicated legacy prefix or
|
||||||
|
explicit managed-name refusals with migration compatibility.
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
1. `scripts/build.sh` builds the release image (`mosaic-poc-agent:<pi>-r<release>`,
|
1. `scripts/build.sh` builds the release image (`mosaic-poc-agent:<pi>-r<release>`,
|
||||||
tag derived from `RELEASE` + the pinned Pi version) with Docker Compose.
|
tag derived from `RELEASE` + the pinned Pi version) with Docker Compose.
|
||||||
2. On each run, `/opt/mosaic/src/load-contracts.sh` reads the four contract files
|
2. On each run, `/opt/mosaic/src/load-contracts.sh` reads the four contract files
|
||||||
in fixed order (CONSTITUTION, STANDARDS, SOUL, USER), joins them with clear
|
in fixed order (CONSTITUTION, STANDARDS, SOUL, USER), joins them with clear
|
||||||
separators, and writes `/var/lib/mosaic/system-prompt.md`.
|
separators, and writes `/var/lib/mosaic/private/system-prompt.md` in the
|
||||||
|
disposable container filesystem (never in the host data root).
|
||||||
3. `/opt/mosaic/src/run-agent.sh` starts Pi noninteractively
|
3. `/opt/mosaic/src/run-agent.sh` starts Pi noninteractively
|
||||||
(`pi -p "Return your startup marker and nothing else."`) with
|
(`pi -p "Return your startup marker and nothing else."`) with
|
||||||
`--system-prompt "$(cat /var/lib/mosaic/system-prompt.md)"` and all ambient
|
`--system-prompt /var/lib/mosaic/private/system-prompt.md` and all ambient
|
||||||
discovery disabled (`--no-context-files --no-skills --no-extensions
|
discovery disabled (`--no-context-files --no-skills --no-extensions
|
||||||
--no-prompt-templates --no-themes`), ephemeral (`--no-session`), tool-free
|
--no-prompt-templates --no-themes`), ephemeral (`--no-session`), tool-free
|
||||||
(`--no-tools`), and offline for startup network operations (`--offline`).
|
(`--no-tools`), and offline for startup network operations (`--offline`).
|
||||||
|
|||||||
+3
-2
@@ -21,7 +21,7 @@ system prompt has been generated.
|
|||||||
|
|
||||||
| Variable | Meaning |
|
| Variable | Meaning |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `MOSAIC_SYSTEM_PROMPT_FILE` | Absolute path to the generated system prompt (contracts + optional mission section). Read it; do not modify it. |
|
| `MOSAIC_SYSTEM_PROMPT_FILE` | Absolute path to the generated per-container system prompt (contracts + optional mission section). Read it; do not modify it. |
|
||||||
| `MOSAIC_REQUEST` | The exact user request text (may contain newlines). |
|
| `MOSAIC_REQUEST` | The exact user request text (may contain newlines). |
|
||||||
| `MOSAIC_PROVIDER` | Configured provider name. |
|
| `MOSAIC_PROVIDER` | Configured provider name. |
|
||||||
| `MOSAIC_MODEL` | Configured model id. |
|
| `MOSAIC_MODEL` | Configured model id. |
|
||||||
@@ -42,7 +42,8 @@ Optional, adapter-specific (documented per adapter):
|
|||||||
|
|
||||||
1. Adapters print ONLY the response on stdout. Status lines go to stderr.
|
1. Adapters print ONLY the response on stdout. Status lines go to stderr.
|
||||||
2. Adapters never read configuration files; the resolved settings arrive via environment.
|
2. Adapters never read configuration files; the resolved settings arrive via environment.
|
||||||
3. Adapters never write outside `/var/lib/mosaic`.
|
3. Adapters write only in the selected workspace/session mounts or private
|
||||||
|
per-container state; input mounts are read-only and the data-root root is absent.
|
||||||
4. Adding a worker adapter requires: a new directory, the contract
|
4. Adding a worker adapter requires: a new directory, the contract
|
||||||
implementation, and adding the name to the allowlist in
|
implementation, and adding the name to the allowlist in
|
||||||
`scripts/mosaic-config.mjs`. A managed-session adapter (below) is selected
|
`scripts/mosaic-config.mjs`. A managed-session adapter (below) is selected
|
||||||
|
|||||||
@@ -0,0 +1,501 @@
|
|||||||
|
# Row 288 (#1793): C2-02 agent writes, notices, revert and Console saves
|
||||||
|
|
||||||
|
Owner: Bubba, Codex gpt-6.1-sol, thread 3d6672b5-5544-4b95-9e09-e79574f1aa14.
|
||||||
|
Reviewer: Webby. Gate and landing: Sage. Append-only build record.
|
||||||
|
|
||||||
|
## 2026-10-23 start and implementation plan
|
||||||
|
|
||||||
|
Base 45dca69f6 on bubba/row288. Direct mandate mos-1499 (Q245), confirmed sage-3613.
|
||||||
|
The canonical `scripts/mosaic queue next bubba` returned `nothing`; Sage owns the owner transition.
|
||||||
|
The initial worktree invocation refused linked-worktree use; retried in canonical checkout.
|
||||||
|
|
||||||
|
Spec: docs/plans/2026-10-20_case2-rows.md, C2-02; agents/gosalyn/work/case2/DESIGN.md ruling after r11.
|
||||||
|
Handoffs: Honker queue-283 BUILD.md Q4 (missing/non-100644 delete refuses); Morgana
|
||||||
|
queue-225 BUILD.md A2 at 66f7becf2 (strict revert arguments/result), confirmed by Fethry fethry-0005.
|
||||||
|
`project` is the business.projects key, never a chat UUID.
|
||||||
|
|
||||||
|
Dependencies merged with their commits intact, no amend or force-push:
|
||||||
|
- 283 origin/honker/row283-build 88ec5e8e4 (new E4 head to follow).
|
||||||
|
- 285 origin/scrooge/row285-r2 53db6b7ca.
|
||||||
|
- 286 origin/ludwig/row286-r2 573fa0be0.
|
||||||
|
- 284: no named remote branch yet. Tool changes come last.
|
||||||
|
All merge commits are marked Untested. Nothing has run under Node. Sage's latest instruction
|
||||||
|
sage-3613 reserves **all Node and test runs** for CLEAR; this supersedes the initial targeted-test
|
||||||
|
permission. Build untested now as instructed, then run RED/GREEN checks/mutants on CLEAR.
|
||||||
|
|
||||||
|
Architecture: one host-only plumbing writer under the existing library lock; broker authorizes and
|
||||||
|
selects credentials, then inserts the fixed notice directly. Human save/revert use editor +
|
||||||
|
library-human independently of seat lifecycle. No worktree, deferred push, role expansion or UI.
|
||||||
|
|
||||||
|
### Tasks and acceptance
|
||||||
|
|
||||||
|
- [ ] Plumbing: new library/src/write.mjs, mirror state publication and package exports; new
|
||||||
|
library/tests/write.test.mjs. One-parent write/delete, byte-exact content, seat identity/trailer,
|
||||||
|
stale-base, nonregular/missing deletes, retry once on an unrelated remote change, push failure
|
||||||
|
without local ref movement, human editor and revert reachability/single-path checks.
|
||||||
|
- [ ] Broker + runtime: library.doc.write/delete, library.file.save, library.revert; strict keys,
|
||||||
|
creative + library.write + live unheld project grant; direct exact notice; human-only save/revert.
|
||||||
|
New bus/tests/library-write.test.mjs covers authorization, unchanged refs, A2 contract and socket.
|
||||||
|
- [ ] Transport: only human library.file.save joins the existing large-save exception. New tests
|
||||||
|
prove >64 KiB save accepted, agent writes retain 64 KiB bound, malformed/oversize saves refuse.
|
||||||
|
- [ ] Tools after 284: library_doc_write/delete in harness tools; exact eight/ten-name snapshots
|
||||||
|
in a new harness test; cli dispatch wiring.
|
||||||
|
- [ ] Verify on CLEAR: new tests, library/bus/harness suites and all scripts/test-*.sh on Sage's
|
||||||
|
assigned slot. Mutants remove supporting guard and force push; both must fail. Fixture-token
|
||||||
|
search over captured output. No gate, landing or queue move claimed before Sage's acceptance.
|
||||||
|
|
||||||
|
Pre-flight interfaces: broker consumes library writer {project,path,commit}; revert adds reverted;
|
||||||
|
writer consumes C2-03b push {pushed} or {raced,tip} and supportingPath(mapping,universe,path,tree).
|
||||||
|
State publication must add optional lastPush while preserving old state readability. Refusals must
|
||||||
|
restore fetched remote-tracking refs as well as preserve served. Runtime must bind credential file
|
||||||
|
references itself; no file, identity, message or credential is supplied by the agent.
|
||||||
|
|
||||||
|
Necessary file-scope additions: packages/bus/src/runtime.mjs (actual adapter injection),
|
||||||
|
packages/library/src/index.mjs (exports), and CLI's existing console adapter if saves require it.
|
||||||
|
Reported to Sage in bubba-0002. Existing tests will not be edited without Mos's OK via Sage.
|
||||||
|
|
||||||
|
Review focus: remote tip races, nonregular entries and folded paths, unsafe human credential before
|
||||||
|
git, revert after revoked/fired writer, and large-request exception never extending agent writes.
|
||||||
|
|
||||||
|
### Existing-test changes
|
||||||
|
|
||||||
|
None authored by Bubba yet. Dependency test changes remain their owners' original commits.
|
||||||
|
|
||||||
|
## 2026-10-23 first static build (not a gate result)
|
||||||
|
|
||||||
|
283 E4 merged intact at 76d651dba. Honker next reports e67c27b32 (test environment only), to merge
|
||||||
|
before push. Della reports row 284 has not been built/pushed; row224's 23816cf28 is not a 284 head.
|
||||||
|
No speculative 284 pin. Typed tools and served-blob lookup integration remain pending 284.
|
||||||
|
|
||||||
|
Implemented (unrun): bare plumbing writer, one-parent commit and fixed trailer, exact-content blobs,
|
||||||
|
base comparison, supporting path guard and delete regular-blob check, one remote-race retry,
|
||||||
|
ref restoration on refusal, immediate served publication/lastPush; human save and reachable one-path
|
||||||
|
business-trailer revert; broker grants/identity/notice path; runtime adapter wiring; large-save socket
|
||||||
|
exception. New tests: library/tests/write.test.mjs and bus/tests/library-write.test.mjs. No old test edits.
|
||||||
|
|
||||||
|
### Approved scope additions, sage-3628
|
||||||
|
|
||||||
|
Every hunk outside the brief's owned list:
|
||||||
|
- `packages/bus/src/runtime.mjs`: `humanWriteOptions` checks editor before choosing the human slot;
|
||||||
|
three library adapter entries bind dataRoot, command and the host-only seat store reference. These
|
||||||
|
are needed to make actual bus calls reach the new writer without accepting agent-supplied files.
|
||||||
|
- `packages/library/src/index.mjs`: export writeLibraryDoc/saveLibraryFile/revertLibraryCommit so
|
||||||
|
runtime's existing library module adapter can call them.
|
||||||
|
- `packages/library/src/sync.mjs`: shared write guard with opaque token compared by identity;
|
||||||
|
push's race fetch recognizes only that owner and does not clear its guard; ordinary sync and a
|
||||||
|
forged token still refuse library-sync-busy. Narrow publishLibraryWrite validates ids, reads the
|
||||||
|
locked state, rebuilds the index via readLibrary, moves served/tracking and writes lastPush. The
|
||||||
|
raw writeState remains private and is not exported through index.mjs.
|
||||||
|
|
||||||
|
Ludwig ludwig-0064 reviewed the intended interface and requested the opaque token (implemented),
|
||||||
|
narrow publication (implemented), whole library + bus library-credential checks and a token mutant
|
||||||
|
(planned). His 573fa0be0 remains current and unrun. 288's additions are separate commits, not folded
|
||||||
|
into 286. Tracking restores only if the whole write refuses, not between the first race and retry.
|
||||||
|
|
||||||
|
Known tradeoff, accepted by Sage sage-3628 for MVP: the brief holds the flock through network Git;
|
||||||
|
readers can hit the existing 5-second library-sync-busy while it runs. Structural supportingPath
|
||||||
|
preflight is pure and precedes Git; served/fetched listTree checks repeat it with the real tree before
|
||||||
|
any remote write. A tree-dependent check necessarily reads the tree first (Honker honker-0184 item2).
|
||||||
|
|
||||||
|
### Mutants for CLEAR
|
||||||
|
|
||||||
|
- Remove the `pathOf` calls for agent operations: the M12 broker/bare-ref tests must fail on a
|
||||||
|
story/unsupported path while checking remote, tracking and served refs.
|
||||||
|
- Prefix the push refspec in syncCommand with `+`: write.test moved-target race must fail, because
|
||||||
|
its command seam preserves production syncCommand's refspec (only remote URL/protocol are fixture).
|
||||||
|
- Replace `writers.get(mirror) === writeToken` with `true`: write.test forged-token case must fail.
|
||||||
|
|
||||||
|
No Node, test, build or mutant has run. `git diff --check` is clean. Counts are not claimed.
|
||||||
|
|
||||||
|
### Console dispatch integration
|
||||||
|
|
||||||
|
The existing cli delegates its transport wiring to console-bus.mjs, so the save dispatch needs that
|
||||||
|
file too: one null `librarySave` option and one `--send` assignment to library.file.save. cli.mjs
|
||||||
|
threads that option into startServer; row C2-11b owns the actual route/page that consumes it. New
|
||||||
|
webui/tests/library-write-options.test.mjs covers --send and the user transport boundary. 225 owns
|
||||||
|
libraryRevert dispatch; 288 adds only librarySave to avoid overlapping that ownership. Additional
|
||||||
|
scope reported to Sage and Fethry. No changes to an existing test.
|
||||||
|
|
||||||
|
## 2026-10-23 second static pass and dependency review
|
||||||
|
|
||||||
|
First push: c867cada9 on origin/bubba/row288, reported bubba-0005 to Sage/Webby/Mos and
|
||||||
|
bubba-0006 to Fethry/Ludwig. No PR created and no review/gate requested as complete.
|
||||||
|
|
||||||
|
Ludwig ludwig-0065 checked the exact sync diff against 286 without running anything. Token identity,
|
||||||
|
ordinary-sync exclusion, 286 R1 preservation, guard key and end-of-write tracking restoration fit.
|
||||||
|
F1: state publication could fail after served moved, leaving old state/new served. Root cause is
|
||||||
|
publication order without rollback, compared against sync's existing rollback. Added an unrun
|
||||||
|
filesystem rename-failure regression, then changed the narrow helper: on failure it validates the
|
||||||
|
state under the same lock, CAS-restoring served if state has not published the new commit. If rename
|
||||||
|
succeeded but directory fsync failed and the state validates against new served, it keeps that pair.
|
||||||
|
All failure cases answer outcome-unknown; tracking remains the commit already pushed remotely.
|
||||||
|
Verification is pending CLEAR, so this is a proposed fix, not a tested resolution.
|
||||||
|
|
||||||
|
Added the actual broker-to-bare tests for each M12 path refusal (both agent verbs), unchanged remote
|
||||||
|
and all mirror refs, exact write/delete notices, and human revert after fixture grant removal/hold.
|
||||||
|
The bare fixture moved to new library/tests/write-fixture.mjs so broker tests reuse real plumbing.
|
||||||
|
Added the raw socket proof-nested-save-name case to pin the parsed-verb large-request check.
|
||||||
|
Missing editor/slot tests now make the mirror metadata invalid first: reaching Git would change the
|
||||||
|
refusal, so the tests check the pre-Git gate rather than merely count remote commands.
|
||||||
|
|
||||||
|
Additional required doc hunk: packages/library/README.md appends the four verb contracts,
|
||||||
|
lastPush shape, exact notice, lock tradeoff and publication failure behavior. No existing test from
|
||||||
|
the dependency/base has changed. All new/modified tests in this pass were authored by this row.
|
||||||
|
`git diff --check` remains clean. No Node/tests/build/mutants run; 284 and CLEAR remain pending.
|
||||||
|
|
||||||
|
## 2026-10-23 early review follow-up (Webby E1-E6; Ludwig F2)
|
||||||
|
|
||||||
|
Sage sage-3652 approves console-bus.mjs wiring (null option + --send dispatch), confirms editor.user
|
||||||
|
as the sole human login source and reserves CLEAR for T3/T4 after T2. Ordinary sync()'s separate
|
||||||
|
post-rename fsync gap stays out of 288 per that ruling; no change to sync()'s existing rollback.
|
||||||
|
|
||||||
|
Honker 283 head 46bad7ea3 merged intact: mapping editor.user is optional, and if present uses the
|
||||||
|
existing plain Gitea-user pattern. The omission at mapping level is valid; human writes refuse it.
|
||||||
|
|
||||||
|
- Ludwig F2 / Webby E6: confirmed the previous runtime used the fetch bot's mapping.user wrongly.
|
||||||
|
Runtime now passes mapping.editor.user to humanCredential, never mapping.user. Missing user gives
|
||||||
|
library-human-missing before Git. New real-runtime cases pin both save and revert with a separate
|
||||||
|
fetch-bot login, positive pushes under her-gitea-login, and no command for an absent editor login.
|
||||||
|
The broker's credential.agent is s.role, not args: added an exact assertion and strict-key refusal
|
||||||
|
cases for caller-supplied agent and credential.
|
||||||
|
- E1: replaced the business-id RegExp interpolation with a literal startsWith(business.id + '/')
|
||||||
|
check and ID_PATTERN on only the instance suffix. New acme.co vs acme-co trailer test.
|
||||||
|
- E2: new broker→bare case holds the seat in the fetch command. beforePush must refuse
|
||||||
|
library-write-no-grant with all local refs and the remote unchanged and no notice. New mutant:
|
||||||
|
remove `options.beforePush?.();` in write.mjs; the E2 test must fail.
|
||||||
|
- E3: new broker cases for expired rotate_by, fire.stopped without fire.done, missing role.publish
|
||||||
|
project, grant/identity Gitea-user mismatch, and missing identity name/email, for both agent verbs.
|
||||||
|
- E4: the exceptional publication failure currently returns outcome-unknown before the broker has
|
||||||
|
a successful result to put in a notice, so a remote agent commit can exist without a Console
|
||||||
|
notice. There is no durable notice outbox/retry in this row. The trailer commit remains human
|
||||||
|
revertible by id after sync; this is an explicit known failure-mode gap for the manifest, not
|
||||||
|
a claim that every failed publication emits a notice. A new real-push test breaks state decoding
|
||||||
|
after push admission, pins outcome-unknown, old served and no notice. It also found a local error
|
||||||
|
propagation gap: errors before publishLibraryWrite's internal try now normalize to outcome-unknown
|
||||||
|
in the writer once push has succeeded, so the caller is never told an ordinary refused-write code.
|
||||||
|
- E5: 284 still has no build. Tools/8-or-10 snapshot and served-blob integration remain pending.
|
||||||
|
librarySave is intentionally only an adapter option until C2-11b supplies its route/page.
|
||||||
|
|
||||||
|
All tests above are newly authored by row288 and remain unrun; no changes to baseline/dependency
|
||||||
|
tests. RED/GREEN and mutants await CLEAR. Proposed fixes are not claimed verified. The new host-only
|
||||||
|
library write module imports the existing pure ID_PATTERN to match the broker's accepted instance ids.
|
||||||
|
|
||||||
|
## 2026-10-23 mos-1520 ruling: post-push notice is required
|
||||||
|
|
||||||
|
Correction to the E4 interpretation above: Mos rejected the known-gap treatment. The requirement
|
||||||
|
stays: a pushed agent commit has the exact notice even if local publication then fails. This is not
|
||||||
|
an outbox or retry. The writer now calls the broker's trusted synchronous onPushed callback as soon
|
||||||
|
as push returns pushed:true, before publication. The callback records the exact library-write notice
|
||||||
|
and action.allowed in the normal Console-store transaction. Publication failure still answers
|
||||||
|
outcome-unknown. The notice's Revert can refuse library-revert-not-agent until sync makes that commit
|
||||||
|
reachable from served; README now says that explicitly and removes the rejected gap description.
|
||||||
|
|
||||||
|
The row's own real-push corruption test now pins the exact notice body with the pushed id, old
|
||||||
|
served and outcome-unknown; after restoring readable state it pins Revert's refusal before sync and
|
||||||
|
success after sync. The successful-write adapter fixture calls onPushed too, matching runtime's
|
||||||
|
writer contract. No existing baseline/dependency test changed (mos-1520 explicitly authorizes this
|
||||||
|
row's test correction without mos-1272).
|
||||||
|
|
||||||
|
Residual Console-store failure: if notice insertion/routing/its event transaction fails, the broker
|
||||||
|
calls a separate host log sink with {event:library-notice-store-failed,code:outcome-unknown,business,
|
||||||
|
instance,op,commit}. It logs no args, path content, credential, raw SQL or exception output. Runtime's
|
||||||
|
new library.log adapter writes this metadata to stderr. The caller gets outcome-unknown even if
|
||||||
|
recording action.refused in that same broken store fails. A new real-push test uses temporary SQLite
|
||||||
|
abort triggers on notice insertion and refusal evidence, checks remote advanced/served unchanged,
|
||||||
|
no message, the exact external log and outcome-unknown. It does not claim a notice can be stored in
|
||||||
|
a failed Console store. If the host log sink itself also fails, no durable log can be promised; the
|
||||||
|
caller still receives outcome-unknown. The runtime log hunk is the required residual-failure wiring.
|
||||||
|
|
||||||
|
Mutant added: move `options.onPushed?.({ project: context.project, path: change.path, commit });`
|
||||||
|
from before `await publishLibraryWrite(...)` to immediately after that await inside the same try.
|
||||||
|
Successful operations keep their notice, but the outcome-unknown publication path drops it. The
|
||||||
|
C2-02 E4 real-push corruption test must fail on its exact notice assertion. Run on CLEAR and restore.
|
||||||
|
|
||||||
|
No Node/tests/build/mutants run. Static git diff --check clean. Della's first284 head0ed4fbab9 is
|
||||||
|
explicitly incomplete and not a finished dependency; waiting for her complete-head pin before tools.
|
||||||
|
|
||||||
|
Webby webby-0253 (static, cef503cb9) closes E4 per mos-1520; no tests ran. N1: a failed notice insert throws from onPushed before publication, so served stays at the prior commit until sync; the store-failure test pins this safe direction. Only E5 (284 tools/snapshot integration) remains open in this early review.
|
||||||
|
|
||||||
|
## 2026-10-23 complete284 merge and final tool integration (unrun)
|
||||||
|
|
||||||
|
Della della-0037 supplied complete untested head47db04eba85ac3ceb7e81385603f97bb6f8c1a38,
|
||||||
|
replacing the incomplete head. Merged intact as c0ca3894c. Its22423816cf28 and2164f3fbc25a
|
||||||
|
lineage is retained. Three conflicts were in overlapping production wiring only:
|
||||||
|
- broker.mjs: keep Della's LIBRARY_LOOKUPS object and #requestLibraryLookup byte-for-byte, and
|
||||||
|
keep288 writer/notice methods; LIBRARY_VERBS contains both sets and request dispatch calls lookup.
|
||||||
|
- runtime.mjs: keep lookup adapter plus288's metadata log and write adapters.
|
||||||
|
- library/index.mjs: keep index/query exports,286's push/humanCredential exports and288's writer exports.
|
||||||
|
No dependency test body was changed in the merge. These are overlapping consumer integrations,
|
||||||
|
not rewrites of dependency commits. Every prerequisite still needs its own gate (mos-1351).
|
||||||
|
|
||||||
|
Added library_doc_write/library_doc_delete after the five lookups, only for a creative definition
|
||||||
|
with a within-role library.write grant and library enabled. Closed schemas carry exactly
|
||||||
|
{universe,path,base,content} and {universe,path,base}; base is string-or-null with 40-lowercase-hex
|
||||||
|
pattern. No project, business, author, credential, commit or message. tools.action is library.write.
|
||||||
|
New harness/tests/library-write-tools.test.mjs pins per-role eight/ten names, both schema invariants,
|
||||||
|
no repo/commit/business/accept, exact required/verb/action, nullable base, and missing library/grant
|
||||||
|
or noncreative exclusion. This satisfies sage-3678 and mos-1523's replacement coverage condition.
|
||||||
|
|
||||||
|
Publication's narrow helper now calls indexFor for the new served commit instead of only readLibrary,
|
||||||
|
so the284 lookup index is rebuilt before publication. New broker integration uses library.get's
|
||||||
|
served blob as write/delete base, independently checks served:path, reads the new text/blob immediately,
|
||||||
|
preserves default-canon null, then sees null after delete. No change to284's query behavior.
|
||||||
|
|
||||||
|
### Authorized baseline-test migration, own commit (mos-1523 via sage-3677)
|
||||||
|
|
||||||
|
File: packages/harness/tests/library-tools.test.mjs. Numstat: +4/-4, exactly.
|
||||||
|
The noncreative LOOKUPS assertion at :33 is unchanged. Every existing lookup schema assertion stays.
|
||||||
|
The four old/new lines are:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- ? ['web_search', 'web_fetch'] : []), ...LOOKUPS];
|
||||||
|
+ ? ['web_search', 'web_fetch'] : []), ...LOOKUPS, 'library_doc_write', 'library_doc_delete'];
|
||||||
|
-test('M3: per-role snapshots contain six names, or eight with the C2-08 web grant', t => {
|
||||||
|
+test('M3: per-role snapshots contain eight names, or ten with the C2-08 web grant', t => {
|
||||||
|
- for (const [i, tool] of tools.filter(t => t.name.startsWith('library_')).entries()) {
|
||||||
|
+ for (const [i, tool] of tools.filter(t => LOOKUPS.includes(t.name)).entries()) {
|
||||||
|
- assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS]);
|
||||||
|
+ assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS, 'library_doc_write', 'library_doc_delete']);
|
||||||
|
```
|
||||||
|
|
||||||
|
Additional schema mutant (mos-1523): add `commit: str("caller commit")` to writeBase in tools.mjs,
|
||||||
|
thereby adding it to either/both write schemas. The new-file schema test must fail both its exact
|
||||||
|
property set and forbidden-property assertions. Run on CLEAR and restore. No further assertion
|
||||||
|
change in library-tools.test.mjs is authorized or made.
|
||||||
|
|
||||||
|
All code/tests/mutants remain unrun. No Node, build or syntax check before Sage's named CLEAR.
|
||||||
|
Static diff --check is clean. Scope additions stay listed above, now including indexFor import and
|
||||||
|
call in the previously approved narrow publication helper. E5 implementation is present; review and
|
||||||
|
acceptance are pending evidence, not claimed complete.
|
||||||
|
|
||||||
|
## 2026-10-23 testing and landing boundary (sage-3682)
|
||||||
|
|
||||||
|
Latest complete dependency2845d587a552 (test/docs only over47db04eba) merged intact as f8f79ea2f.
|
||||||
|
Own tool implementation cd2f50dae and separate mos-1523 migration29455c0c5 are pushed; Webby reads
|
||||||
|
E5 and Dewey checks the migration. Static manifest-r1 covered21 own paths at f8f79ea2f.
|
||||||
|
|
||||||
|
Sage reserves first focused runs/RED-GREEN/mutants for T7, provisionally about22:25Z, unless he
|
||||||
|
explicitly frees an earlier lane. No Node before his CLEAR. This is a schedule, not CLEAR. Full
|
||||||
|
library/bus/harness and shell gates still need their own authorized slot; no gate result is claimed.
|
||||||
|
|
||||||
|
Before the gate, incorporate landed refactor after283/224/284 land while preserving every
|
||||||
|
prerequisite. Under the standing add-commits/no-force-push rule, update this published branch by merge
|
||||||
|
rather than rewriting its pushed history. 288 lands last in the chain; no landing is authorized here.
|
||||||
|
|
||||||
|
## 2026-10-23 E5 static closure and N2 wording
|
||||||
|
|
||||||
|
Dewey dewey-0948: the mos-1523 migration at29455c0c5 is static CLEAN, exactly+4/-4, with the
|
||||||
|
noncreative assertion unchanged and new-file schema coverage meeting every condition. Webby
|
||||||
|
webby-0263: E5 closed on29455c0c5/cd2f50dae (f8f79ea2f;98ca25ab1 only BUILD.md), nothing blocking.
|
||||||
|
Both ran nothing; Webby did not read the scratch manifest, so no manifest verification is implied.
|
||||||
|
|
||||||
|
Webby N2: delete inherited the write base description "or null to create". Delete now overrides only
|
||||||
|
that description: "The existing file's blob from library_get; a missing file cannot be deleted".
|
||||||
|
The reviewed nullable-base schema/required keys/verbs remain unchanged. The row's new schema test
|
||||||
|
pins create wording only on write and existing-file wording without create on delete. No further
|
||||||
|
assertion change in the baseline library-tools.test.mjs. No Node/tests run; still await Sage CLEAR.
|
||||||
|
|
||||||
|
## 2026-10-23 dependency283 follow-up (honker-0195)
|
||||||
|
|
||||||
|
Merged origin/honker/row283-build b2a1f4092 intact, fast-forward lineage from46bad7ea3. It changes
|
||||||
|
supporting.test's helper and Honker's BUILD receipts only; no production source changed. Honker
|
||||||
|
reports library98/98, business231/231 and14/14 mutants killed on that dependency head. Those are
|
||||||
|
his dependency receipts, not verification of288's combined branch. No288 Node/tests run; Sage's
|
||||||
|
CLEAR is still required. The dependency's own gate/landing remains Sage's responsibility.
|
||||||
|
|
||||||
|
## 2026-10-23 new candidate after283 landing (sage-3727, honker-0200)
|
||||||
|
|
||||||
|
Created bubba/row288-r2 from the preserved published bubba/row2887c53adf10, then rebased with
|
||||||
|
--rebase-merges --no-update-refs onto93694c5185d0a7f989d2fe78fb620e44599b744e. This supersedes
|
||||||
|
the earlier merge-only refresh plan for this candidate: Sage explicitly requested a fresh branch,
|
||||||
|
not a force-push. Both local and remote bubba/row288 remain7c53adf10, unchanged.
|
||||||
|
|
||||||
|
Git skipped12 duplicate283 commits already replayed upstream. Range-diff of
|
||||||
|
45dca69f6..bubba/row288 against93694c518..bubba/row288-r2 (before this receipt) has35 equal
|
||||||
|
commits,12 dropped,0 modified,0 added. Full output: scratch/bubba-row288/rebase-r2-range-diff.txt
|
||||||
|
under /mnt/storage. The other prerequisite commits retain their patches; row216/224 identities are
|
||||||
|
unchanged where Git could retain them. This is not new verification of any prerequisite.
|
||||||
|
|
||||||
|
Replayed merges had the same launcher-footer and broker/runtime/index conflicts as before. Reused
|
||||||
|
the exact previously reviewed combined file bytes, keeping both launcher test bodies and all lookup
|
||||||
|
and writer paths. Static comparison before this receipt: all21 own manifest paths byte-identical
|
||||||
|
to7c53adf10; all16 other changed paths exactly match93694c518 upstream. These include newly landed
|
||||||
|
226 and coordination/docs changes already on that base, not new288 edits. No baseline assertion or
|
||||||
|
production change was introduced by conflict resolution.
|
||||||
|
|
||||||
|
Sage's base93694c518 is an ancestor of the candidate; old283 b2a1f4092 is not. Static diff --check
|
||||||
|
clean. No Node, test, syntax, build, mutant or gate run. Named CLEAR/T7 still pending;288 lands last.
|
||||||
|
|
||||||
|
## 2026-10-24 static preflight before landed284 base (sage-4282)
|
||||||
|
|
||||||
|
No Node, npm, test, syntax, mutant, queue command or gate ran. Still on bubba/row288-r2,
|
||||||
|
b44152ac6 plus this static follow-up; await Sage's landed284 base before a fresh candidate branch.
|
||||||
|
Do not treat the earlier T7 estimate as CLEAR. Webby remains reviewer.
|
||||||
|
|
||||||
|
### Updated C2-02 brief and contract names (webby-0282 N1)
|
||||||
|
|
||||||
|
Read C2-02 on origin/refactor 95d4991d20a4ef291c824d37c886eaeaa9be7062; current brief blob 85e6fe2ecfc53ed615b7b61aade88ae0cbb222ef
|
||||||
|
(the new ruling is identified by Sage as5e8a720b). Statically checked both the candidate and current
|
||||||
|
refactor versions of all six creative contracts: roles/companion.md, research.md, ideas.md,
|
||||||
|
proofreader.md, fact-checker.md and continuity.md. Every one names library_doc_write and
|
||||||
|
library_doc_delete, exactly the two add() names in candidate harness/src/tools.mjs. No role contract
|
||||||
|
change is needed or made. Exact-name evidence is tool-contract-audit.json in the scratch dir below.
|
||||||
|
|
||||||
|
### mos-1584 fixture audit
|
||||||
|
|
||||||
|
The new row288 harness tests reach businessDoc through resolvedFor, but their callbacks add only a
|
||||||
|
creative role; they add no library business project. library:true is the typedTools option, not a
|
||||||
|
businessDoc project. The broker/runtime/bare-library tests build minimal business objects directly,
|
||||||
|
not businessDoc. The migrated baseline harness test likewise adds no library business project.
|
||||||
|
There is therefore no new row288 businessDoc-with-library fixture requiring a chief-reference edit.
|
||||||
|
The current and future landed-base imported fixtures must be rechecked after the pending rebase;
|
||||||
|
any validating businessDoc fixture that adds a library project must retain/provide chief gitea.
|
||||||
|
|
||||||
|
Shortened only two row288-authored fixture credential values: write-fixture.mjs uses fx288-write,
|
||||||
|
and the runtime test's two slots use fx288-human. Both are11 characters, below24. This corrects the
|
||||||
|
25-character runtime value and avoids an edge at the older23-character write value. No assertion
|
||||||
|
changed, no baseline test edit and no credential file was read. No live credential action occurred.
|
||||||
|
|
||||||
|
### mos-1612 whole-file run-list preparation (not run authorization)
|
||||||
|
|
||||||
|
Static lexer traversed real import/re-export/require and new-URL module-entry edges, skipping
|
||||||
|
comments/quoted fixture code; reverse closures carry a chain witness for every selected test.
|
||||||
|
Used the union of this older candidate and the current refactor source snapshots so newer importers
|
||||||
|
are visible without prematurely rebasing. It selected270 whole test files. Required whole library,
|
||||||
|
bus and harness suites add17 distinct files, making a proposed union of287 (not a narrow grep list):
|
||||||
|
bus115, business2, cli58, harness16, library13, plugins1, processing-control1, seat5, tasks9, webui67.
|
||||||
|
The brief also names all12 scripts/test-*.sh runners. No file/runner was executed.
|
||||||
|
|
||||||
|
packages/cli/tests/case1-accept.test.mjs is explicitly excluded under mos-1592/1612. The11
|
||||||
|
nonliteral-import files have a manual expression audit; all already occur in the import-selected
|
||||||
|
whole-file set. Generated programs and runtime plugin discovery are recorded static limitations,
|
||||||
|
not asserted fully resolved by the lexer. Whole suites and the named script runners retain their
|
||||||
|
brief-required coverage. Regenerate after landed284 rebase; report exact final sha/list before CLEAR.
|
||||||
|
Each approved gate later needs own root/webui npm ci, required editor build, short scratch TMPDIR,
|
||||||
|
whole files and gate skip receipts under the then-current rules. These are plans, not past evidence.
|
||||||
|
|
||||||
|
Artifacts: /mnt/storage/scratch/bubba-row288/static-2026-10-24/
|
||||||
|
- import-run-list.py SHA256 ec18031c87bf6f96b3e794e2e56747bc5e1fe37580de7ce9444c60cd5f18ddc0
|
||||||
|
- whole-files.txt SHA256 b2d6c11349268c347e51a64fe6bf9e7c4d560238a8fc5b5e10f600f1e6e8a39e
|
||||||
|
- import-witnesses.json SHA256 01702657d34c4f2c0635f38741d0a5b57cfdda63d5e96897f188d03971afd5d9
|
||||||
|
- dynamic-import-audit.txt SHA256 42b8721fde783c618e1347f2609ad6e4ae3144f563272f0bbbeb45c34f751018
|
||||||
|
- brief-required-whole-files.txt SHA256 254828414cd9b1b0a785df5c23b7f2b9ea7564d1f85e648899801e46194d135f
|
||||||
|
- proposed-whole-files.txt SHA256 bee666dce2c3f2d0bafe7e963fb443ad356b6ae8719ac3cb8ee413a329578035
|
||||||
|
- brief-script-runners.txt SHA256 02cd25af486c163189977106e055575145bffba688c7836e2a508f5ec91e76d4
|
||||||
|
- tool-contract-audit.json SHA256 bf07865d796b8b0aed85d84c015430ea03468c5331bcaae9eb80efafe1a182be
|
||||||
|
- fixture-audit.json SHA256 436a69a6b8548d8426390e867ed4b0f83693a3116d825c26c6f8a3e788f477d6
|
||||||
|
|
||||||
|
## 2026-10-25 landed-base transplant (sage-4338), UNTESTED
|
||||||
|
|
||||||
|
Named base: 78b69e1e68b2b8a9dc4c02564381a0792c0c7549, including landed284 ce0b6ed41.
|
||||||
|
New branch bubba/row288-r3-landed; published r2 e7c31a90d is untouched.
|
||||||
|
The initial --rebase-merges replay tried to reapply already-landed285 and conflicted;
|
||||||
|
aborted without resolving those conflicts. Transplanted only the twelve Bubba nonmerge
|
||||||
|
commits, in order, onto the named base using cherry-pick. No dependency commits replayed.
|
||||||
|
|
||||||
|
Conflict resolutions (no test conflicts, no assertion changes):
|
||||||
|
- BUILD-LOG.md and docs/SESSIONS.md: preserve the entire upstream side, append Bubba entries.
|
||||||
|
- broker.mjs: retain landed LIBRARY_LOOKUPS and lookup dispatch, add writer verbs/methods;
|
||||||
|
retain the complete landed library.status replyLimits branch after writer/save/revert dispatch.
|
||||||
|
- server.mjs: retain landed refusal envelope including reason, combine project/library save detection.
|
||||||
|
- library/index.mjs: retain every landed export, append the writer exports.
|
||||||
|
- webui cli.mjs and console-bus.mjs: preserve landed libraryRevert and add librarySave alongside it.
|
||||||
|
- runtime.mjs (notice follow-up): retain landed lookup adapter, add metadata-only log sink.
|
||||||
|
All other changes merged automatically. No business role/vocabulary file or dependency packet changed.
|
||||||
|
Baseline test migration remains packages/harness/tests/library-tools.test.mjs +4/-4 (mos-1523).
|
||||||
|
Only additional own-test edit removes a trailing blank EOF line in write-fixture.mjs.
|
||||||
|
|
||||||
|
Line-reference recheck: the sole explicit source-line citation in this append-only packet,
|
||||||
|
noncreative LOOKUPS :33, is still exactly line33 of library-tools.test.mjs and unchanged.
|
||||||
|
Historical fired-chief path4308 described an older broker; current fire.stopped/fire.done are
|
||||||
|
broker.mjs5126/5147 (firing detection863-865). Those historical receipts remain historical.
|
||||||
|
Old head/brief identifiers and T7 times above are historical, not the present base or CLEAR.
|
||||||
|
|
||||||
|
Final import-list audit uses candidate + exact named-base import graphs, eleven changed source
|
||||||
|
modules as roots, and all touched tests; no text grep selects a test. 272 whole files selected,
|
||||||
|
plus17 brief-required library/bus/harness files =289 files. Package counts: bus116, business2,
|
||||||
|
cli59, harness16, library13, plugins1, processing-control1, seat5, tasks9, webui67.
|
||||||
|
All12 current scripts/test-*.sh runners retained. case1-accept.test.mjs excluded explicitly.
|
||||||
|
The eleven nonliteral import expression sites were rechecked; whole parent tests already selected.
|
||||||
|
Generated programs/runtime plugin discovery remain documented static limitations.
|
||||||
|
Artifacts and chain witnesses: /mnt/storage/scratch/bubba-row288/static-r3/.
|
||||||
|
No Node, npm, test, syntax check, build, mutant or gate run. Pending Sage CLEAR.
|
||||||
|
|
||||||
|
## 2026-10-25 first CLEAR and delete-path RED/GREEN (sage-4396/4398)
|
||||||
|
|
||||||
|
Own root npm ci rc0; own webui npm ci rc0; editor build rc0. Fresh TMPDIR from mktemp
|
||||||
|
under /mnt/storage/scratch/tmp. All Node whole-file runs nice19, timeout600 kill-after10.
|
||||||
|
Initial own write.test.mjs rc1,10 pass/2 fail: delete and revert-to-absent hit library-git.
|
||||||
|
Isolated bare Git confirms update-index --force-remove rc128 (requires worktree), while
|
||||||
|
--index-info rc0. First replacement and two delimiter-investigation reruns still rc1,
|
||||||
|
10/2: runGit's stdin argument names an input FILE, not input text. No pre-existing test
|
||||||
|
ran or was edited. Final correction writes a private NUL-delimited removal record in the
|
||||||
|
already-cleaned staging dir and supplies that file to update-index -z --index-info.
|
||||||
|
Whole write.test.mjs now rc0,12/12,0 skipped/cancelled. Source-only fix in owned write.mjs.
|
||||||
|
Logs remain /mnt/storage/scratch/bubba-row288/gate-r3/ (write-fixed through write-fixed4).
|
||||||
|
Sage4398 authorizes this fix and requires committed new candidate + driver restart from
|
||||||
|
first whole file. Focused green is not the complete gate; remaining acceptance pending.
|
||||||
|
|
||||||
|
## 2026-10-25 new broker-fixture RED/GREEN, driver restart pending
|
||||||
|
|
||||||
|
Candidate7932c979a driver first library file rc0,12/12; second own bus library-write rc1,
|
||||||
|
0/14 (fixture FK and undefined dataRoot). Own fixture lacked gitea_users parent; insert
|
||||||
|
with valid16-hex nonce, consistent with landed credential tests. First attempted fixture
|
||||||
|
nonce was invalid and INSERT OR IGNORE hid it; corrected nonce, no product/schema changes.
|
||||||
|
Every bare.dataRoot reference was undefined: use bare.context.dataRoot. After these fixes,
|
||||||
|
whole file rc1,13/14, last assertion assumed lines were strings; query returns [line,text].
|
||||||
|
Corrected this row's new assertion to exact [1,'new served text']; whole file rc0,14/14,
|
||||||
|
0 skipped/cancelled. Intermediate logs bus-fixture-fixed{,2,3} under gate-r4 retained.
|
||||||
|
Only owned new bus/tests/library-write.test.mjs changes (+14/-12); no pre288 test changed
|
||||||
|
or failed. Commit this fixture correction, then restart all289 whole files from the start.
|
||||||
|
|
||||||
|
## 2026-10-25 creative typed-tool fixture RED/GREEN
|
||||||
|
|
||||||
|
Candidate4fb11e74a restart: library write12/12 rc0; bus write14/14 rc0; own harness
|
||||||
|
library-write-tools rc1,0/3 before assertions: new creative role fixture omitted the
|
||||||
|
Gitea credential reference required by landed285. Added the same fixture reference copy
|
||||||
|
as landed library-tools.test.mjs (no credential file read); no assertion changes. Whole
|
||||||
|
own harness file now3/3 rc0. Only new owned test+BUILD changed. No pre288 test failed.
|
||||||
|
Commit and restart driver from first whole file again; gate still not claimed green.
|
||||||
|
|
||||||
|
## 2026-10-25 completed candidate gate (sage-4396), SLOT RETURNED
|
||||||
|
|
||||||
|
Tested candidate2848d832e (three additive fix commits after requested8a47c462a).
|
||||||
|
Driver restarted from first whole file after EACH fix. Positive gate-r6: all289 whole
|
||||||
|
files rc0,2604 pass/0 fail/0 cancelled/1 deliberate FED R7 skip. Full required suites:
|
||||||
|
library168/168 (13 files), bus1035/1035 (116), harness180/180 (16). Other selected:
|
||||||
|
business25/25, cli619 pass/1 skip, plugins8/8, processing-control7/7, seat69/69,
|
||||||
|
tasks95/95, webui398/398. Case1 acceptance excluded. Final import graph regenerated on
|
||||||
|
2848d832e in static-r6: whole-files.txt byte-identical to static-r3 selection.
|
||||||
|
|
||||||
|
All12 scripts rc0: test-auth,conductor,config,discord,extension-package,
|
||||||
|
federation-acceptance,foundation,land-work,push-check,queue,release,task.
|
||||||
|
FED R7 dedicated runner covers ordinary-suite skip. Queue wrapper28/0 and node156/156;
|
||||||
|
canonical-root verify/render check deliberately skipped in this linked worktree.
|
||||||
|
Root/webui own npm ci and editor build rc0 before runs. All tests nice19, sequential,
|
||||||
|
whole-file timeout600/kill-after10; scripts timeout1800/kill-after10. Fresh mktemp TMPDIR
|
||||||
|
/mnt/storage/scratch/tmp/ for each restarted driver; no /tmp test root.
|
||||||
|
|
||||||
|
Six mutants killed (each rc1), restored positive whole files each rc0:
|
||||||
|
- M1 supporting checks removed: broker M12 refusal assertion.
|
||||||
|
- M2 forced push refspec: unrelated-blob retry/new-parent and guard assertions.
|
||||||
|
- M3 forged owner token: missing expected rejection in exact-token test.
|
||||||
|
- M4 beforePush grant recheck removed: held-during-fetch expected rejection.
|
||||||
|
- M5 notice after publication: E4 exact notice and failed-store assertions.
|
||||||
|
- M6 caller commit in schema: exact property-set schema assertion.
|
||||||
|
Source SHA256 restored after every mutant; git status clean afterward.
|
||||||
|
Captured logs across all four run attempts scanned for both fixture credentials:0 hits.
|
||||||
|
No pre288 test failed; no pre288 assertion changed beyond approved mos-1523 +4/-4.
|
||||||
|
|
||||||
|
Per-run rc and log hashes: gate-r6-results.tsv; counts: gate-r6-summary.json in this
|
||||||
|
packet. Full logs, mutant diffs, drivers and JSONL receipts under
|
||||||
|
/mnt/storage/scratch/bubba-row288/gate-r6/. Earlier RED/intermediate logs retained in r3-r5.
|
||||||
|
Slot-returned report sent to Sage as bubba-0034; no further tests after slot return.
|
||||||
|
|
||||||
|
Review notes to carry into request (webby-0296): N1 baseline library-tools.test.mjs73
|
||||||
|
still says tool names unchanged while the pin gains writer names; retained to honor the
|
||||||
|
narrow +4/-4 permission. N2 librarySave is dispatch plumbing only; C2-11b owns the route
|
||||||
|
that consumes it. N3 sync comment omission is cosmetic and unchanged from reviewed r2.
|
||||||
|
Commit-count correction: r3 initial head8a47c462a had13 commits, twelve transplants plus
|
||||||
|
receipt (BUILD +36, SESSIONS +2, fixture EOF -1). Current tested head adds three fix commits.
|
||||||
|
Formal manifest review/gate acceptance and landing remain Sage/Webby stages, not claimed.
|
||||||
@@ -0,0 +1,308 @@
|
|||||||
|
kind name rc restored_rc log_sha256
|
||||||
|
whole-file packages/library/tests/write.test.mjs 0 e0f6a09b70316beebbf33966b35bfd05b4a12b587744dadc9239bd28de1b976c
|
||||||
|
whole-file packages/bus/tests/library-write.test.mjs 0 e0e9e609b20ea0564a7611046026cbdfd007832e0eb13507798e958d8d106ef0
|
||||||
|
whole-file packages/harness/tests/library-write-tools.test.mjs 0 c8a3a493d1d2abce785e94fdda5b1732e8d4a5e6eb19767af1b7e8b5e560cf3b
|
||||||
|
whole-file packages/webui/tests/library-write-options.test.mjs 0 2491eb6a01a0b4b2127bcb6a87a5dc778d079b7d1ea445509a1dffc49dea9051
|
||||||
|
whole-file packages/bus/tests/access-revoke.test.mjs 0 a1b317bb687e8c369440f5481b4ef309615afb5a5922fa306980d2024019e544
|
||||||
|
whole-file packages/bus/tests/account-migration.test.mjs 0 e697b58a1bb9b37c609b441fe786e557c7f0279e7a31eea791483ce4567db318
|
||||||
|
whole-file packages/bus/tests/address.test.mjs 0 977f755d29a8e75578d0bef48ec40b7045736014b2e53e15a03cdb6dd39696d8
|
||||||
|
whole-file packages/bus/tests/agents.test.mjs 0 3e8116bad1ab5594e627ba3e9f5403414885959935bcd9e6f75f1af4c625d4b0
|
||||||
|
whole-file packages/bus/tests/approval-binding.test.mjs 0 d2fbee516b57857f3a6562427d2a08bd7fdb772aacabd33ebd9d2990f01ec7fa
|
||||||
|
whole-file packages/bus/tests/broker.test.mjs 0 400e7f0616bc7432d8cb2a9efbae3c84d5b44ef59ce7f8fbebd4c802e2a9f44e
|
||||||
|
whole-file packages/bus/tests/business.test.mjs 0 f42502884a158ed1d190b37b3884e19d44547ececf068f91765b8ad15faffba3
|
||||||
|
whole-file packages/bus/tests/channel-proof.test.mjs 0 3984a7e2da2a60e60d0309f719a45a3ef04bca767bac34e00a760e19e941d732
|
||||||
|
whole-file packages/bus/tests/chief-of-staff.test.mjs 0 8dd57acf0101d4c92ada92f4c33f68061d4e2cb430179a8ab99a0b7fc9a19997
|
||||||
|
whole-file packages/bus/tests/citation-availability.test.mjs 0 d34d84d44b5949024ce6b32708c68e10b00a84600bb03598bf9538b358750455
|
||||||
|
whole-file packages/bus/tests/citation-guard.test.mjs 0 acab66e65fd41f1fbfd9524f80456553fc033d8bfc18a9bec7a813bd0d4552d8
|
||||||
|
whole-file packages/bus/tests/citation-runtime.test.mjs 0 ce33310d333c7a0af7451c3a3b610f5178961b80b6b63a839909b67657fd161e
|
||||||
|
whole-file packages/bus/tests/comment-cursors.test.mjs 0 cd4de90a070faf2bdb776a96a6ba43aa4854f6f5f1b2b7459740bd7bdc0ffb7e
|
||||||
|
whole-file packages/bus/tests/comment-migration.test.mjs 0 773659855873805b5bd950101d950945213658fde42d8012211e742ba9ddcc09
|
||||||
|
whole-file packages/bus/tests/console-decide.test.mjs 0 275fc0a24a03f2f27210a65e2bd21ce615ec9b6b400c4e4177ddb97a9e8e85be
|
||||||
|
whole-file packages/bus/tests/creative.test.mjs 0 eb950d5680ff7e4e09a9c11b1c169d4a740011ea72bb75921d35571ef5373df2
|
||||||
|
whole-file packages/bus/tests/credential-claim.test.mjs 0 b2d40e4d2a353f4154af4974d5779f7b20c652a8110da3183f95959ae2540941
|
||||||
|
whole-file packages/bus/tests/credential-status.test.mjs 0 ed367e3d123c9629b7d3d22f6fa60f48c74e71b36982c54ad2b3e8419f515431
|
||||||
|
whole-file packages/bus/tests/credential-store.test.mjs 0 0fd528ba27757393973cba5b21da573bc681659416962bf7d3a3dff3018414af
|
||||||
|
whole-file packages/bus/tests/credential-verbs.test.mjs 0 154b123af420abf08c6ab8b7bc6439052e7ab65c772abb0caac5e9b9cd3608e9
|
||||||
|
whole-file packages/bus/tests/credentials.test.mjs 0 6474b45c076f474a6881d0dddd0cd3b4cd385d52ac4c55ef1a9f8c10e0028277
|
||||||
|
whole-file packages/bus/tests/csuite-messaging.test.mjs 0 c0229df65240be8ad014d83def48dbd64a952b701f46e40ff01efdebb5644d6a
|
||||||
|
whole-file packages/bus/tests/daily-quota-runtime.test.mjs 0 62d686aa1852088af569cd3b921194db6873311f2ba04e55b15a93900b1615cd
|
||||||
|
whole-file packages/bus/tests/decision-close.test.mjs 0 9599744860a4e6e330ce50b8e93c478546edce5545a9171bed068743a266ae5c
|
||||||
|
whole-file packages/bus/tests/decision-route.test.mjs 0 2b2a9570dab83b1d454f56c1311cb41103a14bcff49e207cbb4ac5d4c73d6f0f
|
||||||
|
whole-file packages/bus/tests/decisions.test.mjs 0 a753df7d939155adf13c7177926728b2760cf61770117dd1655f29fe2c88a26f
|
||||||
|
whole-file packages/bus/tests/end-launch.test.mjs 0 ff7a27c35e35be424cbefa799e219ffc073c494214642b4ce56ceed6b359335e
|
||||||
|
whole-file packages/bus/tests/fire-revokes-grants.test.mjs 0 8e6bee9421480af8a1326d65903f258d5ea0a79df6188bf18301f32a5260547e
|
||||||
|
whole-file packages/bus/tests/gitea-grant-docker.test.mjs 0 8b639ee86d1a7d2ef267e1d36264f4ce1b5beed2c8ce084c39c0de1d699ca8a0
|
||||||
|
whole-file packages/bus/tests/gitea-grant.test.mjs 0 8fa39b3e58cfac4ec97f02ff876fde1a40a1894c826306c0b77d45c73586f753
|
||||||
|
whole-file packages/bus/tests/gitea-migration.test.mjs 0 689fb43a38718f5f5d00ffb3b6d998d5d454854d5e77a936b56d7c4192ee12e9
|
||||||
|
whole-file packages/bus/tests/grant-enroll.test.mjs 0 a8be59931d37a5c787c2087d29d766d6b701bbe34f8343134148292cd29d345c
|
||||||
|
whole-file packages/bus/tests/grant-executor.test.mjs 0 0a7f5be29b28140c9f8e7f67c6a897eb455677fba4459952a83982f2b23c87e0
|
||||||
|
whole-file packages/bus/tests/grant-host.test.mjs 0 54c4ed722116914221e9320fd41723e32aad59284e98d8e177130b0f4c4fe6c4
|
||||||
|
whole-file packages/bus/tests/grant-migration.test.mjs 0 7cfaa3f24d1dc070d7bdb8de76b08fabcdb6877d3367c59f7601e08f683d658b
|
||||||
|
whole-file packages/bus/tests/grant-scope-runtime.test.mjs 0 f8bccf5324f1e10282dfb4f4fd0f63c76c8e9481ae6cc0845a1d9028e3d9633e
|
||||||
|
whole-file packages/bus/tests/grant-scope.test.mjs 0 e30a8ced066ad214a6f70dd4a39c75bacf296032a3201e4605fa3c8df23e0159
|
||||||
|
whole-file packages/bus/tests/hard-waits.test.mjs 0 78d92a14781286d3ca11989786a8698a2b796ad1db78769fd5b3c7653ad7639e
|
||||||
|
whole-file packages/bus/tests/host-run.test.mjs 0 51d231611940444d2c2a37fbb7b14267c705c1b5e453b02367d0a6def214dc93
|
||||||
|
whole-file packages/bus/tests/host-tools.test.mjs 0 3bc5b5413661edd2026bca1721055ec7dce8d115918cc10c8f334e527176d23b
|
||||||
|
whole-file packages/bus/tests/human.test.mjs 0 5c8f3fd402ae4e130029b3203ed41b3cb45b8781417d31dec1f47ebddd516349
|
||||||
|
whole-file packages/bus/tests/instances-verb.test.mjs 0 940ca3884930f539272a2c39ca7e1c7fa3e51b3a4ea6fdcfb21719c652152257
|
||||||
|
whole-file packages/bus/tests/interpreter.test.mjs 0 d0c6190a428005b7750b59e665968657b242b322af05ca7bdd4cd7e815b7f4ab
|
||||||
|
whole-file packages/bus/tests/land.test.mjs 0 e9ecd1d8011ab6789fc3254bb069e76631b68b20ad65ae844ee12e0dc3b97cb0
|
||||||
|
whole-file packages/bus/tests/launch-notice.test.mjs 0 750a54d4c40559c7fb5414071bace8056d6bfa71dfdbec4de12c94c90299c3c5
|
||||||
|
whole-file packages/bus/tests/launcher-released.test.mjs 0 4d59486ca3077a4b2f51141ab79df635feb6b7bca2d6c0cfe5839a6a93715de6
|
||||||
|
whole-file packages/bus/tests/library-credential.test.mjs 0 db7e2dc4afe23f74c49795e4dcd3d28414435519029a837641cbb35bd3f4fcef
|
||||||
|
whole-file packages/bus/tests/library-lookups.test.mjs 0 fa18b5d4c829ec35ebbf519c4346a2ac38cff7538d58ea663acbbdd7930a6015
|
||||||
|
whole-file packages/bus/tests/library-sync.test.mjs 0 ee0ab1ad2549d3e6ae6d8123fa99d697d9be6c629e09131da82f0ab6d58a60e2
|
||||||
|
whole-file packages/bus/tests/library.test.mjs 0 62b663034a5de8d6d1abfaf3f94327d7aae435e3350874b424eefdb28bca1bd1
|
||||||
|
whole-file packages/bus/tests/lifecycle-revoke.test.mjs 0 c0810c743b5108773b6cfbc2d108fa09ea274c437433355277ce2b1295fbf692
|
||||||
|
whole-file packages/bus/tests/lifecycle-verbs.test.mjs 0 926bcfb20ab58a4ecbe85b4f8feb915f72adcdc6d6aee84f814187d0ac998efd
|
||||||
|
whole-file packages/bus/tests/limit-checks.test.mjs 0 919d745dc570172716b1e06d0ea1e8f16ae7b05dbadba77fe92dbbcc8eb4cba7
|
||||||
|
whole-file packages/bus/tests/limit-stop.test.mjs 0 2fc1ebee4e4d4862a100ed9ba97ace1e6d3fb3c608abea63b1ff634a04d5649a
|
||||||
|
whole-file packages/bus/tests/limits-runtime.test.mjs 0 5845176b73f98a499d92096ce0d22a3987ada664a529bdbb26230c2d00b9e65c
|
||||||
|
whole-file packages/bus/tests/limits.test.mjs 0 333f6757d9d00eda74e7d4641af660c9a0ce3d978e6a8550139d3a461c1d5866
|
||||||
|
whole-file packages/bus/tests/message-citation.test.mjs 0 38422c1d6faf076c750c3fccb7e927e38fe955cc28778511acccf5704df5b191
|
||||||
|
whole-file packages/bus/tests/message-filter.test.mjs 0 2ba52728df27756ac19ba65fe0705e7cf7a2a786a3b4df77a4eb4eec8072604c
|
||||||
|
whole-file packages/bus/tests/messages.test.mjs 0 b87de4ab04682d59a2faa7b3fc64751247454e628e9c1ebd4c07b1df2acbf11c
|
||||||
|
whole-file packages/bus/tests/messaging.test.mjs 0 831b48a9de594e17e8fc47f16ab8c2d722e8d57068a7d39deeaf4c0fa8d136bb
|
||||||
|
whole-file packages/bus/tests/model-proxy.test.mjs 0 99c5128733ae5bb16489171513c158ec1e34dfce1d07c60f6bccb0f84ab7afb9
|
||||||
|
whole-file packages/bus/tests/name-migration.test.mjs 0 bb8f92a17f6a022c7ec63161cccc0bb49a26c2a591fc369375cbebfa93a277a2
|
||||||
|
whole-file packages/bus/tests/names.test.mjs 0 0fcf60cc8c7dee3e85548c759f03e1792de92b59131bb9fe4282a3b07859366c
|
||||||
|
whole-file packages/bus/tests/peer-transport.test.mjs 0 3cb547003e50695ec2a25c950819b304f15203302281c00758a12c9b89b60f40
|
||||||
|
whole-file packages/bus/tests/peercred.test.mjs 0 e75c700a68ba0c1013c8f36178d6554f0321dc331b2198fd5ffc1a684df76c3e
|
||||||
|
whole-file packages/bus/tests/plugins-verb.test.mjs 0 359fef350befd1d743bcca89a96ebd0757346fd7c0622ba364039ba827620d26
|
||||||
|
whole-file packages/bus/tests/principal.test.mjs 0 732724e6bb2bb953e7dbbbae5c23cc0a1c33a7b7b202f5cb8b46be9363bcb392
|
||||||
|
whole-file packages/bus/tests/process.test.mjs 0 9c5883ea2ca858131317fa9be66d2a51a5d86dbe03c515b0544f4db56b2456a1
|
||||||
|
whole-file packages/bus/tests/processing-runtime.test.mjs 0 bb6b94ac654d069abd6e484031893e649e239d933c135b226d1cb2fbd5a94ca9
|
||||||
|
whole-file packages/bus/tests/processing-timeout.test.mjs 0 323036aa7f32f7aa324f61595531a29f3d5ef0ae2c24aec029842f2783d6be76
|
||||||
|
whole-file packages/bus/tests/processing-web.test.mjs 0 dbd1543498fbc8d0625990436ae668b3a382eedeecd098b929c13d2bb61939ff
|
||||||
|
whole-file packages/bus/tests/processing.test.mjs 0 529ec93e767444970ff03acb1ba719b45033daac239256c9cbd587c39f926a71
|
||||||
|
whole-file packages/bus/tests/project-await.test.mjs 0 e948d721ef06ce95f909880942f7e7ebd73b2f42563e1faedacc7b403b8ebedf
|
||||||
|
whole-file packages/bus/tests/project-files.test.mjs 0 3691b04705c17d4ef7218bc15771560aca5586c00ba0fd3fdf2a80f63d8dc659
|
||||||
|
whole-file packages/bus/tests/project-runtime.test.mjs 0 9d8d6cedeb2044f19e548dda0e32cae1e997b75a6d89072f7367b6e0ce17a44f
|
||||||
|
whole-file packages/bus/tests/publish.test.mjs 0 87f7a382580432646ca89d1228377719cb177bfdbb4f74ad617f6a70dbfb4b33
|
||||||
|
whole-file packages/bus/tests/reload.test.mjs 0 25aa45aca6ba24d72e9e5ad66dfc8c049375c8df121dd748dde09af52f16f853
|
||||||
|
whole-file packages/bus/tests/replies.test.mjs 0 0f05dc2194896540a1488310107e31b7e779cc02c381c201d0c95f69ab39fc51
|
||||||
|
whole-file packages/bus/tests/requirements.test.mjs 0 29569dc30659dbecf359117cc9a59ff37927c60f5514b8ceb8d3796c2c3e53d1
|
||||||
|
whole-file packages/bus/tests/review.test.mjs 0 a8daea8602be9429a8044ad636a438c18eee8ec77b6fa272dce606116d01de8c
|
||||||
|
whole-file packages/bus/tests/revoke-window.test.mjs 0 1435c543c9367204f4ae6d25c2cb97145e762cb18e78ea90a15eb1672a220353
|
||||||
|
whole-file packages/bus/tests/room-check.test.mjs 0 bbe5ac7abfb7e1b30f6fc8f9a247cd28aca82a8783753434339b790dd9857e1c
|
||||||
|
whole-file packages/bus/tests/rooms.test.mjs 0 506fad116ab1d9bb2520fe691adc91ca26e64faa96ced35c193cb11da4e07ccb
|
||||||
|
whole-file packages/bus/tests/routes-verb.test.mjs 0 c09fef3cb022bf7713cde4e1c512feefe67090eff05451fda9f55272140c916e
|
||||||
|
whole-file packages/bus/tests/schema.test.mjs 0 2a1a668dc408aaebe6f604ec5c3b8858211edc52930e1a552173cecedf806d72
|
||||||
|
whole-file packages/bus/tests/session-clear.test.mjs 0 1fce03f1d2a41f5ba294e9d406980a1d3251bc9a5dd4a02897413d6be3d9681c
|
||||||
|
whole-file packages/bus/tests/session-compactions.test.mjs 0 745510273a9eaaf61de4c6453c5dcc70e4a6020c0bcec69673621eefa593dab7
|
||||||
|
whole-file packages/bus/tests/sessions.test.mjs 0 d6c0337e0981ecb9aae2e912c27145bbd831e196828b2d59029666ceae5f605c
|
||||||
|
whole-file packages/bus/tests/single-use.test.mjs 0 6f5cf7d47716ce94eccb069f9b7e5625c3587737921231649fc74e8bfd3aad3c
|
||||||
|
whole-file packages/bus/tests/spec-migration.test.mjs 0 ede4ca62a772261bc868f4dfcb4861c9c3670110ba2afd39cc44183398c2eafd
|
||||||
|
whole-file packages/bus/tests/spec-review.test.mjs 0 951aa2a54cfe4bf0960dd3d2180874cb8183ff9b0aee7b7251b05df11385e1a5
|
||||||
|
whole-file packages/bus/tests/spec-socket.test.mjs 0 65735a2557e19b3d63a3ce7198c80fb5059f1974acd0708a89f192857b43b095
|
||||||
|
whole-file packages/bus/tests/spec.test.mjs 0 488ab443b41b06b6ae4434f5b2ee8904169aa08ab3527f3ae4c3f438e54f9909
|
||||||
|
whole-file packages/bus/tests/staff-request.test.mjs 0 edeb4ceffae3af33e330e1fac5d74c4fb1861d52ec5ac5005689791ab74da555
|
||||||
|
whole-file packages/bus/tests/state.test.mjs 0 3b5f916c494563fc7c18f89450e0cecbbdad8e24680b373e897253b9ea6064fe
|
||||||
|
whole-file packages/bus/tests/store.test.mjs 0 39d0a4033b89eff9b29ea6dcf6e56696a1d20a41e0e14b4bc8efbfae7962ecf4
|
||||||
|
whole-file packages/bus/tests/task-page.test.mjs 0 6446cfc1a43cb4206b4130f316251d3d9a820f929a6efc59dc74e7cbe1fbd258
|
||||||
|
whole-file packages/bus/tests/task-read.test.mjs 0 37134ced43ad5ada4291ad5e3474dcf7063892443b06d54a7456cd4cddb9cf2f
|
||||||
|
whole-file packages/bus/tests/tasks.test.mjs 0 9d91ee510a7447545c2cf93ae6779544a05e01bb70346e595b91a4800fa42d7b
|
||||||
|
whole-file packages/bus/tests/tester-threads.test.mjs 0 ff843610e02f20c5e1ab19de27b131ae7cbc3fd87b16d85e68336b5e914ffd77
|
||||||
|
whole-file packages/bus/tests/tester-writes.test.mjs 0 517c41e666d2c59b7ffb6ddb22898ef58b816bb26eaa47e1ce7508087b607df5
|
||||||
|
whole-file packages/bus/tests/tester.test.mjs 0 19eff6ddb3aca05ad5c006ac15e7860311f56941055850e86b8075cd39eff0d1
|
||||||
|
whole-file packages/bus/tests/thread-claims.test.mjs 0 ee146e984bb3ae82ad60f90c83035053ff2966ffea91015b6c3c4f93b7e019bd
|
||||||
|
whole-file packages/bus/tests/thread-migration.test.mjs 0 1dc2ae4e920d40a6fc2b1033f43ac0a2f766bfb86f07a596a983b9c1bccf87d5
|
||||||
|
whole-file packages/bus/tests/thread-shares.test.mjs 0 3f99a82e9e4a43fa788ebb231c5e712969809fa83b6ca66f04b8cad13f411235
|
||||||
|
whole-file packages/bus/tests/threads.test.mjs 0 2e5ba2be69a34c71f41a819c7a5e8615fcd085f847f9aa6d16095b9c8d742552
|
||||||
|
whole-file packages/bus/tests/transport.test.mjs 0 c9d28b9acfc0c2213838df0d960506156ef6fffec24a0cee7336324f105fac0e
|
||||||
|
whole-file packages/bus/tests/usage-broker.test.mjs 0 26fc080c6ffcb7c64cca39a07f302b59c21d1425ca3c90120eb3d3bb751c49da
|
||||||
|
whole-file packages/bus/tests/usage-migration.test.mjs 0 cfc65c4233aedb325293170e782ccb83fcfdd85cc4afed1e913e91785fa4b7cf
|
||||||
|
whole-file packages/bus/tests/usage-runtime.test.mjs 0 faa5fce30cbd7002137acfca3cde68b49b74321fb27b8a190736b35601430866
|
||||||
|
whole-file packages/bus/tests/usage.test.mjs 0 d36d21e0b3f5c9621b50e8b71ff6d8daa341f5954f3612b7cc93cb6c734215c0
|
||||||
|
whole-file packages/bus/tests/user-principal.test.mjs 0 1b56d881de2975ec4e3bc27fa15bc495ae0600709457da579337f0c9c98651e5
|
||||||
|
whole-file packages/bus/tests/viewer.test.mjs 0 942ba4fd96c3bb4c527eb129e69ddb5cb7660915e8458cfee47661d268db0e24
|
||||||
|
whole-file packages/bus/tests/web.test.mjs 0 048e3ef2840934f95d7e00de6502b19342215cfe5d00d1b8ada7c1bc6e87cfa1
|
||||||
|
whole-file packages/bus/tests/workflow-roles.test.mjs 0 1bed1351ec3c50ddce65f9b8108f93a5c4061ef5cf36f3d09706d85b13e085ed
|
||||||
|
whole-file packages/business/tests/case1-business-file.test.mjs 0 4481abbce73eae119fbedc5edf65120fa494931913aac6f0273b04263c251cc9
|
||||||
|
whole-file packages/business/tests/launch-settings.test.mjs 0 540f5170ddc7e79a8abd9584c4586eade3ecc1f7544489060db99552c75e4685
|
||||||
|
whole-file packages/cli/tests/access-boot.test.mjs 0 e41e1f1949d3568f8845234d573282c18a185578389d6947140cf540d7f99dc8
|
||||||
|
whole-file packages/cli/tests/access.test.mjs 0 9e2a813092ad4b60cd89443424eb4142f217265e52ff7b769b7f16d247d5a367
|
||||||
|
whole-file packages/cli/tests/app.test.mjs 0 5f5244ba0061dc4ffd1565c4abd3168d7cb2e6398625b69c841a54544b9a35a7
|
||||||
|
whole-file packages/cli/tests/boot-status.test.mjs 0 ca090577e20ea46315cb377668e309571380e2323c867a8b90d0537022e681b7
|
||||||
|
whole-file packages/cli/tests/case1-hostcheck.test.mjs 0 403e1127da5637904e8fe1c1eed5a7865c5bd5ee1c5d0fe684837a7370c41de4
|
||||||
|
whole-file packages/cli/tests/case2-install.test.mjs 0 df8edefe13297ced929d09f01eec5c7ecf38c355d9871368cb19f2f392ae057a
|
||||||
|
whole-file packages/cli/tests/case2-persona-import.test.mjs 0 5dc7a93c03567ec0e85e43bcafe07109881c30b2e83b4c4eab4631a155daece0
|
||||||
|
whole-file packages/cli/tests/case2-unit.test.mjs 0 39b349dfd3125e74b780ce28e9ec24465a6a8c2bb9e431c819864f4eff1fdb77
|
||||||
|
whole-file packages/cli/tests/channel-cli.test.mjs 0 9fd9c30aa604f77b7a069912cb987293af36f2f138cce850f8d26946f5ce42cd
|
||||||
|
whole-file packages/cli/tests/channel-recovery.test.mjs 0 52c6bd980cd54ef22b9e6c78260a1e389e8177526340129ac64fbafa7f2e01ab
|
||||||
|
whole-file packages/cli/tests/cli.test.mjs 0 59327fd89e3fb8f927210df6a2c62afe4522e59f59129b1967be2a238c498f26
|
||||||
|
whole-file packages/cli/tests/compactions-launch.test.mjs 0 c9006b3039a6616be1816f5ce85bf68ba4fb54dadf10447e52fc92f7ed57bbe5
|
||||||
|
whole-file packages/cli/tests/config.test.mjs 0 35e39fb0551e23f5738d0c30d66bd233f2290040885c511e526f0f0468b31cad
|
||||||
|
whole-file packages/cli/tests/credentials.test.mjs 0 2b55cde2318a034ec4152e712863ac54f07f1b4db752c6282507d7f621bde67d
|
||||||
|
whole-file packages/cli/tests/federation-acceptance.test.mjs 0 cca971a93a5dfd20e603b45cc2158b58ea0638e8bb7a33e6e0c5e12178ffa3df
|
||||||
|
whole-file packages/cli/tests/follow.test.mjs 0 26a3ad0dbc124aff48a5f4908e3d8b78cb871e5560c0e389de457f58aea2dfe3
|
||||||
|
whole-file packages/cli/tests/git-socket.test.mjs 0 10c21c34a79ebd5f89f6ed9182a492e9f42f0512a68f758c0566a763a84abeb9
|
||||||
|
whole-file packages/cli/tests/grants-scope.test.mjs 0 37967ca8e82a89a0e88ed872fa562b5c094282cc759853b6dc31c292204bef3c
|
||||||
|
whole-file packages/cli/tests/grants.test.mjs 0 687af745932625ea1d439a8139c760f14b4a327bf9b15c5b5b1cdbc7ea6be09f
|
||||||
|
whole-file packages/cli/tests/host.test.mjs 0 50010e97e44392f28006bbd4127146b8aa1712ff4a016ca10864923701213dce
|
||||||
|
whole-file packages/cli/tests/hosts.test.mjs 0 d5d507c3968c45b2aa25067d6bbb1eedd69785c0aa1bb51177c63b6ad64fcb53
|
||||||
|
whole-file packages/cli/tests/idle-stop-race.test.mjs 0 8e6171855003b0f40921863430dc89cf20f8bbf14a9ce3c115f90486f08232b5
|
||||||
|
whole-file packages/cli/tests/instances.test.mjs 0 c6b4d59443baa4af029af76a846a8093669a7593490f21408a2c40ad027acccf
|
||||||
|
whole-file packages/cli/tests/launch-account.test.mjs 0 6cb63446fc8dbb6217e6d925caabb37a28bcf1ea5c27cf8d515d67c7842553b8
|
||||||
|
whole-file packages/cli/tests/launch-limit-checks.test.mjs 0 fae971d715a90d1dbbeb3c054932a02d253e0a0d036d3b0db4e0c9edcd5ad7ef
|
||||||
|
whole-file packages/cli/tests/launch-limits.test.mjs 0 d3f4b2c57e776bf6bbcafba6dbd9c4728918b0d81fc606dcd7d2dffefdad4001
|
||||||
|
whole-file packages/cli/tests/launch-routes.test.mjs 0 e2bec020f96238079908c03537366c64800de0913a83f3a2877606d0266548d6
|
||||||
|
whole-file packages/cli/tests/launcher.test.mjs 0 beafda99d34a532f3a1d6f96565b7a780e03924939b6c30b01a8169cceaa792a
|
||||||
|
whole-file packages/cli/tests/lifecycle.test.mjs 0 014a2cea6d3f2a9f21f7fc16dc68b34740b03726612851047b877f8c1194ebe0
|
||||||
|
whole-file packages/cli/tests/limits-tokens.test.mjs 0 6fdf9e6946dfb579cde42ec500d8cb8473a9d8318f43caecee7561a5e40fdec1
|
||||||
|
whole-file packages/cli/tests/limits.test.mjs 0 bc2f13959d087ccaf6977c4cf1294e6fcee21f968677ab169580ce79643add18
|
||||||
|
whole-file packages/cli/tests/mark-read.test.mjs 0 64864c54ab910488d55136b88f351771489cf744ba1c21e5c479121694dd88ab
|
||||||
|
whole-file packages/cli/tests/model-proxy.test.mjs 0 119a5d02870a4062992efba7f44ee9dfe69ecf8a7076f121aa24a8c7edf24cf0
|
||||||
|
whole-file packages/cli/tests/names.test.mjs 0 c2160aeb0c68855f59b5d97dc3b6101b7800028df708f5f42430ae5854eb23e2
|
||||||
|
whole-file packages/cli/tests/notifier.test.mjs 0 18e62f48de18cc4d57916a556adeb3befb13921d5d7b036ef5a7f2bfa460cdc1
|
||||||
|
whole-file packages/cli/tests/optional-tracker.test.mjs 0 e5adddfee06b2f1cbd2ec50caf84b5acbc58d4ff4ec4c1bc539a4535a3991827
|
||||||
|
whole-file packages/cli/tests/other-tree.test.mjs 0 2dae57af2b8d508f2792ce37191aebf0cd28ad75f7621d4ab9f8d6daa60b748f
|
||||||
|
whole-file packages/cli/tests/processing-cli.test.mjs 0 44b2854ba03810cdda3ccf0c6de883f953089d532bfcdc8f4bdd3faffac80fe9
|
||||||
|
whole-file packages/cli/tests/project-name-repo.test.mjs 0 0468b9ecde6189d1398eef2e7e8043e870aa867a8a9d22b20b2ded26dc1543b5
|
||||||
|
whole-file packages/cli/tests/project.test.mjs 0 79e648106151ca220d9535b16c416dfdcffffaed41e3c211e4325c151f0775f7
|
||||||
|
whole-file packages/cli/tests/publish-socket.test.mjs 0 59a02b1fcc284407b06d0d2df8e6e1e5323059daa2e47c690f30a718d1e7c682
|
||||||
|
whole-file packages/cli/tests/reply-limits.test.mjs 0 554a353d61891c3cbe8da01062025dcb0756ba4f4e7ab3fb8d7b56ceccf64437
|
||||||
|
whole-file packages/cli/tests/revoke-window.test.mjs 0 743fdb0135e507dea5b968265907e5ac9228284b130feb0057d91e70ad561c02
|
||||||
|
whole-file packages/cli/tests/session-clear.test.mjs 0 5abbd894dee9cfcb3464a40e5045f9062402d5ffe567972113715cc9e24c6ce3
|
||||||
|
whole-file packages/cli/tests/session-cli.test.mjs 0 c469aed70c1ae408e176189f23a849f3acf0bfc7dc3ba1132c101a931359a462
|
||||||
|
whole-file packages/cli/tests/session-launch.test.mjs 0 cde78f9dcee9afa243692fb0493697104425b61589bd7be6c4cbdb0f4bfbd5e5
|
||||||
|
whole-file packages/cli/tests/stack-copy.test.mjs 0 3b92b3772c060378cd2ec0c1bf7fe6662721721a11d99d83c9debe3e3aa929c2
|
||||||
|
whole-file packages/cli/tests/stack-instances.test.mjs 0 2839e390f564a6e58cd514ce4061ec0b741ed07b4e2b755a337439737601d97e
|
||||||
|
whole-file packages/cli/tests/tester-http.test.mjs 0 bd9c598c84dd0be3b9873176c63e418ccc004265153be68e0cbe51c40b1ff91f
|
||||||
|
whole-file packages/cli/tests/tester-reads.test.mjs 0 50a71ffd9093c4d51d8ad07bc9edbbd76306922f290d28194d656cd78f8528c5
|
||||||
|
whole-file packages/cli/tests/tester-threads.test.mjs 0 cd3dd0020472c269d61934ddb32d77f6dc297090d63e819288f4038fe9edf096
|
||||||
|
whole-file packages/cli/tests/tester.test.mjs 0 437498258b4ea5c2f2bfa8fe66114106ac10944911bd40bca944f2078b34e45f
|
||||||
|
whole-file packages/cli/tests/thread-cli.test.mjs 0 c29897119f279434bec0248c12beb5ce97f6214b8b0bec995061000f047b1600
|
||||||
|
whole-file packages/cli/tests/thread-launch.test.mjs 0 459ef35e2b4f9cb87151577f252282a716ddbd4985f26e9e26c01b08af13a7f2
|
||||||
|
whole-file packages/cli/tests/thread-revoke.test.mjs 0 b8a72080a9624ce4bbc1b23b8903be1b74a8a6ced35b0b60f503d92a22d1028c
|
||||||
|
whole-file packages/cli/tests/trackers-boot.test.mjs 0 f83d72dac4eec7369d62b495745e1fdeeb4ff1ba2e1efb376c9b583da1765a1d
|
||||||
|
whole-file packages/cli/tests/transport.test.mjs 0 e0ae6c26b5669d4b955deffe941a3c4314be12297e72d6c099de750170688d9c
|
||||||
|
whole-file packages/cli/tests/usage.test.mjs 0 639ebccda23e0e094d62cb0e7e5c80c403b74b284ac5189fb0d92e63387c92f8
|
||||||
|
whole-file packages/cli/tests/verbs.test.mjs 0 43eefd242a987efe42d145d7863372a2b0a397031baec12ecd4c9e0644daff12
|
||||||
|
whole-file packages/harness/tests/bundle.test.mjs 0 75fd5a9a6fa0b46078952ce216348e39ce481f6fc00b89f85da9ff729d5ba100
|
||||||
|
whole-file packages/harness/tests/citation-runner.test.mjs 0 933021f114882a6c58f4071446a07d49ebc9f99c062ffe1fedc1f13b799db389
|
||||||
|
whole-file packages/harness/tests/claude-gate.test.mjs 0 f66053597c8209c5175810e33d8b878ad74eb314f4057f5b4b0b1ac625272329
|
||||||
|
whole-file packages/harness/tests/claude-session.test.mjs 0 9c4d8ffc00efd0da75d143bca1cd33f30f3e762e20086270d941170e80c962ed
|
||||||
|
whole-file packages/harness/tests/creative.test.mjs 0 3433184ced3427613d645807f0757896baf52d214c3dd6a4a12c3951bbdc50ce
|
||||||
|
whole-file packages/harness/tests/gate.test.mjs 0 991670779d9cf6f733d0060c6f1a59d122ab8e99f7e0a5f7183c9e974f1b1aaf
|
||||||
|
whole-file packages/harness/tests/git-tools.test.mjs 0 2837565ec16cd8c4d032311675a1468bc4bc756ee0696d0e57ea35ffd56eea44
|
||||||
|
whole-file packages/harness/tests/library-tools.test.mjs 0 05a8a5d8e8c4e7b3435d4a9b3f6292816356a99f7156ded2ef7873e1c84f8de7
|
||||||
|
whole-file packages/harness/tests/mcp-server.test.mjs 0 6ce4c6c39b8a1ed70fbeaca410781a62d69a6412333e03640296048b799a09b9
|
||||||
|
whole-file packages/harness/tests/pi-session.test.mjs 0 570376f798b43e82bbc1972f1d50d3915e94a8e4ca00e50076ab390df9830d7d
|
||||||
|
whole-file packages/harness/tests/raise-domain.test.mjs 0 aa6be675614d9324c3ddc01ef40347b235adbccfe6cd73081096ae9e9742d754
|
||||||
|
whole-file packages/harness/tests/runner.test.mjs 0 d3f8c752897e359e10a8e9d507c10ef3760a5ae37999f6f143cb222c42568437
|
||||||
|
whole-file packages/harness/tests/skills.test.mjs 0 2f34800387f4d7f8b8d5f6758cd197f77d11034011bf7f4f79f4d74c582e3f0f
|
||||||
|
whole-file packages/harness/tests/spec-tools.test.mjs 0 29cd1f7094266963a995f636d9575337246a9868d42a48f02231a99251261f47
|
||||||
|
whole-file packages/harness/tests/tools.test.mjs 0 f27638f1fa38fd2d15a352f6c21f7980688d48d580f5a59dab1520fd7c30b30c
|
||||||
|
whole-file packages/library/tests/guard.test.mjs 0 6529c2b48c252eeaf9c19487507a03cf46d952e7ffb3a41e640a54590e312df0
|
||||||
|
whole-file packages/library/tests/index-build.test.mjs 0 4747cb8c842cdc424db727cb3b0e36a6d35f4e9c5c31c1a3bf61314897c2cf6d
|
||||||
|
whole-file packages/library/tests/links.test.mjs 0 9b89f9275f19035c5f079b6920b248466048626c634153eba2fec165f9f6388f
|
||||||
|
whole-file packages/library/tests/mapping.test.mjs 0 9110b98f955dd71588357858b913194ccf9e04dca9aa7c4559600cbe9b9e8e71
|
||||||
|
whole-file packages/library/tests/mirror.test.mjs 0 cc2326da9796dbbbf5b3faa121180a7f00c43816a232a96faece7b58570f1227
|
||||||
|
whole-file packages/library/tests/query.test.mjs 0 f1209bc132a63cba9a7312cbed7e3098126e05c792356648f1d9ec497a11aa82
|
||||||
|
whole-file packages/library/tests/reader.test.mjs 0 3e17f34697ae65524cf7908dcc9ca1b24025bbc92989b2ba05f6e75c0f839c3b
|
||||||
|
whole-file packages/library/tests/render.test.mjs 0 5e68091a309a07e5502b9cc500c7cdfabaa9e246bb77b0c04a0dd86bb9bfcde1
|
||||||
|
whole-file packages/library/tests/scope.test.mjs 0 f55dec854adcd311d614b66959c5655cb3419d7ae7b06fe1f648b43cdecef32e
|
||||||
|
whole-file packages/library/tests/supporting.test.mjs 0 2f50bbe9c942360a5becf5bb984ed5aedb12628d4578ea85c6e433ad0ad73130
|
||||||
|
whole-file packages/library/tests/survey.test.mjs 0 72108eb8a07b990b93ca62c5fa4b55f1f89f3254ca1cf59d3de8ad194dcc3a0d
|
||||||
|
whole-file packages/library/tests/sync.test.mjs 0 a68c69492149b6e9dc7dbf24fc434ebfd3243b2db2c7654b00107b997e99ead0
|
||||||
|
whole-file packages/plugins/tests/harness-compactions.test.mjs 0 9eb9f67c06ae17b33198fbcdb443a0c73ca9cc0cd157cae2359a0647d2db3658
|
||||||
|
whole-file packages/processing-control/tests/task.test.mjs 0 8db6adda6b5d5f7437e9e4cdf961134493409d7227fde02c0b0a76aeb21186f0
|
||||||
|
whole-file packages/seat/tests/compactions-budget.test.mjs 0 1849994f45bfcccfb4ce18915887c740947a98041aa7bd66590ae7a62fa7078e
|
||||||
|
whole-file packages/seat/tests/compactions-ledger.test.mjs 0 af689c631c9d62dee11f4400112fd10df82567c1f49d9f0d423b9d19d6f860d7
|
||||||
|
whole-file packages/seat/tests/compactions.test.mjs 0 cf5e74e1211560ca47a2c13e8002635097f486e2ca06698795bc38263d889f3c
|
||||||
|
whole-file packages/seat/tests/sandbox.test.mjs 0 c09d89b8e1b22db25578f62cd4a1d3b9f441d652178fb675800efb31de33a577
|
||||||
|
whole-file packages/seat/tests/session.test.mjs 0 82171646932cddfc68f0e90ca3355f9595d32c5d228c1fdb855c06cb1d9c2feb
|
||||||
|
whole-file packages/tasks/tests/adapter.test.mjs 0 8843067c21942ae6165a7feaced2382fd9d02d0c62bd30772191393cb5d962b8
|
||||||
|
whole-file packages/tasks/tests/comment-restart.test.mjs 0 25aa6e953cf19ed3ae368581035b9d883ed924b41d593240e2b4ab5ba39f2982
|
||||||
|
whole-file packages/tasks/tests/fields.test.mjs 0 e4eafd6b17a46262dddc548263da993bc3a672adca1cadcc698b6d8374f11e2d
|
||||||
|
whole-file packages/tasks/tests/processing.test.mjs 0 0b89866cc076c43c37534dba926d492d8d334d08a6886325e3d4ac6ddbc88897
|
||||||
|
whole-file packages/tasks/tests/shapes.test.mjs 0 0b8cc660a07e048d007993d726ae5b8e1f343cb571c18ee0284c3ba0c4b41602
|
||||||
|
whole-file packages/tasks/tests/startup.test.mjs 0 5b44d779ab4ec86922dd35ce7c78096de02c0a0f2363cc6c2a5ee07816efc2ad
|
||||||
|
whole-file packages/tasks/tests/sync.test.mjs 0 513ce9f6e64a3fa0179f8cc9b27db671267a43cdc44ab93f38d21982dd2b9631
|
||||||
|
whole-file packages/tasks/tests/tree.test.mjs 0 d3c8f91f59150259b3226e9306c98efbaf2aa17b5b74cb9b376a103620f8aefe
|
||||||
|
whole-file packages/tasks/tests/verbs.test.mjs 0 47b075d01ef38a5d0228902a6f9bcfec0b78b1a958cd071e8114139af73bca53
|
||||||
|
whole-file packages/webui/tests/agents-browser.test.mjs 0 d3ae822399f58d2c4dfd90e054811a60663a66f9d3fbe69a76aa4ce7dc7260d0
|
||||||
|
whole-file packages/webui/tests/agents.test.mjs 0 be18c8fed41173900617d3b646fac1ce14c07c208e7f24d6567f61f55c5c4dc2
|
||||||
|
whole-file packages/webui/tests/assistant.test.mjs 0 056e4c2a37b7b395741ed1ba33546031a6e4ca53db843bd877b93bed764e02ad
|
||||||
|
whole-file packages/webui/tests/board-held.test.mjs 0 01a24d222092ad46c24ea94f684a018b787dfc8d26a0f7d7fda5d9df7192e695
|
||||||
|
whole-file packages/webui/tests/browser-edge.test.mjs 0 4d10b4fcefbc64cdf12bbfbd9b47f74810b3219f70624c35490cb23d66d3c4a1
|
||||||
|
whole-file packages/webui/tests/browser.test.mjs 0 d8c31b7cc16d93961d65959fa9653eaba906f81da3a34e19b3da7cc922f840c3
|
||||||
|
whole-file packages/webui/tests/bus-browser.test.mjs 0 ab1538aaabfdb02c336da61675a0d1d7f367483bc500a380e7f0ece050ab8609
|
||||||
|
whole-file packages/webui/tests/bus.test.mjs 0 fd7acdf189fef230af80c32c4c972d9bfb1564069d7c4ed649c3a49bb6636e1e
|
||||||
|
whole-file packages/webui/tests/channel-chat.test.mjs 0 678b8e3c9152662487fee1c52c8abcae95029b0672d5bbe26a824bbdb4a7ee0b
|
||||||
|
whole-file packages/webui/tests/chat-browser.test.mjs 0 ec29dd03ac7950dfa90e31f72ae74e2112718f1c02ce4dce8055194a328b5f5b
|
||||||
|
whole-file packages/webui/tests/chat-instances.test.mjs 0 72c88b1eb11397bcff524af72cfe826a276b97b58e33465c6e3334e2746e7783
|
||||||
|
whole-file packages/webui/tests/chat-replies-browser.test.mjs 0 bea9b1f9333bc913b2f01c29a792ea4b2fdbed3ebc64b42548e06f0bd75c9fc5
|
||||||
|
whole-file packages/webui/tests/chat-sessions-access.test.mjs 0 f2de41c7d1f6e246a8a13dc33e8662932964facc5b93d8f85ed5fca760c87fd8
|
||||||
|
whole-file packages/webui/tests/chat.test.mjs 0 4c6564d3565b01d68f7d16937aafddbef2ec3e04744fa9d1544ac0500a386ff7
|
||||||
|
whole-file packages/webui/tests/conversation.test.mjs 0 1c3f8811256ad82d7771a06878c3e70dc3d6f2beab82366b837780a7873ff6f1
|
||||||
|
whole-file packages/webui/tests/decide-browser.test.mjs 0 c53e1b962df99686f9739e258b2b86fe6325544ab02509833f9b1176f1303845
|
||||||
|
whole-file packages/webui/tests/decide-sso.test.mjs 0 f96f8085015a96e11aca2d94bfb9e75318c0c0dfa9659049ec7b7e31ad7bc6de
|
||||||
|
whole-file packages/webui/tests/decision-http.test.mjs 0 c89b7af200edb82f9986479199f359cf6a06c870f1bcf22b538cdf3b167f1258
|
||||||
|
whole-file packages/webui/tests/discord.test.mjs 0 1c3e6d64a370adbc6c7cb24391989e9c00d97330d393943402ff5c6a99c5f9fc
|
||||||
|
whole-file packages/webui/tests/docs-browser.test.mjs 0 f39d989ccdc561175643583b27bc19ee76fa25dec5947baa206b0c38b41c1e2a
|
||||||
|
whole-file packages/webui/tests/editor-browser.test.mjs 0 c807f81d596b3a2e3d2ea55e560f29e181a0354ce48676c6760844855acb0dd3
|
||||||
|
whole-file packages/webui/tests/editor.test.mjs 0 6953a85fe791e9087d14c3bf5075de2c4a651e1a502937da3226065c529ffd2b
|
||||||
|
whole-file packages/webui/tests/granted-user.test.mjs 0 ae3baaa0d2a1ed1ad3e9625a46a8071222dfdef4c2a70ae3ba5bf159b85dec0b
|
||||||
|
whole-file packages/webui/tests/history-return-flow.test.mjs 0 8f9ceeb41a64ec2849383a78f4997f7383c86a01eb6cf1d16747c2eb6c7448d4
|
||||||
|
whole-file packages/webui/tests/instances-browser.test.mjs 0 33b9cd4be552f89809e75f72c54f73dbe6459a5c53401a79a4d887e5a658c442
|
||||||
|
whole-file packages/webui/tests/instances.test.mjs 0 904abfc06358c99b0f646c3e728027cd7bba2b27c98c767c7da95016e531277c
|
||||||
|
whole-file packages/webui/tests/library-cli.test.mjs 0 dda07bd1b0d65058723c4d5e50f94fefb1ee103c33c8f61c13841cfedfd53f41
|
||||||
|
whole-file packages/webui/tests/library-routes.test.mjs 0 5cd1f4c6ea99cce38ce59eee085ab31f9aa8bba39cebbaf52b355c4d8fec3098
|
||||||
|
whole-file packages/webui/tests/library-status.test.mjs 0 0b4fb5a07a3d35fb2237401b460ddd3832a2f6fa357f6fbb06b8463251b77faa
|
||||||
|
whole-file packages/webui/tests/limits-browser.test.mjs 0 1a55050c92be5b93e447878feafe59e017b205d114413e6de000faf784df1dad
|
||||||
|
whole-file packages/webui/tests/limits-route.test.mjs 0 b74fe734b0ccbdde716bb52bc15791f80a0b251514a6b01d6ba59164b9639123
|
||||||
|
whole-file packages/webui/tests/messages.test.mjs 0 19bce52278091c8d37ca48c1f6f72bc400cd9a9b3038ae9f31e35444fdab05b8
|
||||||
|
whole-file packages/webui/tests/pinned-copy.test.mjs 0 a8c99249fda05c5be773c8d2231e2dd1a3f3b7d10a40a7ec3e6ca6c6cfb4c85a
|
||||||
|
whole-file packages/webui/tests/preview.test.mjs 0 7f7fbb11dd5915b3351b5086ec9b0f0bed6837a32a2e5902b707fcb54f1bf1c3
|
||||||
|
whole-file packages/webui/tests/processing-browser.test.mjs 0 ed5970f1e2b1fa393c80db5e5551523e77ad0ee107dfa686a76c5d923b7e2d8f
|
||||||
|
whole-file packages/webui/tests/processing.test.mjs 0 ac7a3a0ff51bb15c04e228186d771dd75ef515e09156cd080a8bea881e7cdd8d
|
||||||
|
whole-file packages/webui/tests/project-file.test.mjs 0 8bf04994dec5c6d6670bbae055802759588c27b04010582732cbbf32c2921487
|
||||||
|
whole-file packages/webui/tests/project-name-repo.test.mjs 0 ca773d7109f132bd099c43003a8269edfa96b2ba3a9e01e3694fa6bd12b9143e
|
||||||
|
whole-file packages/webui/tests/proof-cli.test.mjs 0 5095f1ec66a3fc153467baef2291073e27aba17fdc2757e0a3cf2a03057a6547
|
||||||
|
whole-file packages/webui/tests/proof.test.mjs 0 cdb948d261f52232c6e31e25baaf234bd0af3b6d90360a41a6142d2f34a8a797
|
||||||
|
whole-file packages/webui/tests/reads.test.mjs 0 ef69c9c1dc9a55d526a704297aa4e2802cdca8f0e1fd70ff79efad2114a071a6
|
||||||
|
whole-file packages/webui/tests/relaunch.test.mjs 0 e9f075560291cb446dabcaeb86c8800b5ea4ca0396c6a999ddbff88b245cefd1
|
||||||
|
whole-file packages/webui/tests/return-flow.test.mjs 0 bf809ee139c15e9b6b8fe7f6e0f2ce00d0860aa460f145242fc732eafe8da8de
|
||||||
|
whole-file packages/webui/tests/room-browser.test.mjs 0 23286bf46f341220f9e89cc1d229f46a579edb2eae5d688fc768f99ee343c858
|
||||||
|
whole-file packages/webui/tests/room-http.test.mjs 0 a921e1991386cb5e184475cf47a012b3020b575968268e9f3c0b396e244a1819
|
||||||
|
whole-file packages/webui/tests/routes-browser.test.mjs 0 df1283a6e1c5970b404b314b6b76dbf412e5318d76f296ec00164c932166b020
|
||||||
|
whole-file packages/webui/tests/routes.test.mjs 0 055aa274fa66910a4ff1518fea49fbbbbbc5360dc16e825a460538f312a0781d
|
||||||
|
whole-file packages/webui/tests/send-browser.test.mjs 0 da1547383522dbfd74a571b5d7625a310ae88f8adddff0c2bd33cb59df3ac137
|
||||||
|
whole-file packages/webui/tests/send.test.mjs 0 f273e78388935b5fbc18a974f50cb85789436d51c47a4d8dccaf4af4742c2392
|
||||||
|
whole-file packages/webui/tests/serve.test.mjs 0 1971344643d9cf6b4440d95c9ede42093235883ffab04fc4b614c1b7e7078f22
|
||||||
|
whole-file packages/webui/tests/settings-form.test.mjs 0 80bd949d1666f2fe1f4caa051e2c34e742bab0e4adbe5584bd534d9bad8bef53
|
||||||
|
whole-file packages/webui/tests/settings-write.test.mjs 0 7090474fff40910edb93c032feef248adc40ad21666d09c3610cf10279164f99
|
||||||
|
whole-file packages/webui/tests/shell.test.mjs 0 844287f7797201473f1fb8d97ff2355ff3ff505006723678db78f26d3e5c2a40
|
||||||
|
whole-file packages/webui/tests/sso-browser.test.mjs 0 1f70c36ce7d054ad435e52d63083c8fe19cd71e70c723518de5e58b69a426a0a
|
||||||
|
whole-file packages/webui/tests/sso.test.mjs 0 6d7b3061bdc6e22744634ddc5612ff781e5c952a120a346c29eead66a3736438
|
||||||
|
whole-file packages/webui/tests/tester-browser.test.mjs 0 425c54a84e5bf04ca91d8dc57ee83c14aff14a38159243f10f1c9114dd563967
|
||||||
|
whole-file packages/webui/tests/tester-cli.test.mjs 0 5eb7296792f16f24d4486f39101007114b3db81c6ab53ab969e925caaffaa7d9
|
||||||
|
whole-file packages/webui/tests/tester-listener.test.mjs 0 43927869c50a0e223d121e2dea2d10346a053a39fc8157c9fc4813b7c3b17e1f
|
||||||
|
whole-file packages/webui/tests/tester-socket.test.mjs 0 c05962be7f87084404c53e4f7ed2caffff3d69e98e69a3c9f3c53b150cc804e5
|
||||||
|
whole-file packages/webui/tests/thread-claims-browser.test.mjs 0 cbb2aeca0de2c64dd4c8d063d3e45140738d8f4064d38effeaec245ed7181b42
|
||||||
|
whole-file packages/webui/tests/thread-claims.test.mjs 0 164a6c927abd819218be6386e123b234dd9955b122bace699e0a12201797791c
|
||||||
|
whole-file packages/webui/tests/thread-sharing.test.mjs 0 ad64ab207702483aed6f16d13393e5f3c5a1ab0a0c2dcdf32717e8148a45078c
|
||||||
|
whole-file packages/webui/tests/usage-browser.test.mjs 0 14be967dcae157cbb0a7b9ea4e0bc67337941d91a11d789baeb3d3c8353ac0e9
|
||||||
|
whole-file packages/webui/tests/usage.test.mjs 0 4e20eee53c3eb79dc2930ca054977d06da88dba45b706a96ed94abaea6ec3e93
|
||||||
|
whole-file packages/webui/tests/user-option-swap.test.mjs 0 bd43c257ae31cad2ca6c7a0b3ee49c6e323737d236fb7ff2a2105fd5e59b9767
|
||||||
|
whole-file packages/webui/tests/views.test.mjs 0 4226ea02d33b9de8f2eaf9f93b0a551cbd9e6100560a8811eed90aa8de76974c
|
||||||
|
script scripts/test-auth.sh 0 03999aab66446a4192ea9855f5cc1bd406080d0dfa5250b45b30e118556a0d5a
|
||||||
|
script scripts/test-conductor.sh 0 79b7a689ed96792d42edd1d14796e0293e84e2e339b49476e457ad89e1c4a186
|
||||||
|
script scripts/test-config.sh 0 2c3c87fb193e82fa17428933eb69cb2b34a589e8338f7a94aaa8256729fdf08f
|
||||||
|
script scripts/test-discord.sh 0 5c6918b4415e8eabc5df31ac5ad696ec2afdfe3d498d69eae64f228a3807eddb
|
||||||
|
script scripts/test-extension-package.sh 0 1f672a73e507cc57a204f7d3806ddcb211a0a8fb3ffccefc12bbc41e299f65ac
|
||||||
|
script scripts/test-federation-acceptance.sh 0 febb0148bc1316bba3189aacf34d7c78f5f5db5d97a35aa4528dfadbec8bfbd0
|
||||||
|
script scripts/test-foundation.sh 0 3de063333ce60ef1ca1986ecdd8ac30187a2316b7ca8e3ae4b4e6c8bd435caee
|
||||||
|
script scripts/test-land-work.sh 0 ec90beab6246420982f872a4f45a7173e7a06f4aa263630d6ec4a4865176cde0
|
||||||
|
script scripts/test-push-check.sh 0 0304c110dc5cf269fd8a4bea9759e5d48895a51c9d411814ce39ca924073da79
|
||||||
|
script scripts/test-queue.sh 0 f678da9550eb6daa5268465b3a07beefd661e506ed38b8e11bf0a1b4a68cc781
|
||||||
|
script scripts/test-release.sh 0 ad0f2a6b271275003783d3ffab5520f167ea79e26683710ce92a71600037360c
|
||||||
|
script scripts/test-task.sh 0 ad511e52af4bc0a843eabbb3efcedd88c89468ccee43be9022e23880d7901f16
|
||||||
|
mutant M1-supporting 1 0 10581fdab579db4d63322eee3369a1a740266e00a7dcbaa95e7651a7e0447ab8
|
||||||
|
mutant M2-force-push 1 0 b137e8362ae3e26a090a82e8c41c3e87beeaac43183cdd6db67aba55d5e372c9
|
||||||
|
mutant M3-forged-token 1 0 bda603c18b7b2bf468a21e139f0cff0c15c22e19c9d41cf8c50f9c3ae0bd128d
|
||||||
|
mutant M4-grant-before-push 1 0 a642ef8e57a98c1488bb787da241292e6ed5446ca4117940fb0ddb9800c6a105
|
||||||
|
mutant M5-notice-after-publication 1 0 5645138c2cef5d1999948744783ff3904a78e9cefd7421674386a2d0c5fdc45a
|
||||||
|
mutant M6-commit-schema 1 0 7201f53cb976b2db1994c4e25f7f6e8b58eea323c060dbddbfa0372464adb686
|
||||||
|
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"total": {
|
||||||
|
"tests": 2605,
|
||||||
|
"pass": 2604,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 1,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"library": {
|
||||||
|
"files": 13,
|
||||||
|
"tests": 168,
|
||||||
|
"pass": 168,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"bus": {
|
||||||
|
"files": 116,
|
||||||
|
"tests": 1035,
|
||||||
|
"pass": 1035,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"harness": {
|
||||||
|
"files": 16,
|
||||||
|
"tests": 180,
|
||||||
|
"pass": 180,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"webui": {
|
||||||
|
"files": 67,
|
||||||
|
"tests": 398,
|
||||||
|
"pass": 398,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"business": {
|
||||||
|
"files": 2,
|
||||||
|
"tests": 25,
|
||||||
|
"pass": 25,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"cli": {
|
||||||
|
"files": 59,
|
||||||
|
"tests": 620,
|
||||||
|
"pass": 619,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 1,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"files": 1,
|
||||||
|
"tests": 8,
|
||||||
|
"pass": 8,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"processing-control": {
|
||||||
|
"files": 1,
|
||||||
|
"tests": 7,
|
||||||
|
"pass": 7,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"seat": {
|
||||||
|
"files": 5,
|
||||||
|
"tests": 69,
|
||||||
|
"pass": 69,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
},
|
||||||
|
"tasks": {
|
||||||
|
"files": 9,
|
||||||
|
"tests": 95,
|
||||||
|
"pass": 95,
|
||||||
|
"fail": 0,
|
||||||
|
"cancelled": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"todo": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,884 @@
|
|||||||
|
# Row 137 (#1631): agents land approved merges into the business working repository
|
||||||
|
|
||||||
|
Brief: `docs/plans/2026-10-15_q167-rows-r3.md`, section "Agents land approved
|
||||||
|
merges into the business working repository". I designed against blob
|
||||||
|
`f5ef29a2` (commit `c07c87fc2`, rev 1532). The row is now pinned to blob
|
||||||
|
`6805904555dc` (rev 1564). The section differs from `f5ef29a2` in one
|
||||||
|
paragraph, the read.mjs rule from sage-0505 and sage-0511, which this
|
||||||
|
candidate already follows (see "Arbiter path and `gated` refusal"
|
||||||
|
below). Owner Darkwing; reviewers Dewey and Filbert. Base `7a2987cf5` for
|
||||||
|
rounds 1 and 2; round 3 is rebased onto `63c82f1c4`, row 139's landing.
|
||||||
|
|
||||||
|
The design comes first, then "As built", the docs, the test map, and the
|
||||||
|
checks with the candidate.
|
||||||
|
|
||||||
|
## What lands where
|
||||||
|
|
||||||
|
A landing moves `refs/heads/main` in the business working repository,
|
||||||
|
`<dataRoot>/working/<business>/<project>.git`. Nothing writes the project
|
||||||
|
root, and canonical `refactor` is never a target. `scripts/land-work.sh`
|
||||||
|
keeps working as it does today.
|
||||||
|
|
||||||
|
## The seed (working.mjs)
|
||||||
|
|
||||||
|
Today `seed()` fetches the project root's HEAD as `+HEAD:refs/heads/main`,
|
||||||
|
forced, on every push and review. A landed main would be thrown away on the
|
||||||
|
next push. The new seed:
|
||||||
|
|
||||||
|
1. Fetch the root's HEAD as `+HEAD:refs/heads/root`, forced. A failure
|
||||||
|
refuses `root-unreadable`, as now.
|
||||||
|
2. If main doesn't exist, create it at root's tip (`update-ref main <tip> ""`,
|
||||||
|
which fails if another process created it first).
|
||||||
|
3. If main exists, isn't root's tip, and is an ancestor of root, fast-forward
|
||||||
|
it with `update-ref main <tip> <old>` (compare and swap).
|
||||||
|
4. Otherwise leave main alone. It is never forced.
|
||||||
|
|
||||||
|
push, review and land all seed under the repository lock. Working
|
||||||
|
repositories that exist today need no migration: the first seed after the
|
||||||
|
change creates `refs/heads/root`, and main is already an ancestor of it.
|
||||||
|
|
||||||
|
### The push and fetch behaviour change
|
||||||
|
|
||||||
|
The brief asks for this to be named. After the first landing, main and root
|
||||||
|
diverge until the owner brings main into the root.
|
||||||
|
|
||||||
|
- push's unrelated-history check still compares against main. A push whose
|
||||||
|
commit shares no history with main refuses `unrelated-history`. If the
|
||||||
|
owner rewrites the root's history, main keeps the old one, and pushes
|
||||||
|
built on the rewrite refuse until main is reconciled by hand.
|
||||||
|
- Coders clone from the project root, so a later task's branch doesn't have
|
||||||
|
earlier landings. Its merge base with main is then the root commit it
|
||||||
|
started from, and the reviewed diff `MB..C` is the task's own change, as
|
||||||
|
before. Landing it on a main that has moved on can refuse `base-conflict`
|
||||||
|
where the two touch the same lines.
|
||||||
|
- The reviewer's fetch now also has `refs/heads/root` in the repository, so
|
||||||
|
its `have` negotiation knows the root's commits. What the reviewer gets is
|
||||||
|
unchanged.
|
||||||
|
- When the owner merges main into the root, the next seed fast-forwards main
|
||||||
|
and the two agree again.
|
||||||
|
|
||||||
|
## Who may land (broker)
|
||||||
|
|
||||||
|
The run that holds an approved `git.merge.protected` decision asks for the
|
||||||
|
landing. Row 136 lets a later run of the same instance use it.
|
||||||
|
|
||||||
|
**Target rule.** The raise's `context.target` must equal the task ref named
|
||||||
|
by the question's work ref (`vikunja:<project>/<task>` for
|
||||||
|
`work/vikunja-<project>-<task>`). Then `#consumeAuthority` writes the record
|
||||||
|
with that task ref as its subject, so the landing sits on the task's trail
|
||||||
|
and `task-subject-required` can't fire. `refactor` never matches a task ref,
|
||||||
|
so canonical refactor can't be a target, and land-work's decisions (target
|
||||||
|
`refactor`) and agent landings (target a task ref) can't be used for each
|
||||||
|
other.
|
||||||
|
|
||||||
|
**Shared checks.** `readLanding` moves from `scripts/land-work/read.mjs` to
|
||||||
|
`packages/bus/src/landing.mjs` and takes `{ into }`:
|
||||||
|
|
||||||
|
- `into: 'refactor'` (land-work): the raise targets `refactor`, and read.mjs
|
||||||
|
still checks its `--base` is `refactor`.
|
||||||
|
- `into: 'main'` (agent landing): the raise targets the task ref.
|
||||||
|
- Anything else refuses `target-branch`.
|
||||||
|
|
||||||
|
It runs over a small query adapter (`get`, `all`), so read.mjs passes its
|
||||||
|
read-only `DatabaseSync` and the broker passes its Store. read.mjs keeps its
|
||||||
|
CLI and its own schema check.
|
||||||
|
|
||||||
|
The human check (`res.by === business.human`, `via === 'cli'`, one human
|
||||||
|
answer with no role or run) is in the shared `readLanding`. Under b2a2d741c
|
||||||
|
(sage-0517) land-work's check never changes: canonical `refactor` stays the
|
||||||
|
lead's landing. Only the host land op's call accepts a decision its arbiter
|
||||||
|
resolved (REQ-DEC-2). Row 139 landed first, so round 3 adds that with the
|
||||||
|
`arbiter` option only the broker passes, and the test that an
|
||||||
|
arbiter-resolved merge decision raised by merge-gate lands through the host
|
||||||
|
op. See "Round 3".
|
||||||
|
|
||||||
|
**New broker methods** (trusted, through the launch socket ops):
|
||||||
|
|
||||||
|
- `checkLand(cap, { task_ref, decision })`: the session's agent and task,
|
||||||
|
`#checkAuthority(s, 'git.merge.protected', { decision, target: task_ref })`,
|
||||||
|
decision not already consumed, then `readLanding` with `into: 'main'`. The
|
||||||
|
project is the task's latest push; no push refuses `ref-moved`. A decision
|
||||||
|
that names another project refuses `work-ref`.
|
||||||
|
- `recordLand(cap, land)`: reruns the checks inside the transaction (the
|
||||||
|
verdict is still the latest and approving, nothing supersedes the
|
||||||
|
decision), then `#consumeAuthority` writes the `action.allowed` with the
|
||||||
|
landed commit, the old main, the reviewed commit, the verdict and the
|
||||||
|
patch-id. The decision is spent.
|
||||||
|
- `recordEvent` reserves `action.allowed` for `git.merge.protected`, as it
|
||||||
|
already does for `git.push.working`, so no run can write a fake landing.
|
||||||
|
- `landHeld({ business, role, thread })`: whether that role and thread hold
|
||||||
|
a resolved, unconsumed merge decision with the approval option. The
|
||||||
|
launcher asks it at launch.
|
||||||
|
|
||||||
|
### REQ-LAND-1 and the gated path (sage-0505)
|
||||||
|
|
||||||
|
PRD 1.5 round 2 (row 135) says only a role whose role file grants
|
||||||
|
`git.merge.protected` as a cross-role action may land, and an approval of a
|
||||||
|
gated-class merge decision never lands. Row 139 takes `git.merge.protected`
|
||||||
|
out of GATED_ONLY.
|
||||||
|
|
||||||
|
This row takes the current gated path. A test role file can't hold the
|
||||||
|
grant: `role.mjs` refuses any GATED_ONLY action under `withinRole` or
|
||||||
|
`crossRole`, and the broker's `GATED` set classifies `git.merge.protected` as
|
||||||
|
`gated` before it reads the role file. So `checkLand` goes through
|
||||||
|
`#checkAuthority` with class `gated`, and the tests raise gated decisions.
|
||||||
|
|
||||||
|
The refusal of class `gated` belongs in `checkLand` and `recordLand`, right
|
||||||
|
after the authority check returns. The brief (c07c87fc2) says whichever of
|
||||||
|
rows 137 and 139 lands second carries it with its test, and Sage checks
|
||||||
|
that at each landing. Row 139 landed first as `63c82f1c4`, so round 3 adds
|
||||||
|
the refusal, the arbiter path and both tests, and `landHeld` asks for a
|
||||||
|
cross-role decision so the launcher binds the op only for a role that could
|
||||||
|
land. The paragraphs above describe the rounds 1 and 2 base; "Round 3" has
|
||||||
|
what changed.
|
||||||
|
|
||||||
|
## The land op (git socket)
|
||||||
|
|
||||||
|
The socket takes a third op, `land`, with `{ cap, task_ref, decision }`.
|
||||||
|
The launcher binds the git socket for a run whose role and thread hold a
|
||||||
|
merge decision (`landHeld`), as well as for the push and verdict roles it
|
||||||
|
binds today. The bundle shows a `land_work` tool only then. The broker
|
||||||
|
rechecks everything at request time, so binding grants nothing by itself.
|
||||||
|
A decision resolved while a run is going can only be landed from the next
|
||||||
|
run, because the bundle is fixed at launch.
|
||||||
|
|
||||||
|
### Asynchronous outcome (a choice, flagged for Sage)
|
||||||
|
|
||||||
|
A full gate takes longer than every timeout between the agent and the host:
|
||||||
|
the tool call's 60 s default (`callTool`), the runner's 900 s turn and the
|
||||||
|
git client's 300 s socket timeout. The op can't wait for it.
|
||||||
|
|
||||||
|
So `land` answers as soon as the gate has started:
|
||||||
|
`{ landing: "started", base, reviewed, patch_id }`. Every check that can
|
||||||
|
refuse before the gate answers synchronously as a refusal, as push does.
|
||||||
|
The host finishes in the background. The outcome is two records:
|
||||||
|
|
||||||
|
- the `action.allowed` (landed) or `action.refused` (`gate-failed`,
|
||||||
|
`base-moved`, `host-closing`, ...) on the task's trail, and
|
||||||
|
- a RESULT message from the bus (`_bus`, run `bus`, as `#notice` sends) to
|
||||||
|
the role in the decision's thread, saying what landed or why not. RESULT
|
||||||
|
makes the runner take a turn and send no automatic reply.
|
||||||
|
|
||||||
|
That message is a broker change beyond "the authority check for the new op
|
||||||
|
only". The alternative is a run that polls the trail, which needs a read op
|
||||||
|
agents don't have. I took the message. If Sage wants the narrower scope, the
|
||||||
|
fallback is the records alone and the role learns the outcome from its next
|
||||||
|
launch.
|
||||||
|
|
||||||
|
The git socket runs one landing at a time. A second request while one is
|
||||||
|
running refuses `land-busy`. Two full gates at once would also fight over
|
||||||
|
Docker.
|
||||||
|
|
||||||
|
If the host closes during a gate, the gate's process group is killed and the
|
||||||
|
landing is refused `host-closing`; nothing moves. If the host dies outright,
|
||||||
|
nothing is recorded and the decision is still unspent, so the run can ask
|
||||||
|
again.
|
||||||
|
|
||||||
|
### The steps
|
||||||
|
|
||||||
|
In order, matching land-work's refusal order and codes:
|
||||||
|
|
||||||
|
1. Broker `checkLand`: `decision-not-found`, `not-a-merge`, `not-resolved`,
|
||||||
|
`not-human`, `not-merge-option`, `work-ref`, `target-branch`,
|
||||||
|
`superseded`, `no-verdict`, `not-approved`, plus `decision-consumed`.
|
||||||
|
2. Under the repository lock: seed; the work ref's tip must be the
|
||||||
|
verdict's commit (`ref-moved`); OLD is main; `MB = merge-base(OLD, C)`,
|
||||||
|
none refuses `base-conflict`; the reviewed patch is `MB..C` in land-work's
|
||||||
|
fixed diff format, empty refuses `base-conflict`; its patch-id is taken.
|
||||||
|
3. Root file: an added top-level file, an added top-level directory OLD
|
||||||
|
doesn't have, or anything under `src/` or `v1/` refuses `root-file`.
|
||||||
|
4. The squash, in a temporary index on OLD's tree: the patch is applied
|
||||||
|
with `apply --cached`; failure refuses `base-conflict`; the patch-id of
|
||||||
|
`OLD..tree` must equal the reviewed one (`patch-drift`). The commit is
|
||||||
|
made with `commit-tree`, no ref, author and committer "Mosaic bus host"
|
||||||
|
`<[email protected]>`, and land-work's message with
|
||||||
|
`Applied-under: git socket land (bus host)`. The commit is fixed before
|
||||||
|
the gate, so nothing the gate does can change what lands.
|
||||||
|
5. Gate check: the project root is a mosaic-stack checkout (below) with a
|
||||||
|
`node_modules`; otherwise `gate-missing`. This is the last synchronous
|
||||||
|
refusal; the op answers "started" here.
|
||||||
|
6. The gate, outside the lock, in a detached worktree of the new commit
|
||||||
|
with the root's `node_modules` linked. A failing step refuses
|
||||||
|
`gate-failed` with the step and its log.
|
||||||
|
7. Under the lock: `update-ref main NEW OLD`; failure refuses `base-moved`.
|
||||||
|
Then `recordLand`. If recording throws, main goes back with
|
||||||
|
`update-ref main OLD NEW`; if that fails too, the refusal is
|
||||||
|
`rollback-failed` and names both commits.
|
||||||
|
|
||||||
|
The worktree, its `node_modules` link and the Docker network
|
||||||
|
`<name>_default` are removed on every path. Logs stay under
|
||||||
|
`<dataRoot>/bus-host/land/<id>/`.
|
||||||
|
|
||||||
|
### The exact mosaic-stack check
|
||||||
|
|
||||||
|
`git -C <root> merge-base --is-ancestor c2365ae5190aee751bfbd0a3d47105a706adb5e7 HEAD`.
|
||||||
|
c2365ae5 is the new foundation's root commit ("chore: baseline container POC
|
||||||
|
and atomic foundation plan", 2026-09-02, tag `poc-container-hello-v0`). The
|
||||||
|
repository has three root commits (c2365ae5, e7f338e3, ecde7443); a project
|
||||||
|
without c2365ae5 in its history isn't this one. The root must also have a
|
||||||
|
`node_modules` directory, which the gate links.
|
||||||
|
|
||||||
|
### The gate
|
||||||
|
|
||||||
|
One definition, in `packages/seat/src/landing.mjs`, used by the host and by
|
||||||
|
land-work.sh: every `packages/<p>/tests/*.test.mjs` suite except queue's
|
||||||
|
(`scripts/test-queue.sh` runs those), then every `scripts/test-*.sh`, each
|
||||||
|
step logged to `<step>.log` and summarised in `gate.log` with land-work's
|
||||||
|
line format, ending `GATE_PASSED`. land-work.sh calls it through node and
|
||||||
|
keeps its own worktree, refusal messages and Docker cleanup. The root-file
|
||||||
|
rule moves to the same module.
|
||||||
|
|
||||||
|
The gate runs reviewed, agent-authored code on the host, outside a sandbox,
|
||||||
|
with the host's environment. land-work.sh does the same today under the
|
||||||
|
conductor. Here a human-resolved decision and an approving review are what
|
||||||
|
authorize it.
|
||||||
|
|
||||||
|
## Harness
|
||||||
|
|
||||||
|
- `land_work` tool, verb `working.land`, in `tools.mjs`, shown when the
|
||||||
|
launcher says the session may land.
|
||||||
|
- `landWork()` client in `git-tools.mjs`.
|
||||||
|
- runner local handler for `working.land` over the session's git socket.
|
||||||
|
|
||||||
|
## Out of scope
|
||||||
|
|
||||||
|
Routing and GATED_ONLY (row 139), the merge-gate role (row 149), any push
|
||||||
|
to a remote, force-push or history rewrite.
|
||||||
|
|
||||||
|
## As built: where the candidate differs from the design above
|
||||||
|
|
||||||
|
- **The squash is made in a worktree, not a temporary index.** prepareLand
|
||||||
|
adds a detached worktree of the bare repository at main under
|
||||||
|
`bus-host/land/<id>/<id>` and applies the reviewed patch there with
|
||||||
|
`git apply --index`. The applied diff (`--cached` against OLD) must have
|
||||||
|
the reviewed patch-id. `write-tree`, `commit-tree` with OLD as the one
|
||||||
|
parent, then `reset --soft` to the squash, so the gate runs in the tree
|
||||||
|
that lands. The worktree goes on every refusal and at the end
|
||||||
|
(`dropLand`, which removes the `node_modules` symlink first).
|
||||||
|
- **Patches are written by git.** Both diffs go through
|
||||||
|
`git diff --output=<file>` with fixed prefixes, no textconv and no
|
||||||
|
external diff, and patch-id reads the file. A file that isn't UTF-8
|
||||||
|
keeps its patch-id.
|
||||||
|
- **Order.** The root-file check runs before the worktree is added, so a
|
||||||
|
root-file refusal never touches the object store beyond reading.
|
||||||
|
gate-missing comes after prepareLand, so the squash exists when the
|
||||||
|
host answers `started`.
|
||||||
|
- **The `started` answer carries `commit`**, the squash, besides `base`,
|
||||||
|
`reviewed` and `patch_id`. An agent can say what will land.
|
||||||
|
- **Tickets.** checkLand returns a ticket the host passes to recordLand
|
||||||
|
and landRefused. A ticket outlives the run that asked, since the gate
|
||||||
|
may end after the run did. An unknown ticket refuses `land-unknown`.
|
||||||
|
recordLand checks authority with `#authorityFor` (the holder check is
|
||||||
|
left out for that reason) and reruns the landing checks in the
|
||||||
|
transaction; it writes the `action.allowed` itself rather than through
|
||||||
|
`#consumeAuthority`, which would ask for the claim again.
|
||||||
|
- **`no-subject`.** land-work refuses a landing with no subject and no
|
||||||
|
`--subject`. An agent has no `--subject`, so checkLand refuses a merge
|
||||||
|
option with no first line `no-subject`.
|
||||||
|
- **`decision-consumed`** is checked in checkLand and again in recordLand.
|
||||||
|
- **The gate's environment.** The host runs the gate with `gateEnv`: PATH,
|
||||||
|
HOME, USER, LOGNAME, SHELL, LANG, LC_ALL, TZ, TERM, TMPDIR,
|
||||||
|
XDG_RUNTIME_DIR and DOCKER_HOST only. This replaces "with the host's
|
||||||
|
environment" in the gate section. land-work.sh keeps the conductor's.
|
||||||
|
- **isMosaicStack is async** and runs git through `runGit` with only the
|
||||||
|
environment's PATH, hooks at /dev/null and fsmonitor off.
|
||||||
|
- **The gate is injectable.** `createGitSocket({gate})` takes `LAND_GATE`'s
|
||||||
|
shape, `{classify, run, dropNetwork}`, so the socket tests run a fake
|
||||||
|
gate. A test checks that `LAND_GATE` holds the real `isMosaicStack` and
|
||||||
|
`runGate`, and the refusals test runs the real classifier on a fixture
|
||||||
|
project for gate-missing.
|
||||||
|
- **Harness.** `land_work` has no clone requirement and sits between
|
||||||
|
`push_working` and `request_review`. The prompt line (round 3 wording):
|
||||||
|
"Landing: once your merge decision is approved, land_work it with the task. The
|
||||||
|
reply only says the landing started; the gate's outcome comes later as a
|
||||||
|
RESULT from the bus. Don't land again while one is running." The
|
||||||
|
launcher asks `landHeld` with the run's role instance and thread and
|
||||||
|
binds the git socket when it answers true.
|
||||||
|
- **The runner's `working.land` route has no test of its own.** Neither do
|
||||||
|
`working.push` and `working.fetch`. `landWork` is tested in
|
||||||
|
git-tools.test.mjs against a fake host socket, and the launcher test
|
||||||
|
checks the bundle and `session.json`.
|
||||||
|
- **Arbiter path and `gated` refusal** (sage-0511, sage-0517, sage-0565):
|
||||||
|
rounds 1 and 2 left both out, since row 139 hadn't landed, and both
|
||||||
|
callers of `readLanding` required a human/cli resolution. Row 139 landed
|
||||||
|
first, so round 3 adds them (see "Round 3"). land-work's check in
|
||||||
|
`scripts/land-work/read.mjs` is unchanged in effect in every round.
|
||||||
|
- **The raise is found by its body, not its subject.** read.mjs looked
|
||||||
|
for the decision.raise `action.allowed` with `subject` equal to the
|
||||||
|
decision id. The broker files a raise under its task ref when it has
|
||||||
|
one (`a.task_ref ?? target-if-task-ref ?? id`), so every decision raised
|
||||||
|
for a task, which is every one the host op lands, came back
|
||||||
|
decision-not-found. The first gate run caught it (six land.test
|
||||||
|
failures). `readLanding` now matches the business, the kind, the
|
||||||
|
operation and `body.decision`, as the broker's own raise lookups do.
|
||||||
|
For land-work this changes one thing: a refactor decision raised with a
|
||||||
|
`task_ref` used to refuse decision-not-found and now reaches the checks
|
||||||
|
after it, where a `task_ref` that disagrees with the question refuses
|
||||||
|
work-ref. That branch existed in read.mjs but no real raise could reach
|
||||||
|
it; the fixture in test-land-work.sh files every raise under the
|
||||||
|
decision id, so its cases are unchanged. The human-only check is
|
||||||
|
untouched. `recordEvent` refuses an `action.allowed` whose action is
|
||||||
|
`git.merge.protected`, so an adapter can't add a second raise that
|
||||||
|
passes.
|
||||||
|
- **landing.mjs is a runner file.** The broker imports it, so it joins
|
||||||
|
`RUNNER_FILES` in packages/seat/src/sandbox.mjs, and the bus import
|
||||||
|
closure test (project-runtime.test.mjs, row 138) lists the new import
|
||||||
|
and checks that landing.mjs imports nothing.
|
||||||
|
- **thread-launch.test.mjs's host answers landHeld.** Its in-process host
|
||||||
|
lists the launch ops it serves, and every launch now asks `landHeld`, so
|
||||||
|
five of its tests failed with "invalid-host-request" until the op was
|
||||||
|
added beside `threadIdle`.
|
||||||
|
|
||||||
|
## Docs
|
||||||
|
|
||||||
|
Only the landing paragraphs the brief names:
|
||||||
|
|
||||||
|
- `packages/seat/README.md`: push step 2 and the review paragraph now
|
||||||
|
describe the root seed; "No other ref moves" names the seed's refs; a new
|
||||||
|
"Landing on main (#1631)" subsection covers prepareLand, finishLand,
|
||||||
|
dropLand and `src/landing.mjs`; the sandbox bind list adds `landHeld`.
|
||||||
|
- `packages/cli/README.md`, "Git socket": the bind rule, a `land` row in
|
||||||
|
the op table, `checkLand` in the check order, a landing paragraph (steps,
|
||||||
|
land-busy, landRefused, the RESULT outcome, logs, `LAND_GATE`), and
|
||||||
|
close() stopping a gate.
|
||||||
|
- `packages/bus/README.md`: the four row 137 ops and the ticket.
|
||||||
|
- `packages/harness/README.md`: the `land_work` paragraph, runner step 3,
|
||||||
|
the git socket bind rule.
|
||||||
|
- `docs/TOOLS.md`: one paragraph after land-work's on the shared modules.
|
||||||
|
|
||||||
|
Each passes `tools/unslop-hook/unslop-check.js`.
|
||||||
|
|
||||||
|
## Tests, against the brief's list
|
||||||
|
|
||||||
|
| Brief | Test |
|
||||||
|
|---|---|
|
||||||
|
| A reseed moves root and leaves a landed main | working.test "a reseed moves root but leaves a landed main, and main forwards once root contains it" |
|
||||||
|
| main fast-forwards to root when it's an ancestor, stays put when it isn't | the same test, and "after a landing, a push built on the root still lands and main stays where the landing put it" |
|
||||||
|
| push's unrelated-history check against main | working.test "a branch with no history in common with main refuses unrelated-history", where main and root are the same commit, and (round 2) "once the root shares no history with a landed main, a push is checked against main, not the root", where they share nothing: a push built on main lands and one built on the root refuses |
|
||||||
|
| A mosaic-stack checkout runs the gate | landing.test "isMosaicStack: ... node_modules; nothing else" (true on a child of the root commit) and the runGate tests; git-socket.test "land: the squash runs the gate in its own worktree, then main moves and the broker records it" with a classifier that says yes |
|
||||||
|
| Another project refuses gate-missing | git-socket.test "land: refusals before the gate ..." with the real `isMosaicStack` on the fixture project |
|
||||||
|
| Each land-work refusal code | On the shared module: `scripts/test-land-work.sh` runs every `readLanding` code through land-work (`into: 'refactor'`), unchanged from row 116. On the host side: land.test "checkLand refuses on the decision and the review" (the broker's decision-not-found, decision-not-approved, decision-mismatch, no-verdict, ref-moved), "checkLand refuses with land-work's codes past the authority check..." (work-ref twice, target-branch, superseded, not-approved, and a `refactor` decision refused decision-mismatch), "no-subject", and decision-consumed in the first test; working.test ref-moved, base-conflict, root-file, base-moved, rollback-failed, and (round 2) patch-drift, with a git first on the PATH that adds a line to what `apply --index` staged, as test-land-work.sh does; git-socket.test gate-missing, gate-failed, land-busy, host-closing, unknown-project and a broker refusal at record |
|
||||||
|
|
||||||
|
On the host side, `#checkAuthority` runs first, so `not-a-merge`,
|
||||||
|
`not-resolved` and `not-merge-option` reach the role as the broker's
|
||||||
|
`decision-mismatch` or `decision-not-approved`. In rounds 1 and 2,
|
||||||
|
`not-human` couldn't happen there, since only the human resolved a gated
|
||||||
|
decision. In round 3 it still can't reach checkLand: a gated decision
|
||||||
|
refuses `not-authorized` first, and the broker resolves a cross-role one
|
||||||
|
only through its route, the arbiter or the human. The round 3 test checks
|
||||||
|
`not-human` on `readLanding` directly instead (see "Round 3").
|
||||||
|
|
||||||
|
Also new: landing.test (rootHits, gateEnv, gateSteps, runGate pass, fail
|
||||||
|
and abort, the CLI), land.test (ticket, landRefused, landHeld, the
|
||||||
|
reserved event), the launcher test for `landHeld` binding, and the
|
||||||
|
harness tests for the tool, the prompt line and `landWork`.
|
||||||
|
`scripts/test-land-work.sh` is unchanged and runs land-work through the
|
||||||
|
shared gate and root-file CLI.
|
||||||
|
|
||||||
|
## Candidate
|
||||||
|
|
||||||
|
`r1/build.patch` against BASE `7a2987cf5`
|
||||||
|
(sha256 `49d5048f6bb53e1b546a6b2dbdec14ef4a9bfe5087f20e218018a62481266611`).
|
||||||
|
`r1/candidate-manifest.sha256` lists the 31 files: 27 changed and 4 new.
|
||||||
|
The new ones are packages/bus/src/landing.mjs, packages/bus/tests/land.test.mjs,
|
||||||
|
packages/seat/src/landing.mjs and packages/seat/tests/landing.test.mjs.
|
||||||
|
I applied the patch to a fresh worktree at BASE, `sha256sum -c` passed on
|
||||||
|
every line, and I removed that worktree. Canonical HEAD was `b71268b8e` at
|
||||||
|
18:56Z. `git diff 7a2987cf5 b71268b8e` on the 27 changed paths is empty, and
|
||||||
|
none of the 4 new paths exists at HEAD.
|
||||||
|
|
||||||
|
## Checks
|
||||||
|
|
||||||
|
The slot was mine from 18:37Z (sage-0519) until 18:55:30Z. `r1/gate.sh`
|
||||||
|
runs `node --test tests/*.test.mjs` in every package with a tests/
|
||||||
|
directory except queue (test-queue.sh runs that suite), then every
|
||||||
|
`scripts/test-*.sh`. The suites run one after another, each teed to its own
|
||||||
|
log, and the script stops at the first failure. TMPDIR was
|
||||||
|
`~/darkwing-scratch/r137/tmp`. cli's launcher.test ran on its own under the
|
||||||
|
session's inherited TMPDIR, because the bwrap runner fails "did not start"
|
||||||
|
under an override. DOCKER_HOST was unset, Docker 29.7.2 was up, and
|
||||||
|
COMPOSE_PROJECT_NAME was `darkwing-r137`. An EXIT trap removes
|
||||||
|
`darkwing-r137_default` only when it has 0 containers.
|
||||||
|
|
||||||
|
Round 5, the candidate, ran from 18:49:43 to 18:55:25 UTC and ended
|
||||||
|
GATE_PASSED (`r1/gate-run.log`, step logs in `r1/gate/`):
|
||||||
|
|
||||||
|
| Step | Pass | Fail |
|
||||||
|
|---|---|---|
|
||||||
|
| bus | 302 | 0 |
|
||||||
|
| business | 109 | 0 |
|
||||||
|
| cli (all but launcher) | 202 | 0 |
|
||||||
|
| cli launcher.test, inherited TMPDIR | 19 | 0 |
|
||||||
|
| control-board | 124 | 0 |
|
||||||
|
| conversation | 182 | 0 |
|
||||||
|
| discord | 183 | 0 |
|
||||||
|
| harness | 108 | 0 |
|
||||||
|
| ledger | 86 | 0 |
|
||||||
|
| mosaic | 69 | 0 |
|
||||||
|
| plugins | 28 | 0 |
|
||||||
|
| project | 30 | 0 |
|
||||||
|
| runs | 43 | 0 |
|
||||||
|
| seat | 148 | 0 |
|
||||||
|
| tasks | 97 | 0 |
|
||||||
|
| webui | 113 | 0 |
|
||||||
|
| test-auth | 15 | 0 |
|
||||||
|
| test-conductor | 17 | 0 |
|
||||||
|
| test-config | 24 | 0 |
|
||||||
|
| test-discord | 78 | 0 |
|
||||||
|
| test-extension-package | 18 | 0 |
|
||||||
|
| test-foundation | 44 | 0 |
|
||||||
|
| test-land-work | 84 | 0 |
|
||||||
|
| test-queue | 156 node, 28 suite | 0 |
|
||||||
|
| test-release | 14 | 0 |
|
||||||
|
| test-task | 98 | 0 |
|
||||||
|
|
||||||
|
The trap printed "network darkwing-r137_default removed". Afterwards no
|
||||||
|
Docker network created today remained, no container carried the
|
||||||
|
darkwing-r137 project label, and no node or docker process of mine had a
|
||||||
|
cwd under my r137 scratch.
|
||||||
|
|
||||||
|
Rounds 1 to 4 each stopped on a fault in the candidate or its tests. None
|
||||||
|
was load or timing (sage-0527). Each fix was rerun singly before the next
|
||||||
|
round. The round summaries, the failing step logs and the reruns I logged
|
||||||
|
are in `r1/earlier/`. The git-socket rerun in round 2 has no saved log;
|
||||||
|
round 5 covers it.
|
||||||
|
|
||||||
|
1. Round 1, bus, 295 pass, 7 fail. Six land.test tests refused
|
||||||
|
decision-not-found, the raise lookup described in "As built". The
|
||||||
|
project-runtime import closure test didn't list the broker's new import.
|
||||||
|
After both fixes, land.test and project-runtime.test passed 11 of 11.
|
||||||
|
2. Round 2, cli, 196 pass, 6 fail. git-socket.test expected a newline
|
||||||
|
after the Applied-under line, which `w.git` trims, so the test now
|
||||||
|
anchors that line at the end of the message. Five thread-launch tests
|
||||||
|
failed because the test host lacked `landHeld`. A rerun under the
|
||||||
|
inherited TMPDIR failed the same five (`r2-thread-launch-inherited-tmpdir.log`),
|
||||||
|
which ruled out TMPDIR. With the op added, the file passed 8 of 8.
|
||||||
|
This round also changed gate.sh: its launcher line used `env -u TMPDIR`,
|
||||||
|
and it now passes the inherited TMPDIR.
|
||||||
|
3. Round 3, cli launcher.test, 18 pass, 1 fail. The `landHeld` test's
|
||||||
|
wrapper used `Object.assign` on a host whose `op` is a read-only
|
||||||
|
inherited property and threw a TypeError. It now uses `Object.create`.
|
||||||
|
19 of 19 passed, 0 skipped.
|
||||||
|
4. Round 4, seat, 146 pass, 2 fail. Two runGate tests named their "must
|
||||||
|
not run" script test-three.sh, which sorts before test-two.sh, so it
|
||||||
|
ran first. It is now test-z.sh, with a comment saying why. landing.test
|
||||||
|
passed 8 of 8.
|
||||||
|
|
||||||
|
Researcher's row 148 gate ran from /mnt/storage/scratch/researcher/q148
|
||||||
|
during my slot (sage-0527). I didn't look inside that directory. Each
|
||||||
|
failure above traces to a line in the candidate or its tests, so I
|
||||||
|
changed code rather than rerunning for a flake.
|
||||||
|
|
||||||
|
Not run: mutants. Builder rounds may be targeted (decision 136), and the
|
||||||
|
reviewers have the gate above.
|
||||||
|
|
||||||
|
## Round 2 (Filbert's comment 28782, sage-0541)
|
||||||
|
|
||||||
|
Filbert asked for two tests the brief requires. Both are in
|
||||||
|
packages/seat/tests/working.test.mjs, the only file that changed.
|
||||||
|
|
||||||
|
- B1, "a landing whose applied diff isn't the reviewed one refuses
|
||||||
|
patch-drift and leaves no worktree". A `git` first on the PATH runs the
|
||||||
|
real git, then adds a line to the README that `apply --index` staged, as
|
||||||
|
scripts/test-land-work.sh does for land-work. prepareLand refuses
|
||||||
|
`patch-drift`, main stays put and no worktree is left. The same landing
|
||||||
|
with the real git then prepares.
|
||||||
|
- B2, "once the root shares no history with a landed main, a push is
|
||||||
|
checked against main, not the root". After a landing, the owner starts
|
||||||
|
the root over on an orphan branch. The seed moves root to it and leaves
|
||||||
|
main. A push built on main lands, and a push built on the new root
|
||||||
|
refuses `unrelated-history`.
|
||||||
|
|
||||||
|
Also fixed: the stale "Row 139 isn't built yet" in "Arbiter path and
|
||||||
|
`gated` refusal left out". The test table above names both tests.
|
||||||
|
|
||||||
|
### Candidate, round 2
|
||||||
|
|
||||||
|
`r2/build.patch` against BASE `7a2987cf5`
|
||||||
|
(sha256 `383fc8329ef340f804de68f981146593bf06e597481991fa9889649e29cb8691`).
|
||||||
|
`r2/candidate-manifest.sha256` (sha256
|
||||||
|
`3311b46a61e525a1897190bbce05de15a850843d00fce4497ef3d4828434c09f`) lists
|
||||||
|
the same 31 paths as r1. Only the working.test.mjs line differs. I applied
|
||||||
|
the patch to a fresh worktree at BASE: `sha256sum -c` passed on every line
|
||||||
|
and `git diff --cached --check` was clean (31 files, +2043 -255). Canonical
|
||||||
|
HEAD was `96fd8593e`, and `git diff 7a2987cf5 96fd8593e` on the 31 paths is
|
||||||
|
empty.
|
||||||
|
|
||||||
|
### Checks, round 2
|
||||||
|
|
||||||
|
The slot was mine from 19:18Z (sage-0547). This round was targeted
|
||||||
|
(decision 136). `r2/round.sh` ran each file singly with TMPDIR
|
||||||
|
`~/darkwing-scratch/r137/tmp` and no Docker, then probed each check the way
|
||||||
|
Filbert did. A probe edits working.mjs in place, runs working.test, and
|
||||||
|
restores the file. The script then checks working.mjs's sha256 against the
|
||||||
|
one it started with, and it must fail on exactly the new test. Output is in
|
||||||
|
`r2/gate-run.log`, step logs in `r2/gate/`.
|
||||||
|
|
||||||
|
| Step | Pass | Fail |
|
||||||
|
|---|---|---|
|
||||||
|
| seat working.test, candidate | 26 | 0 |
|
||||||
|
| cli git-socket.test, candidate | 23 | 0 |
|
||||||
|
| probe B1: line 348 `if (false) refuse("patch-drift", ...)` | 25 | 1 |
|
||||||
|
| probe B2: line 224 merge-base against `refs/heads/root` | 25 | 1 |
|
||||||
|
| seat, whole suite, restored candidate | 150 | 0 |
|
||||||
|
|
||||||
|
- Probe B1 failed only "a landing whose applied diff isn't the reviewed one
|
||||||
|
refuses patch-drift and leaves no worktree", with "Missing expected
|
||||||
|
rejection".
|
||||||
|
- Probe B2 failed only "once the root shares no history with a landed main,
|
||||||
|
a push is checked against main, not the root". The push built on main
|
||||||
|
refused `unrelated-history`.
|
||||||
|
|
||||||
|
After each probe working.mjs was back at
|
||||||
|
`0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463`, its
|
||||||
|
manifest hash. Afterwards `sha256sum -c` on the r2 manifest passed in my
|
||||||
|
worktree, no `.orig` file was left, and no node process of mine was
|
||||||
|
running.
|
||||||
|
|
||||||
|
Not run in this round: the other package suites, the scripts/test-*.sh and
|
||||||
|
mutants. Round 2 changes one test file. The r1 gate above covers the other
|
||||||
|
30 paths, which are unchanged.
|
||||||
|
|
||||||
|
## Round 3 (sage-0565): rebased onto row 139, with both carry items
|
||||||
|
|
||||||
|
Row 139 landed first as `63c82f1c4`, so this row carries the two items the
|
||||||
|
brief gives the second lander (brief blob `6805904555dc`). The r2 patch
|
||||||
|
applied to `63c82f1c4` without a conflict. B1 and B2 are unchanged.
|
||||||
|
|
||||||
|
### What row 139 changed under this row
|
||||||
|
|
||||||
|
In broker.mjs, `GATED` is now the hard-wait set, and vocabulary.mjs's
|
||||||
|
`GATED_ONLY` matches it. `git.merge.protected` isn't in it. A role file
|
||||||
|
may grant a merge cross-role, and a business that grants a hard wait at
|
||||||
|
either class refuses `invalid-authority` (REQ-WAIT-2). So a hard wait is
|
||||||
|
never a cross-role decision. decision.raise routes:
|
||||||
|
|
||||||
|
- cross-role to `arbiters[domain]`, or to the human when the arbiter is
|
||||||
|
the raiser's own role;
|
||||||
|
- gated and cited to the arbiter;
|
||||||
|
- gated and uncited, or any hard wait, to the human.
|
||||||
|
|
||||||
|
An agent's resolution writes `via: 'broker'` with its run as `by`. A
|
||||||
|
human-routed decision resolved by an agent refuses `human-required`.
|
||||||
|
|
||||||
|
### (a) REQ-LAND-1: a gated merge decision never lands
|
||||||
|
|
||||||
|
`#landFacts` starts with `if (cls === 'gated') fail('not-authorized')`.
|
||||||
|
checkLand passes the class `#checkAuthority` returned, and recordLand
|
||||||
|
passes the one from `#authorityFor`, so both run the same line. The class
|
||||||
|
can't change between the two: `#authorityFor` requires the decision's class
|
||||||
|
to be the one the role holds. The refusal comes before
|
||||||
|
`decision-consumed` and `readLanding`, so who resolved a gated decision
|
||||||
|
doesn't matter.
|
||||||
|
|
||||||
|
### (b) REQ-DEC-2: the host op accepts an arbiter-resolved merge
|
||||||
|
|
||||||
|
`readLanding` takes `{ into, arbiter = false }`. It accepts a resolution
|
||||||
|
when one of these holds:
|
||||||
|
|
||||||
|
- the human resolved it through the CLI with one human answer, the check
|
||||||
|
rounds 1 and 2 already had; or
|
||||||
|
- `arbiter` is true, the decision is `cross-role`, its `route_to` isn't
|
||||||
|
`human`, the resolution came `via: 'broker'`, and there is no human
|
||||||
|
answer.
|
||||||
|
|
||||||
|
Only the broker's `#landFacts` passes `arbiter: true`. read.mjs is
|
||||||
|
unchanged, so land-work passes nothing and stays human-only (item 4). The
|
||||||
|
route check holds because the broker lets only a run of the `route_to` role
|
||||||
|
resolve an agent-routed decision.
|
||||||
|
|
||||||
|
### Item 5: no hard wait through the arbiter path
|
||||||
|
|
||||||
|
A hard wait can't reach the arbiter path, for three reasons:
|
||||||
|
|
||||||
|
1. `readLanding` refuses `not-a-merge` for any action but
|
||||||
|
`git.merge.protected`, which isn't a hard wait.
|
||||||
|
2. The arbiter path takes only `cross-role`, and REQ-WAIT-2 keeps a hard
|
||||||
|
wait out of that class.
|
||||||
|
3. A gated decision refuses `not-authorized` before `readLanding` runs.
|
||||||
|
|
||||||
|
### landHeld and the prompt
|
||||||
|
|
||||||
|
`landHeld` now skips any decision that isn't `cross-role`, so the launcher
|
||||||
|
binds the land op only for a role that could land. The bundle's prompt
|
||||||
|
line no longer says the human approved the merge. It reads "Landing: once
|
||||||
|
your merge decision is approved, land_work it with the task." The harness
|
||||||
|
bundle test and the cli launcher test assert it.
|
||||||
|
|
||||||
|
### Tests (packages/bus/tests/land.test.mjs)
|
||||||
|
|
||||||
|
The world gains a `merge-gate` role granted `git.merge.protected`
|
||||||
|
cross-role, with pm as the technical and delivery arbiter. The landing
|
||||||
|
tests now use it instead of a coder raising a gated decision.
|
||||||
|
|
||||||
|
- **(b)**, "REQ-DEC-2: a merge-gate raise its arbiter resolved lands
|
||||||
|
through the host op: ...". The raise routes `cross-role` to pm, and pm
|
||||||
|
resolves it (`by: 'pm-run'`, `via: 'broker'`). `readLanding` without
|
||||||
|
`arbiter` refuses `not-human` on it. checkLand answers the facts with
|
||||||
|
`by: 'pm-run'`, and recordLand writes the merge event with class
|
||||||
|
`cross-role` and spends the decision once.
|
||||||
|
- **(a)**, "REQ-LAND-1: a gated merge decision refuses not-authorized,
|
||||||
|
cited and approved by the arbiter or uncited and approved by the human".
|
||||||
|
On row 139's spec fixture, the coder pushes, gets an approving review and
|
||||||
|
raises a merge citing `spec/north-star.md` at the fixture commit. The
|
||||||
|
raise routes `gated` to pm, and pm approves. checkLand refuses
|
||||||
|
`not-authorized`, `readLanding` with `arbiter: true` refuses `not-human`,
|
||||||
|
and landHeld is false. Then, uncited: the raise routes `gated` to the
|
||||||
|
human, the human approves, and checkLand still refuses `not-authorized`.
|
||||||
|
Nothing merges.
|
||||||
|
- New: "a cross-role merge that routes to the human, because merge-gate is
|
||||||
|
its own arbiter, lands on the human's CLI answer". pm's resolve refuses
|
||||||
|
`human-required`; the human's lands with `by` set to the human.
|
||||||
|
- landHeld's test adds a coder's gated decision approved by the human,
|
||||||
|
for which landHeld is false.
|
||||||
|
|
||||||
|
`not-human` still can't reach checkLand (see the test table above). A
|
||||||
|
comment above the land-work codes test says so.
|
||||||
|
|
||||||
|
### Docs, round 3
|
||||||
|
|
||||||
|
- `packages/bus/README.md`: land-work accepts only a human CLI resolution;
|
||||||
|
the broker's `arbiter: true` also accepts a cross-role decision its
|
||||||
|
arbiter resolved; `not-authorized` for gated (REQ-LAND-1); checkLand and
|
||||||
|
landHeld name `cross-role`.
|
||||||
|
- `packages/cli/README.md`: a role granted the merge cross-role lands once
|
||||||
|
its arbiter or the human approved the decision.
|
||||||
|
- `packages/cli/tests/git-socket.test.mjs`: one comment. Its broker is a
|
||||||
|
stand-in, and no logic changed.
|
||||||
|
|
||||||
|
### Candidate, round 3
|
||||||
|
|
||||||
|
`r3/build.patch` against BASE `63c82f1c4`
|
||||||
|
(sha256 `52c1f1d6564d9e5e12b5708cbf2f12675dee0582b5fc42ece2fcc203fb5b2a7a`).
|
||||||
|
`r3/candidate-manifest.sha256` (sha256
|
||||||
|
`0fae2b6fa41f1cbcf2117b637a2f7a89cb2af209bf32647f0afc1612a9a34e16`) lists
|
||||||
|
the same 31 paths as r2. Round 3 changed 9 of them: the bus and cli
|
||||||
|
READMEs, broker.mjs, landing.mjs, land.test.mjs, git-socket.test.mjs,
|
||||||
|
launcher.test.mjs, bundle.mjs and bundle.test.mjs. I applied the patch to a
|
||||||
|
fresh worktree at BASE. `sha256sum -c` passed on every line, and
|
||||||
|
`git diff --cached --check` was clean (31 files, +2115 -255). I removed
|
||||||
|
that worktree. Canonical HEAD was `c492f4aaa`, and
|
||||||
|
`git diff 63c82f1c4 c492f4aaa` on the 31 paths is empty.
|
||||||
|
|
||||||
|
### Checks, round 3
|
||||||
|
|
||||||
|
The slot was mine from 19:43:51Z to 19:46:02Z (sage-0569). Before the
|
||||||
|
start, /proc showed no `node --test` process outside my own cwd. This
|
||||||
|
round was targeted (decision 136). `r3/round.sh` ran every test file the
|
||||||
|
candidate touches, plus row 139's hard-waits.test, each on its own with
|
||||||
|
TMPDIR `~/darkwing-scratch/r137/tmp` and no Docker. cli launcher.test and
|
||||||
|
thread-launch.test ran under the inherited TMPDIR. Then came
|
||||||
|
scripts/test-land-work.sh and one kill per check. A kill edits one source
|
||||||
|
file in place, runs one test file, which must fail on the named test, and
|
||||||
|
restores the file. The script checks each restored file against its
|
||||||
|
starting sha256. Last came the whole bus and seat suites. Output is in
|
||||||
|
`r3/gate-run.log`, step logs in `r3/gate/`. It ran from 19:43:51 to
|
||||||
|
19:45:35 UTC and ended ROUND_PASSED.
|
||||||
|
|
||||||
|
| Step | Pass | Fail |
|
||||||
|
|---|---|---|
|
||||||
|
| bus land.test | 10 | 0 |
|
||||||
|
| bus hard-waits.test (row 139) | 12 | 0 |
|
||||||
|
| bus project-runtime.test | 3 | 0 |
|
||||||
|
| seat landing.test | 8 | 0 |
|
||||||
|
| seat working.test | 26 | 0 |
|
||||||
|
| harness bundle.test | 22 | 0 |
|
||||||
|
| harness git-tools.test | 5 | 0 |
|
||||||
|
| harness tools.test | 19 | 0 |
|
||||||
|
| cli git-socket.test | 23 | 0 |
|
||||||
|
| cli launcher.test, inherited TMPDIR | 19 | 0 |
|
||||||
|
| cli thread-launch.test, inherited TMPDIR | 8 | 0 |
|
||||||
|
| scripts/test-land-work.sh | 86 | 0 |
|
||||||
|
| bus, whole suite, restored candidate | 316 | 0 |
|
||||||
|
| seat, whole suite, restored candidate | 150 | 0 |
|
||||||
|
|
||||||
|
0 skipped in each.
|
||||||
|
|
||||||
|
| Kill | Edit | Must fail | Failing |
|
||||||
|
|---|---|---|---|
|
||||||
|
| B1 | working.mjs:348 `if (false) refuse("patch-drift", ...)` | the patch-drift test, exactly 1 | 1 |
|
||||||
|
| B2 | working.mjs:224 merge-base against `refs/heads/root` | the root-history test, exactly 1 | 1 |
|
||||||
|
| (a) gated refusal | broker.mjs:815 `if (false) fail('not-authorized')` | REQ-LAND-1, exactly 1 | 1 |
|
||||||
|
| (b) arbiter path | landing.mjs:112 `arbitrated = false && ...` | REQ-DEC-2, one or more | 6 |
|
||||||
|
| item 5, cross-role only | landing.mjs:112 drops `d.class === 'cross-role'` | REQ-LAND-1, exactly 1 | 1 |
|
||||||
|
| land-work stays human-only | landing.mjs:91 `arbiter = true` | REQ-DEC-2, exactly 1 | 1 |
|
||||||
|
| landHeld cross-role | broker.mjs:924 drops `d.class !== 'cross-role'` | the landHeld test, one or more | 2 |
|
||||||
|
|
||||||
|
- Kill (b) fails all 6 land.test tests that land or check an
|
||||||
|
arbiter-resolved merge.
|
||||||
|
- The item 5 kill fails only REQ-LAND-1. With the gated refusal in place,
|
||||||
|
the `readLanding` call with `arbiter: true` on the arbiter-resolved gated
|
||||||
|
decision is the only check that sees it.
|
||||||
|
- The arbiter-default kill fails REQ-DEC-2 on its `readLanding` call
|
||||||
|
without `arbiter`, which must refuse `not-human`.
|
||||||
|
- The landHeld kill fails the landHeld test and REQ-LAND-1, since both
|
||||||
|
assert landHeld is false for a gated decision.
|
||||||
|
|
||||||
|
Afterwards no node or chromium process of mine had a cwd under
|
||||||
|
`~/darkwing-scratch`. No `.orig` file was left, and every killed file was
|
||||||
|
back at its starting sha256. The r137 TMPDIR held 847 entries from round
|
||||||
|
1's full gate (newest 18:53Z) and none from this run. I removed them.
|
||||||
|
|
||||||
|
Not run in this round: the other package suites, the other
|
||||||
|
scripts/test-*.sh, Docker and mutants. Some untouched test files also read
|
||||||
|
a source round 3 changed, and they didn't run on this base:
|
||||||
|
|
||||||
|
- broker.mjs: packages/cli/tests/helpers.mjs (and so the cli tests that
|
||||||
|
build a broker through it), cli tester.test and harness runner.test;
|
||||||
|
- launcher.mjs, which asks landHeld: cli launch-limits.test;
|
||||||
|
- bundle.mjs: harness claude-gate, claude-session, mcp-server and
|
||||||
|
pi-session tests.
|
||||||
|
|
||||||
|
All of them passed in the r1 full gate on `7a2987cf5`, before the gated
|
||||||
|
refusal, the arbiter path and landHeld's filter. The reviewers' gates and
|
||||||
|
Sage's gate at the landing target run them on `63c82f1c4`.
|
||||||
|
|
||||||
|
## Round 4 (sage-0585): B1, the class refusal and the landing.mjs comment
|
||||||
|
|
||||||
|
Dewey asked for changes on round 3 (#1631 comment 28801, rev 1595), and
|
||||||
|
Filbert approved it (comment 28804, manifest `0fae2b6f`). sage-0585 fixed
|
||||||
|
round 4 as three items. Everything else in round 3 is unchanged. Base is
|
||||||
|
still `63c82f1c4`.
|
||||||
|
|
||||||
|
### Item 1, Dewey B1: the squash names the real channel
|
||||||
|
|
||||||
|
Round 3's `landMessage` wrote "Resolved <choice> by <by> via the CLI" for
|
||||||
|
every landing. For an arbiter's landing that put "by pm-run via the CLI"
|
||||||
|
into main's history, which is false. Now:
|
||||||
|
|
||||||
|
- `readLanding` returns `via: res.via`, and `#landFacts` passes it into
|
||||||
|
checkLand's facts. The broker's ticket answer gains `via`.
|
||||||
|
- git-socket.mjs maps it: `cli` writes "via the CLI", and `broker` writes
|
||||||
|
"as its arbiter, via the broker". readLanding accepts no other value. If
|
||||||
|
one ever got through, the line would print `via <value>`. It never falls
|
||||||
|
back to the CLI.
|
||||||
|
- land-work's read.mjs prints every key, so it now prints a `via` line too.
|
||||||
|
land-work.sh reads keys by name and still writes "via the CLI" itself,
|
||||||
|
which holds, since it accepts only a human CLI resolution.
|
||||||
|
|
||||||
|
### Item 2, Filbert note 1 and Dewey N1: every class but cross-role refuses
|
||||||
|
|
||||||
|
`#landFacts` now starts with `if (cls !== 'cross-role') fail('not-authorized')`,
|
||||||
|
ahead of the spent check and the human check in readLanding. Round 3
|
||||||
|
refused only `gated`. A role granted `git.merge.protected` within-role
|
||||||
|
resolves its own raise (`via: 'broker'`), so its landing got past that
|
||||||
|
line and refused `not-human` in readLanding instead. It now refuses
|
||||||
|
`not-authorized`, like a gated one. role.mjs is unchanged: whether it
|
||||||
|
should refuse a within-role merge grant at load is a follow-up for row 149
|
||||||
|
(sage-0585).
|
||||||
|
|
||||||
|
The comment above land.test's land-work codes test now matches the code.
|
||||||
|
checkLand never gives `not-human`: #landFacts refuses every class but
|
||||||
|
cross-role first, and the broker resolves a cross-role decision only
|
||||||
|
through the human's CLI answer or its arbiter's decision.resolve.
|
||||||
|
|
||||||
|
### Item 3, Dewey N2: the comment at landing.mjs:112
|
||||||
|
|
||||||
|
The arbiter path's line now has a comment above it. A cross-role decision
|
||||||
|
routed to an agent closes only through decision.resolve, which takes it
|
||||||
|
from the routed role alone (`s.role === route_to`, else `not-resolver`), so
|
||||||
|
`res.by` there is the arbiter's run.
|
||||||
|
|
||||||
|
### Tests, round 4
|
||||||
|
|
||||||
|
- land.test, REQ-DEC-2: checkLand's facts gain `via: 'broker'`.
|
||||||
|
- land.test, the human-routed cross-role landing: checkLand answers
|
||||||
|
`by: 'jason'`, `via: 'cli'`.
|
||||||
|
- land.test, new: "REQ-LAND-1: a within-role merge grant refuses
|
||||||
|
not-authorized at the land". The world's merge-gate holds the grant
|
||||||
|
within-role, so its raise with `choice: 'yes'` closes in the call
|
||||||
|
(`within-role`, routed to itself, `via: 'broker'`). checkLand refuses
|
||||||
|
`not-authorized`, landHeld is false, and nothing merges or refuses on
|
||||||
|
the trail. `setup` takes a `roles` override for it.
|
||||||
|
- git-socket.test, the first land test: the stand-in's facts gain
|
||||||
|
`via: "cli"`, and the squash's message must hold "Resolved yes by jason
|
||||||
|
via the CLI at 2026-10-16T00:00:00.000Z."
|
||||||
|
- git-socket.test, new: "land: an arbiter-resolved landing's squash says
|
||||||
|
the arbiter resolved it through the broker". The stand-in answers
|
||||||
|
`by: "pm-run", via: "broker"`. The message must hold "Resolved yes by
|
||||||
|
pm-run as its arbiter, via the broker at ..." and no "via the CLI".
|
||||||
|
|
||||||
|
### Docs, round 4
|
||||||
|
|
||||||
|
- `packages/bus/README.md`: not-authorized for every class but
|
||||||
|
`cross-role`, gated and within-role named; checkLand's answer carries
|
||||||
|
the resolution's `via`.
|
||||||
|
- `packages/cli/README.md`: the squash's Resolved line names the channel
|
||||||
|
from the ticket's `via`.
|
||||||
|
|
||||||
|
### Interdiff, round 3 to round 4
|
||||||
|
|
||||||
|
`r4/interdiff.patch` (sha256
|
||||||
|
`dcc4672cf6f6ad01cf068725969bfb724d52460528df1adeb405c75a13856af3`), 7
|
||||||
|
files, +65 -20:
|
||||||
|
|
||||||
|
| File | Change |
|
||||||
|
|---|---|
|
||||||
|
| packages/bus/src/broker.mjs | the class refusal and its comment; `via` in the facts |
|
||||||
|
| packages/bus/src/landing.mjs | `via` in readLanding's return; the N2 comment |
|
||||||
|
| packages/cli/src/git-socket.mjs | `RESOLVED_VIA` and the Resolved line |
|
||||||
|
| packages/bus/tests/land.test.mjs | `via` in two tests, the within-role test, the comment, `setup`'s `roles` |
|
||||||
|
| packages/cli/tests/git-socket.test.mjs | `via: "cli"` in the stand-in, the CLI assertion, the arbiter test |
|
||||||
|
| packages/bus/README.md | the refusal's classes, `via` in the answer |
|
||||||
|
| packages/cli/README.md | the Resolved line |
|
||||||
|
|
||||||
|
### Candidate, round 4
|
||||||
|
|
||||||
|
`r4/build.patch` against BASE `63c82f1c4`
|
||||||
|
(sha256 `0cabe175b095dd632e6ee6e166efad19089a1c87ffba6198a32c6849a1a80965`).
|
||||||
|
`r4/candidate-manifest.sha256` (sha256
|
||||||
|
`548ee477baca2a172d2585dd3074979f299b83db4484d1ec89674bb3142a9928`) lists
|
||||||
|
the same 31 paths as r3, and differs from it on the 7 above. I applied the
|
||||||
|
patch to a fresh worktree at BASE. `sha256sum -c` passed on every line,
|
||||||
|
and `git diff --cached --check` was clean (31 files, +2160 -255). I
|
||||||
|
removed that worktree. Canonical HEAD was `4ebef2284`, and
|
||||||
|
`git diff 63c82f1c4 4ebef2284` on the 31 paths is empty.
|
||||||
|
|
||||||
|
### Checks, round 4
|
||||||
|
|
||||||
|
`r4/round.sh` is round 3's script with three kills added and kill (a)
|
||||||
|
moved to the new line:
|
||||||
|
|
||||||
|
| Kill | Edit | Must fail |
|
||||||
|
|---|---|---|
|
||||||
|
| (a) class refusal | broker.mjs:815 `if (false) fail('not-authorized')` | the within-role test, one or more |
|
||||||
|
| item 2, gated only | broker.mjs:815 back to round 3's `cls === 'gated'` | the within-role test, exactly 1 |
|
||||||
|
| B1, CLI text | git-socket.mjs:259 hard-codes "via the CLI" | the arbiter squash test, exactly 1 |
|
||||||
|
|
||||||
|
The other six kills are round 3's.
|
||||||
|
|
||||||
|
I ran it on Sage's go (sage-0592) from 2026-10-16T20:38:29Z to
|
||||||
|
20:40:26Z, in `~/darkwing-scratch/r137/wt4` at BASE with the patch
|
||||||
|
applied. Log: `r4/gate-run.log`, per-step logs under `r4/gate/`.
|
||||||
|
ROUND_PASSED.
|
||||||
|
|
||||||
|
| Step | Result |
|
||||||
|
|---|---|
|
||||||
|
| bus land, hard-waits, project-runtime | 11, 12, 3 pass, 0 fail |
|
||||||
|
| seat landing, working | 8, 26 pass, 0 fail |
|
||||||
|
| harness bundle, git-tools, tools | 22, 5, 19 pass, 0 fail |
|
||||||
|
| cli git-socket | 24 pass, 0 fail |
|
||||||
|
| cli launcher, thread-launch (inherited TMPDIR) | 19, 8 pass, 0 fail |
|
||||||
|
| scripts/test-land-work.sh | 86 passed, 0 failed |
|
||||||
|
| whole bus suite | 317 pass, 0 fail |
|
||||||
|
| whole seat suite | 150 pass, 0 fail |
|
||||||
|
|
||||||
|
All nine kills killed:
|
||||||
|
|
||||||
|
| Kill | Failing |
|
||||||
|
|---|---|
|
||||||
|
| b1-patch-drift | 1 |
|
||||||
|
| b2-against-root | 1 |
|
||||||
|
| (a) class refusal | 2 |
|
||||||
|
| item 2, gated only | 1 |
|
||||||
|
| B1, CLI text | 1 |
|
||||||
|
| b-arbiter-path | 6 |
|
||||||
|
| 5-cross-role-only | 1 |
|
||||||
|
| arbiter-default | 1 |
|
||||||
|
| held-cross-role | 3 |
|
||||||
|
|
||||||
|
Each named test was among the failures. After the run the sweep found
|
||||||
|
none of my processes left, no `.orig` file remained, and `sha256sum -c`
|
||||||
|
on the manifest still passed. This is a targeted builder round
|
||||||
|
(decisions 136/137). The whole cli and harness suites and the other
|
||||||
|
`scripts/test-*.sh` are the landing gate's.
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,31 @@
|
|||||||
|
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
|
||||||
|
128aae5d0d6c3d2b11c474508d75b412d24b2b3fff3079822b4fe6de96b53dce packages/bus/README.md
|
||||||
|
380f01f7d97485ff62acec37692b4b4354615fe1be486d18fbf85c82277819ec packages/bus/src/broker.mjs
|
||||||
|
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
|
||||||
|
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
|
||||||
|
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
|
||||||
|
62b641b44b2939c6eec86856b47de967d501e36d6cf437b993c844d8007353c1 packages/cli/README.md
|
||||||
|
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
|
||||||
|
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
|
||||||
|
03a4903b14ea72781a337e1782cba41918f35849b25e223110ed4d283864cee4 packages/cli/tests/git-socket.test.mjs
|
||||||
|
97c613a0e59d39fa715d32144741bd996a6392862353f0bf204029d707789d50 packages/cli/tests/launcher.test.mjs
|
||||||
|
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
|
||||||
|
a47aecd10338ffa77df4f1993b90ab60dd91cf33651eb5e7ac23f53f73d73d98 packages/harness/README.md
|
||||||
|
b97b5df64d6ea56183b2d672bbe95321ecfab5171f11e1ba643b6778b70b9fb6 packages/harness/src/bundle.mjs
|
||||||
|
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
|
||||||
|
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
|
||||||
|
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
|
||||||
|
81966394d5d875e3e62d231df4e5442849ff7dde40bebe6f52d8d9a7b3b6d99f packages/harness/tests/bundle.test.mjs
|
||||||
|
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
|
||||||
|
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
|
||||||
|
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
|
||||||
|
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
|
||||||
|
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
|
||||||
|
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
|
||||||
|
df8ea48a034cd1c08ee153fb3ce0f3fcfb13c5f23be949ff6240f07dd6f88a03 packages/seat/tests/working.test.mjs
|
||||||
|
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
|
||||||
|
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
|
||||||
|
c09885c94d45a48345c132e7e7bf2233ca6787ca23771a35393e6dc635d784d6 packages/bus/src/landing.mjs
|
||||||
|
7ed287a6035cb2ca9d9df09054403df868820a32cdc714ff6b15aa36f8474e1b packages/bus/tests/land.test.mjs
|
||||||
|
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
|
||||||
|
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:37:45
|
||||||
|
pkg-bus rc=1 18:37:45-18:37:57 ℹ pass 295 ℹ fail 7 ℹ skipped 0 | }
|
||||||
|
STOP pkg-bus
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:39:15
|
||||||
|
pkg-bus rc=0 18:39:15-18:39:28 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12251.983083
|
||||||
|
pkg-business rc=0 18:39:28-18:39:29 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1896.460233
|
||||||
|
pkg-cli rc=1 18:39:29-18:41:01 ℹ pass 196 ℹ fail 6 ℹ skipped 0 | at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
STOP pkg-cli
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:44:15
|
||||||
|
pkg-bus rc=0 18:44:15-18:44:27 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12369.638742
|
||||||
|
pkg-business rc=0 18:44:27-18:44:29 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1945.948742
|
||||||
|
pkg-cli rc=0 18:44:29-18:44:50 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 20213.873392
|
||||||
|
pkg-cli-launcher rc=1 18:44:50-18:45:04 ℹ pass 18 ℹ fail 1 ℹ skipped 0 | at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
STOP pkg-cli-launcher
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:45:35
|
||||||
|
pkg-bus rc=0 18:45:35-18:45:46 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 11199.134901
|
||||||
|
pkg-business rc=0 18:45:46-18:45:48 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2012.878753
|
||||||
|
pkg-cli rc=0 18:45:48-18:46:10 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 21560.33243
|
||||||
|
pkg-cli-launcher rc=0 18:46:10-18:46:24 ℹ pass 19 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 14833.180301
|
||||||
|
pkg-control-board rc=0 18:46:24-18:46:25 ℹ pass 124 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 649.958587
|
||||||
|
pkg-conversation rc=0 18:46:25-18:47:15 ℹ pass 182 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 50020.343616
|
||||||
|
pkg-discord rc=0 18:47:15-18:47:18 ℹ pass 183 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2640.132988
|
||||||
|
pkg-harness rc=0 18:47:18-18:47:30 ℹ pass 108 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12190.433259
|
||||||
|
pkg-ledger rc=0 18:47:30-18:47:52 ℹ pass 86 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 22075.885877
|
||||||
|
pkg-mosaic rc=0 18:47:52-18:47:54 ℹ pass 69 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2051.574471
|
||||||
|
pkg-plugins rc=0 18:47:54-18:47:54 ℹ pass 28 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 226.191842
|
||||||
|
pkg-project rc=0 18:47:54-18:47:56 ℹ pass 30 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1014.159815
|
||||||
|
pkg-runs rc=0 18:47:56-18:47:56 ℹ pass 43 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 715.157202
|
||||||
|
pkg-seat rc=1 18:47:56-18:48:02 ℹ pass 146 ℹ fail 2 ℹ skipped 0 | }
|
||||||
|
STOP pkg-seat
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
✔ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (176.764884ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (256.209119ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (114.469937ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (267.381445ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (112.362045ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (117.330249ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (112.674263ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (73.676483ms)
|
||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.553045ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (165.234989ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (168.752393ms)
|
||||||
|
ℹ tests 11
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 11
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1293.733361
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (143.490511ms)
|
||||||
|
✔ agents: working counts what the holder received and has not read; routed alone is not working (203.729324ms)
|
||||||
|
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (329.878819ms)
|
||||||
|
✔ agents: working wins over waiting, and Input needed still shows (174.656985ms)
|
||||||
|
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (226.743618ms)
|
||||||
|
✔ agents: state reads only its own business, even for a run name both use (187.355626ms)
|
||||||
|
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (220.521088ms)
|
||||||
|
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (210.533074ms)
|
||||||
|
✔ agents: stranded is oldest first and capped at 50 for a role (933.932351ms)
|
||||||
|
✔ agents: stranded is per role and per business (332.277738ms)
|
||||||
|
✔ agents: a message routed to a held role and not yet received is not stranded (132.446455ms)
|
||||||
|
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (268.774469ms)
|
||||||
|
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (190.84645ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (276.051807ms)
|
||||||
|
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (252.287125ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (287.269023ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (333.275539ms)
|
||||||
|
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (174.848766ms)
|
||||||
|
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (248.358118ms)
|
||||||
|
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (273.430369ms)
|
||||||
|
✔ launch events require a human CLI capability; generic emit cannot forge authority events (184.963236ms)
|
||||||
|
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (213.113276ms)
|
||||||
|
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (274.371208ms)
|
||||||
|
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (163.175791ms)
|
||||||
|
✔ task action subjects and linked decision trail are complete and ordered (207.906022ms)
|
||||||
|
✔ launch binding is durable and reconnecting requires the identical trusted record (132.022789ms)
|
||||||
|
✔ business isolation includes inherited object names and cross-business message references (210.722577ms)
|
||||||
|
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (316.076823ms)
|
||||||
|
✔ task projection uses schema current view, skipping earlier and equal-start polls (169.38238ms)
|
||||||
|
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (230.009469ms)
|
||||||
|
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (144.671024ms)
|
||||||
|
✔ both arbiters require human resolution when their cross-role route is themselves (266.265371ms)
|
||||||
|
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (210.633909ms)
|
||||||
|
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.433026ms)
|
||||||
|
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (246.705659ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (326.657944ms)
|
||||||
|
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (254.749039ms)
|
||||||
|
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (267.417052ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (275.088751ms)
|
||||||
|
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (278.518569ms)
|
||||||
|
✔ REQ-COS-1: the chief of staff cannot end its own run or the assistant's through role.end (288.807851ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (256.38867ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (337.87114ms)
|
||||||
|
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (297.056572ms)
|
||||||
|
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (412.259472ms)
|
||||||
|
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (651.307937ms)
|
||||||
|
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1176.18563ms)
|
||||||
|
✔ comment cursors isolate businesses, move only forward and remain append-only (118.136245ms)
|
||||||
|
✔ only trusted sync writes validated cursors; events and cursor share rollback (112.497162ms)
|
||||||
|
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (847.817256ms)
|
||||||
|
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1585.825719ms)
|
||||||
|
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (881.800721ms)
|
||||||
|
✔ migration refuses mismatched source metadata without changing schema or evidence (949.603435ms)
|
||||||
|
✔ offline command migrates only the supplied fixture root and reports usage errors (1149.112246ms)
|
||||||
|
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (101.306493ms)
|
||||||
|
✔ credentials refuses a role session and any argument (168.160521ms)
|
||||||
|
✔ credentials reads the status on each request, and a broker without one lists none (211.038963ms)
|
||||||
|
✔ the broker process answers credentials without a token, path or variable in its output, log or store (228.472124ms)
|
||||||
|
✔ only validated broker references load; returned data and exceptions cannot expose a known token (4.00558ms)
|
||||||
|
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (4.41877ms)
|
||||||
|
✔ expiry refuses use and env references never become client data (0.696483ms)
|
||||||
|
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.495284ms)
|
||||||
|
✔ opaque tokens shorter than 16 characters refuse before use (0.278469ms)
|
||||||
|
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (2.391418ms)
|
||||||
|
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (465.587113ms)
|
||||||
|
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (460.704203ms)
|
||||||
|
✔ chief-executive-officer: another C-suite role isn't on the lists either (435.90759ms)
|
||||||
|
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (478.233563ms)
|
||||||
|
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (485.519025ms)
|
||||||
|
✔ chief-financial-officer: another C-suite role isn't on the lists either (411.650058ms)
|
||||||
|
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (506.221186ms)
|
||||||
|
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (567.462014ms)
|
||||||
|
✔ chief-information-officer: another C-suite role isn't on the lists either (486.529759ms)
|
||||||
|
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (641.273402ms)
|
||||||
|
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (573.338972ms)
|
||||||
|
✔ chief-information-security-officer: another C-suite role isn't on the lists either (432.537028ms)
|
||||||
|
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (474.387193ms)
|
||||||
|
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (435.069446ms)
|
||||||
|
✔ chief-marketing-officer: another C-suite role isn't on the lists either (409.258351ms)
|
||||||
|
✔ a human resolve sends the raising role one message from the human, and its request is the answer (234.873073ms)
|
||||||
|
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (234.474783ms)
|
||||||
|
✔ a human withdraw sends one message with the note (244.483269ms)
|
||||||
|
✔ a human seen before the close leaves the request on the close's answer, not the seen (311.203051ms)
|
||||||
|
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (290.108897ms)
|
||||||
|
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (304.966897ms)
|
||||||
|
✔ a raising role nobody holds at the close gets the message on the next claim (284.228955ms)
|
||||||
|
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (245.78354ms)
|
||||||
|
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (293.642849ms)
|
||||||
|
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (289.555346ms)
|
||||||
|
✔ a route the raiser hears from is allowed, checked from the route to the raiser (354.090367ms)
|
||||||
|
✔ a refused supersede withdraws nothing (315.316466ms)
|
||||||
|
✔ the assistant's within-role and gated raises still work (304.521825ms)
|
||||||
|
✔ roles lists open decisions routed to a role, and never the human inbox (218.668476ms)
|
||||||
|
✔ recent lists closed decisions of every route, newest close first, with how each closed (285.8522ms)
|
||||||
|
✔ recent gives the closing event as closed when the decision was seen first (305.918506ms)
|
||||||
|
✔ recent stops at RECENT rows (836.83975ms)
|
||||||
|
✔ every row is what trail already gives the same session for that id (291.013109ms)
|
||||||
|
✔ a role session can't list decisions, so it can't read another role's open decisions (418.893184ms)
|
||||||
|
✔ decisions is a read: one business, strict arguments, nothing written (417.549319ms)
|
||||||
|
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (125.873816ms)
|
||||||
|
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (139.425984ms)
|
||||||
|
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (142.701541ms)
|
||||||
|
✔ endLaunch leaves a claim another run took alone (178.418176ms)
|
||||||
|
✔ refuse records action.refused against the caller with the code only (152.136743ms)
|
||||||
|
✔ launches off refuses role.launch with launch-revoked until launches on (197.700524ms)
|
||||||
|
✔ broker process: launch ops authorize role.launch, record refusals and end runs (358.768553ms)
|
||||||
|
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.891171ms)
|
||||||
|
✔ process reader gets own kernel identity without exposing environment values (0.562783ms)
|
||||||
|
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.896502ms)
|
||||||
|
✔ real pid 1 remains inspectable when its environment is protected (0.337478ms)
|
||||||
|
✖ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (251.698675ms)
|
||||||
|
✖ checkLand refuses on the decision and the review (271.998353ms)
|
||||||
|
✖ a merge option with no first line refuses no-subject, as land-work does (249.96045ms)
|
||||||
|
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (261.880846ms)
|
||||||
|
✖ a ticket outlives the run that asked, and recordLand checks the task again (239.557719ms)
|
||||||
|
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (261.776469ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (257.462367ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (180.797745ms)
|
||||||
|
✔ a message to a stopped role sends launch.by one notice, and the result says so (212.68727ms)
|
||||||
|
✔ a message to a role outside launch.instances says so in its result and in the notice (156.001011ms)
|
||||||
|
✔ a message to a running role sends no notice and its result is unchanged (141.407436ms)
|
||||||
|
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (250.120155ms)
|
||||||
|
✔ a run launched but not yet claimed counts as no holder (131.584568ms)
|
||||||
|
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (291.571469ms)
|
||||||
|
✔ a business with no launch block tells nobody and says there is no launcher (131.057905ms)
|
||||||
|
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (343.765708ms)
|
||||||
|
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (202.772346ms)
|
||||||
|
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (276.296566ms)
|
||||||
|
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (433.397652ms)
|
||||||
|
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (203.818503ms)
|
||||||
|
✔ missing and foreign-business citations refuse and roll back message and grant (193.03303ms)
|
||||||
|
✔ cross-role sends still need a matching resolved decision and consume it once (246.348276ms)
|
||||||
|
✔ messages pages all human messages newest first without writes; read state is history (2736.956684ms)
|
||||||
|
✔ messages refuses role callers, invalid paging and cursors outside this human feed (350.489486ms)
|
||||||
|
✔ views messages passes only its paging arguments through (0.330354ms)
|
||||||
|
✔ messages isolates businesses even with a valid foreign cursor (201.826917ms)
|
||||||
|
✔ the assistant sends to the user and to the chief of staff only (335.633359ms)
|
||||||
|
✔ an assistant send to any other role, or to the tester, is refused and logged (376.02215ms)
|
||||||
|
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (376.867904ms)
|
||||||
|
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (322.789916ms)
|
||||||
|
✔ a sender-side list alone refuses a send to a role that has no list (345.143558ms)
|
||||||
|
✔ a target-side list alone refuses a send from a role that has no list (356.297553ms)
|
||||||
|
✔ the sender list is checked before the target list (364.169697ms)
|
||||||
|
✔ roles without the field behave exactly as before (534.290305ms)
|
||||||
|
✔ a business with no role definitions at all is unlimited (417.614533ms)
|
||||||
|
✔ a malformed messaging field refuses at boot (120.573164ms)
|
||||||
|
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (524.027342ms)
|
||||||
|
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (470.5462ms)
|
||||||
|
✔ review requests and verdicts between roles without the field are unchanged (357.705211ms)
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (219.722597ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (521.783388ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (440.001994ms)
|
||||||
|
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (241.113797ms)
|
||||||
|
✔ startup token refusal returns safe code without value or partial listening broker (81.958897ms)
|
||||||
|
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (236.181575ms)
|
||||||
|
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (275.039792ms)
|
||||||
|
✔ trusted host registers later launches; socket clients never have a registration verb (228.440239ms)
|
||||||
|
✔ runtime excludes declared project roots even when host supplies no repoRoots (77.496756ms)
|
||||||
|
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (197.910674ms)
|
||||||
|
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (162.815337ms)
|
||||||
|
✔ D2: spec.read refuses without content if its role is released during the read (164.702208ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged content without content (147.159495ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged subject without content (137.947353ms)
|
||||||
|
✖ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (2.074077ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (232.796731ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (220.860931ms)
|
||||||
|
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (237.042825ms)
|
||||||
|
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (205.705566ms)
|
||||||
|
✔ a message with no reply gives an empty list (175.75095ms)
|
||||||
|
✔ replies come oldest first and stop at REPLIES (775.050895ms)
|
||||||
|
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (399.607373ms)
|
||||||
|
✔ strict arguments; a role session gets human-required (387.639921ms)
|
||||||
|
✔ views passes replies through as one call with the id (0.267351ms)
|
||||||
|
✔ requirements returns the committed list to a holding role session, and no one else (226.570569ms)
|
||||||
|
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (148.561691ms)
|
||||||
|
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (206.770021ms)
|
||||||
|
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (255.905917ms)
|
||||||
|
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (252.025607ms)
|
||||||
|
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (276.91177ms)
|
||||||
|
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (430.414621ms)
|
||||||
|
✔ reviewFetch answers only the addressed reviewer, for the request it cites (328.835711ms)
|
||||||
|
✔ review.verdict answers one request once, to the role that asked (364.529318ms)
|
||||||
|
✔ task.close on a pushed task needs an approve verdict for the latest push (470.555475ms)
|
||||||
|
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (382.899139ms)
|
||||||
|
✔ v3b prototype refusals, views and append-only mutations (1646.850984ms)
|
||||||
|
✔ gated approval authorizes once, survives store reopen, and fresh approval works (281.624204ms)
|
||||||
|
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (206.458712ms)
|
||||||
|
✔ two scheduled callers have exactly one grant and one consumed refusal (158.814102ms)
|
||||||
|
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (361.047459ms)
|
||||||
|
✔ class drift gated to cross-role refuses before consumption (301.578832ms)
|
||||||
|
✔ class drift cross-role to gated refuses before consumption (274.956218ms)
|
||||||
|
✔ class drift gated to within-role refuses before consumption (293.475013ms)
|
||||||
|
✔ class drift cross-role to within-role refuses before consumption (298.074973ms)
|
||||||
|
✔ class drift within-role to gated refuses before consumption (322.993141ms)
|
||||||
|
✔ class drift within-role to cross-role refuses before consumption (291.933089ms)
|
||||||
|
✔ message.send consumes approval and prevents a later send or authorize (273.588487ms)
|
||||||
|
✔ role.revoke consumes approval and prevents a later revoke or authorize (304.31343ms)
|
||||||
|
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1517.517785ms)
|
||||||
|
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (280.96622ms)
|
||||||
|
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (218.74477ms)
|
||||||
|
✔ two real socket writes to one repository yield one commit and one project-busy refusal (330.036646ms)
|
||||||
|
✔ client disconnect during await tolerates late reply (193.94252ms)
|
||||||
|
✔ client disconnect during await tolerates late refusal (188.722535ms)
|
||||||
|
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (446.561423ms)
|
||||||
|
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (325.788404ms)
|
||||||
|
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (394.908448ms)
|
||||||
|
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (302.06813ms)
|
||||||
|
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (291.923846ms)
|
||||||
|
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (257.045507ms)
|
||||||
|
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (358.525504ms)
|
||||||
|
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (230.116836ms)
|
||||||
|
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (486.221833ms)
|
||||||
|
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (479.789283ms)
|
||||||
|
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (548.521633ms)
|
||||||
|
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (282.377581ms)
|
||||||
|
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (663.935827ms)
|
||||||
|
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (457.088912ms)
|
||||||
|
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (234.495545ms)
|
||||||
|
✔ a business that never switched launches reads allowed with no time and no event (176.574662ms)
|
||||||
|
✔ launches revoked and then restored read allowed, with the restore time and event id (239.118619ms)
|
||||||
|
✔ a task closed on the tracker leaves the open list, and total counts the open ones (158.376647ms)
|
||||||
|
✔ a tombstone is not open (160.736199ms)
|
||||||
|
✔ the open list stops at the cap and says so; total still counts every open task (148.509209ms)
|
||||||
|
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (200.77214ms)
|
||||||
|
✔ a human session reads the same state, with the same cap (179.792362ms)
|
||||||
|
✔ reading state writes nothing: every table keeps its row count (187.955769ms)
|
||||||
|
✔ creates private WAL store and excludes a second writer until explicit close (182.3317ms)
|
||||||
|
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (198.594739ms)
|
||||||
|
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (225.938935ms)
|
||||||
|
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (221.318894ms)
|
||||||
|
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (124.673247ms)
|
||||||
|
✔ async transactions refuse before invoking their function (117.021873ms)
|
||||||
|
✔ the session default fits under the reply cap and pages to the end with next (383.492014ms)
|
||||||
|
✔ the short form: no description, assignees by role, every listed key (307.144225ms)
|
||||||
|
✔ each filter, alone and together, and total counts every match (465.120843ms)
|
||||||
|
✔ task_ref reads one task in full, as the whole board has it (397.038186ms)
|
||||||
|
✔ no arguments is the read the Console and mosaic make, unchanged (278.752867ms)
|
||||||
|
✔ an unknown argument or a bad value refuses invalid-request (1016.259495ms)
|
||||||
|
✔ tasks rows carry priority and requirement for every session that reads tasks (387.143416ms)
|
||||||
|
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (413.43234ms)
|
||||||
|
✔ an empty business and one with snapshots but no task.created read cleanly (174.507851ms)
|
||||||
|
✔ recordTask keeps sync reads and a role write apart (239.284441ms)
|
||||||
|
✔ read_at must be one canonical UTC format, so the projection compares strings safely (132.004003ms)
|
||||||
|
✔ a bad entry refuses the whole record (121.105267ms)
|
||||||
|
✔ taskView reads the projection for one business (191.396833ms)
|
||||||
|
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (361.891756ms)
|
||||||
|
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (441.789101ms)
|
||||||
|
✔ without an adapter the server refuses every task verb (234.67147ms)
|
||||||
|
✔ the runtime refuses an invalid adapter and closes a valid one (257.321858ms)
|
||||||
|
✔ the process loads the S3 adapter from plain-data trackers (352.673986ms)
|
||||||
|
✔ the tester binds only when the business sets bus.tester to exactly true (1063.802589ms)
|
||||||
|
✔ a business may not name a role tester, so the tester address is never a role (280.267126ms)
|
||||||
|
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (607.792776ms)
|
||||||
|
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (238.527938ms)
|
||||||
|
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (266.218743ms)
|
||||||
|
✔ the tester reads the human views a reader reads (186.010192ms)
|
||||||
|
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.392009ms)
|
||||||
|
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.396415ms)
|
||||||
|
✔ testerNonce reads only the tester's variable and gives null on any read error (0.236377ms)
|
||||||
|
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (114.743952ms)
|
||||||
|
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (976.344086ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1309.130998ms)
|
||||||
|
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (880.350161ms)
|
||||||
|
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (856.018418ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (452.002637ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1316.367475ms)
|
||||||
|
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (345.100581ms)
|
||||||
|
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3609.36047ms)
|
||||||
|
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (100.908296ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (158.341625ms)
|
||||||
|
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (168.688742ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (164.772802ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (146.689436ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (132.197711ms)
|
||||||
|
✔ REQ-USER-2: the human verbs refuse another owner's thread (160.4486ms)
|
||||||
|
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (128.377522ms)
|
||||||
|
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (150.953193ms)
|
||||||
|
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (547.448518ms)
|
||||||
|
✔ socket capability stamps launch identity; shared views use wire, no SQL client (255.351931ms)
|
||||||
|
✔ two wire claims serialize; a lost reply never automatically retries (251.263242ms)
|
||||||
|
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (143.08084ms)
|
||||||
|
✔ client preserves UTF-8 when a response divides a multibyte character (12.692636ms)
|
||||||
|
✔ committed mutation followed by dropped reply reports unknown and is never retried (168.034534ms)
|
||||||
|
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (253.051245ms)
|
||||||
|
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (212.723667ms)
|
||||||
|
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (233.431633ms)
|
||||||
|
✔ a broker with no web service refuses a granted role (168.3812ms)
|
||||||
|
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (225.068426ms)
|
||||||
|
✔ a session that is not the role holder is refused (160.720599ms)
|
||||||
|
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (404.553886ms)
|
||||||
|
✔ web.search with no search source configured is a refused result, not an error (151.34125ms)
|
||||||
|
✔ a search source that fails with its own refusal, or that throws, is handled (182.50646ms)
|
||||||
|
✔ a slow search source ends in a refusal at the deadline (196.484324ms)
|
||||||
|
✔ a secret in the arguments is refused before anything is trailed or fetched (136.476069ms)
|
||||||
|
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (246.239771ms)
|
||||||
|
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.304299ms)
|
||||||
|
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (209.536361ms)
|
||||||
|
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (153.95907ms)
|
||||||
|
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (456.651467ms)
|
||||||
|
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (176.285303ms)
|
||||||
|
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (202.452522ms)
|
||||||
|
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (169.182866ms)
|
||||||
|
ℹ tests 302
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 295
|
||||||
|
ℹ fail 7
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 12151.056693
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:87:1
|
||||||
|
✖ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (251.698675ms)
|
||||||
|
Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:90:17)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.start (node:internal/test_runner/test:1262:17)
|
||||||
|
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||||
|
code: 'decision-not-found'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:137:1
|
||||||
|
✖ checkLand refuses on the decision and the review (271.998353ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-verdict/. Input:
|
||||||
|
|
||||||
|
'Error: decision-not-found'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at check (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:139:36)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:23
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:160:10),
|
||||||
|
expected: /no-verdict/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:168:1
|
||||||
|
✖ a merge option with no first line refuses no-subject, as land-work does (249.96045ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-subject/. Input:
|
||||||
|
|
||||||
|
'Error: decision-not-found'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:27
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:179:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14),
|
||||||
|
expected: /no-subject/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:185:1
|
||||||
|
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (261.880846ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /work-ref/. Input:
|
||||||
|
|
||||||
|
'Error: decision-not-found'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:195:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:187:34
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:195:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14),
|
||||||
|
expected: /work-ref/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:218:1
|
||||||
|
✖ a ticket outlives the run that asked, and recordLand checks the task again (239.557719ms)
|
||||||
|
Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:221:26)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19) {
|
||||||
|
code: 'decision-not-found'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:235:1
|
||||||
|
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (261.776469ms)
|
||||||
|
Error: decision-not-found
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:85:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:775:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:761:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/src/broker.mjs:756:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/land.test.mjs:238:21)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19) {
|
||||||
|
code: 'decision-not-found'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/project-runtime.test.mjs:12:1
|
||||||
|
✖ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (2.074077ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
[
|
||||||
|
"import { randomUUID, randomBytes } from 'node:crypto';",
|
||||||
|
"import { loadRequirements } from '../../tasks/src/requirements.mjs';",
|
||||||
|
+ "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';"
|
||||||
|
]
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/bus/tests/project-runtime.test.mjs:14:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.start (node:internal/test_runner/test:1262:17)
|
||||||
|
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: [ "import { randomUUID, randomBytes } from 'node:crypto';", "import { loadRequirements } from '../../tasks/src/requirements.mjs';", "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';" ],
|
||||||
|
expected: [ "import { randomUUID, randomBytes } from 'node:crypto';", "import { loadRequirements } from '../../tasks/src/requirements.mjs';" ],
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (5355.268474ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1491.150316ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4369.024927ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2805.354208ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (50.252057ms)
|
||||||
|
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (150.180822ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (178.824534ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (45.955149ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14537.475334
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1586.54654ms)
|
||||||
|
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (85.154678ms)
|
||||||
|
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (241.09577ms)
|
||||||
|
✔ NO_COLOR: no escape codes, except reverse video on the selected row (311.198065ms)
|
||||||
|
✔ 1-9 shows the decide flow's own lines and question; only y resolves (202.245549ms)
|
||||||
|
✔ the app shows the same decide text as mosaic decide (111.612001ms)
|
||||||
|
✔ any key but y or Y at the question answers No; nothing is sent (2965.181872ms)
|
||||||
|
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (484.467652ms)
|
||||||
|
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1681.765701ms)
|
||||||
|
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (136.021747ms)
|
||||||
|
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (138.620791ms)
|
||||||
|
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (891.976905ms)
|
||||||
|
✔ quitting at the question answers No and sends nothing, armed or not (205.885793ms)
|
||||||
|
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (193.390657ms)
|
||||||
|
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (141.573484ms)
|
||||||
|
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (1003.140373ms)
|
||||||
|
✔ at every size the decide box shows each line y depends on, or says it is hidden (8769.924433ms)
|
||||||
|
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (154.957595ms)
|
||||||
|
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (161.821857ms)
|
||||||
|
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (82.034227ms)
|
||||||
|
✔ keys: views, moving, trail of a selection, the command line, help and quit (260.527119ms)
|
||||||
|
✔ one option: the status line says Press 1, not 1-1 (98.222316ms)
|
||||||
|
✔ no business: the app says so and :business picks one (50.30584ms)
|
||||||
|
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.808598ms)
|
||||||
|
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (172.042218ms)
|
||||||
|
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.464708ms)
|
||||||
|
✔ decide with --note still asks; a No sends nothing (68.612248ms)
|
||||||
|
✔ the app's business comes from a live bus host only (0.953571ms)
|
||||||
|
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.67894ms)
|
||||||
|
✔ draw is pure: same state, same frame (0.713452ms)
|
||||||
|
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (5.037102ms)
|
||||||
|
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (867.148087ms)
|
||||||
|
✔ a missing file is recorded too, and a valid file clears the status on the next start (491.247325ms)
|
||||||
|
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (241.566981ms)
|
||||||
|
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (145.79187ms)
|
||||||
|
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (122.887234ms)
|
||||||
|
✔ decide prints a declining choice as declining (210.407708ms)
|
||||||
|
✔ an unknown outcome is reported once and never resent (183.588922ms)
|
||||||
|
✔ a decision closed before the answer arrives exits 2 and points at its trail (133.895776ms)
|
||||||
|
✔ a prefix that matches two open decisions exits 2 and resolves neither (115.014525ms)
|
||||||
|
✔ without --business a command uses the live host's business, and a stale host.json is not a host (177.865231ms)
|
||||||
|
✔ every human command refuses inside an agent run before it touches the bus (101.555991ms)
|
||||||
|
✔ usage errors exit 4; no business and no host is a usage error (96.217485ms)
|
||||||
|
✔ agents and tasks print through the broker (101.223497ms)
|
||||||
|
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (3.83694ms)
|
||||||
|
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (71.180132ms)
|
||||||
|
✔ trackers come from the tracker.* variables of the one project that names a tracker project (116.307676ms)
|
||||||
|
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (50.667744ms)
|
||||||
|
✔ two projects that each name a tracker project refuse, since the boot shape holds one (42.096612ms)
|
||||||
|
✔ a business without tracker.baseUrl gets no trackers entry (38.095144ms)
|
||||||
|
✔ an unknown business and a broken system config refuse with exit 3 (82.951068ms)
|
||||||
|
✔ follow prints an unsolicited message after plain talk returned (293.530529ms)
|
||||||
|
✔ talk --follow continues after reply and prints a later unsolicited message (200.981749ms)
|
||||||
|
✔ inbox lists all unread human messages under decisions, does not deliver or read them (2836.214856ms)
|
||||||
|
✔ follow refuses agent context and bad arguments (791.286088ms)
|
||||||
|
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (488.069176ms)
|
||||||
|
✔ plain talk leaves the process SIGINT handlers unchanged (380.438616ms)
|
||||||
|
✔ empty views say so (1.084811ms)
|
||||||
|
✔ the trail keeps the broker's order and names a decision's task without its rows (1.332596ms)
|
||||||
|
✔ tasks print the tracker fields the snapshot carries (0.246354ms)
|
||||||
|
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (971.292957ms)
|
||||||
|
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (834.085703ms)
|
||||||
|
✔ the size cap refuses a push before any byte (435.670784ms)
|
||||||
|
✔ a fetch over the cap refuses before any byte reaches the reviewer (658.671094ms)
|
||||||
|
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (1421.403537ms)
|
||||||
|
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1182.864034ms)
|
||||||
|
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (440.342446ms)
|
||||||
|
✔ a review of a project the business no longer has refuses unknown-project (608.242609ms)
|
||||||
|
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (309.593048ms)
|
||||||
|
✔ close() answers host-closing to a connection still sending its request line (351.120084ms)
|
||||||
|
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (897.782249ms)
|
||||||
|
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (818.554008ms)
|
||||||
|
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (745.729918ms)
|
||||||
|
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.491929ms)
|
||||||
|
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (584.219189ms)
|
||||||
|
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (44.066289ms)
|
||||||
|
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.837235ms)
|
||||||
|
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (515.458198ms)
|
||||||
|
✖ land: the squash runs the gate in its own worktree, then main moves and the broker records it (405.51588ms)
|
||||||
|
✔ land: refusals before the gate answer the role at once and leave main and no worktree (425.891445ms)
|
||||||
|
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (393.989817ms)
|
||||||
|
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (389.474689ms)
|
||||||
|
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (368.681583ms)
|
||||||
|
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1041.793769ms)
|
||||||
|
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (296.619584ms)
|
||||||
|
✔ a second host for the same data root refuses with exit 3 while the first runs (219.812506ms)
|
||||||
|
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (750.841709ms)
|
||||||
|
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (2.787137ms)
|
||||||
|
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (1.35886ms)
|
||||||
|
✔ a live host's lock stays, however old the file is (0.719969ms)
|
||||||
|
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (997.571568ms)
|
||||||
|
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (204.431841ms)
|
||||||
|
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (45.72049ms)
|
||||||
|
✔ a broker fork that throws leaves no host.lock and no host.json (28.699467ms)
|
||||||
|
✔ a broker send that throws leaves no host.lock and no host.json (29.31541ms)
|
||||||
|
✔ a broker that misses its boot wait leaves no host.lock and no host.json (48.839654ms)
|
||||||
|
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (670.652778ms)
|
||||||
|
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (547.854572ms)
|
||||||
|
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (384.788051ms)
|
||||||
|
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (201.956185ms)
|
||||||
|
✔ a host.json that can't be written stops both children and leaves no host.lock (296.389569ms)
|
||||||
|
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (29.775815ms)
|
||||||
|
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (180.582127ms)
|
||||||
|
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (336.938125ms)
|
||||||
|
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (401.251593ms)
|
||||||
|
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (291.839473ms)
|
||||||
|
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1246.70776ms)
|
||||||
|
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (462.02535ms)
|
||||||
|
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (199.203098ms)
|
||||||
|
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (270.260742ms)
|
||||||
|
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (243.483793ms)
|
||||||
|
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (173.551652ms)
|
||||||
|
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (208.323474ms)
|
||||||
|
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (163.750364ms)
|
||||||
|
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (235.634201ms)
|
||||||
|
✔ watchChildren reports a child that died before it was called, and one that dies later (25.005153ms)
|
||||||
|
✔ bus stop refuses to signal a live pid that is not a bus host (202.610935ms)
|
||||||
|
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (312.746842ms)
|
||||||
|
✔ bus start refuses with exit 3 without a notifier config (118.252934ms)
|
||||||
|
✔ bus start runs until bus stop; status reports it while it runs (806.388256ms)
|
||||||
|
✔ bus-service.sh renders the unit and installs it into a given directory (62.869069ms)
|
||||||
|
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (75.434352ms)
|
||||||
|
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (16.064265ms)
|
||||||
|
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (10.570917ms)
|
||||||
|
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (47.714601ms)
|
||||||
|
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (47.18683ms)
|
||||||
|
✔ limits view/set use the human bus transport and pass only the explicit patch (1.965794ms)
|
||||||
|
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (247.458073ms)
|
||||||
|
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (2.750049ms)
|
||||||
|
✔ zoned uses the IANA zone across DST (28.565406ms)
|
||||||
|
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (236.010176ms)
|
||||||
|
✔ two blocking decisions get two DMs with different nonces (144.382429ms)
|
||||||
|
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.300151ms)
|
||||||
|
✔ a failed DM is journaled, backs off, and is retried until it lands (125.390755ms)
|
||||||
|
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (204.217673ms)
|
||||||
|
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (192.586092ms)
|
||||||
|
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (132.48634ms)
|
||||||
|
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (226.611067ms)
|
||||||
|
✔ a restart after the second refusal does not send before that refusal's 30 min are up (233.992363ms)
|
||||||
|
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (118.320469ms)
|
||||||
|
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (94.655551ms)
|
||||||
|
✔ an inbox read failure is logged and the next poll retries (1.409802ms)
|
||||||
|
✔ no Discord id reaches the journal or the log (113.249298ms)
|
||||||
|
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (71.286517ms)
|
||||||
|
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (54.509437ms)
|
||||||
|
✔ the journal: a whole file that is one torn line truncates to empty (29.435327ms)
|
||||||
|
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (2.300847ms)
|
||||||
|
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (2.827955ms)
|
||||||
|
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.526814ms)
|
||||||
|
✔ the journal: a symlinked directory refuses and says it is a link (0.597224ms)
|
||||||
|
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.585617ms)
|
||||||
|
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.467884ms)
|
||||||
|
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.519466ms)
|
||||||
|
✔ digest content stays within Discord's 2000 characters (0.368765ms)
|
||||||
|
✔ runLoop never overlaps ticks and stops after the one in flight (110.36339ms)
|
||||||
|
✔ a human command refused with human-required prints the other-tree line and exits 3 (4.006243ms)
|
||||||
|
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.585394ms)
|
||||||
|
✔ other exit-3 refusals print no other-tree line (2.246136ms)
|
||||||
|
✔ the line names no path (0.15946ms)
|
||||||
|
✔ project init/check use declared business repo and never contact the bus (182.263126ms)
|
||||||
|
✔ project commands validate args and refuse undeclared projects and agent init (35.65919ms)
|
||||||
|
✔ project dispatcher reaches the human CLI (117.090338ms)
|
||||||
|
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (758.840692ms)
|
||||||
|
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (499.524781ms)
|
||||||
|
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (594.108914ms)
|
||||||
|
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (303.569235ms)
|
||||||
|
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4415.630353ms)
|
||||||
|
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (526.939803ms)
|
||||||
|
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (202.019081ms)
|
||||||
|
✔ install never shows a template name on systemd 261; template drop-ins still refuse (220.617525ms)
|
||||||
|
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (191.803318ms)
|
||||||
|
✔ inherited mosaic-.service.d override refuses without changing the unit (192.633764ms)
|
||||||
|
✔ inherited service.d override refuses without changing the unit (213.873028ms)
|
||||||
|
✔ inherited drop-in unreadable directory or file refuses before writing (205.226014ms)
|
||||||
|
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (224.693752ms)
|
||||||
|
✔ talk --tester refuses text without the [mos test] prefix before any call (114.418366ms)
|
||||||
|
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (129.233542ms)
|
||||||
|
✔ decide, stop and launches take no --tester (189.784694ms)
|
||||||
|
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.406072ms)
|
||||||
|
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.656394ms)
|
||||||
|
✔ talk --tester to a stopped role says nobody is told to launch it (174.753155ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20289.307699ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (264.278986ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30132.369423ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20166.195003ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (123.779554ms)
|
||||||
|
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20203.107203ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (257.451435ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (104.2624ms)
|
||||||
|
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
|
||||||
|
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
|
||||||
|
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (523.56421ms)
|
||||||
|
✔ the transport writes {business, verb, args} to the child and reads its JSON (51.20011ms)
|
||||||
|
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2188.017122ms)
|
||||||
|
✔ busExit and refuseInsideAgent (0.635562ms)
|
||||||
|
✔ talk sends a REQUEST, prints and reads only the reply to it, and leaves other messages unread (366.400166ms)
|
||||||
|
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1159.768427ms)
|
||||||
|
✔ a late reply the Console has listed stays unread for mosaic inbox, and the next talk skips it (2346.666044ms)
|
||||||
|
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (944.888744ms)
|
||||||
|
✔ talk to a role launch.by can't launch says it isn't in the launch block (144.870441ms)
|
||||||
|
✔ talk to a stopped role prints the waiting line once, skips a non-reply and prints the reply (236.244028ms)
|
||||||
|
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (109.627425ms)
|
||||||
|
✔ launches off and on go to the broker and change the business's launch state (101.990085ms)
|
||||||
|
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (119.454281ms)
|
||||||
|
ℹ tests 202
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 196
|
||||||
|
ℹ fail 6
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 91785.656988
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/git-socket.test.mjs:681:1
|
||||||
|
✖ land: the squash runs the gate in its own worktree, then main moves and the broker records it (405.51588ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Applied-under: git socket land (bus host)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/git-socket.test.mjs:704:201)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: false,
|
||||||
|
expected: true,
|
||||||
|
operator: '==',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:157:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20289.307699ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async ask (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:143:17)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:169:17)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:205:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (264.278986ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
+ 'launch-failed'
|
||||||
|
- 'capacity-full'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:216:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: 'launch-failed',
|
||||||
|
expected: 'capacity-full',
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:230:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30132.369423ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:240:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:247:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20166.195003ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:268:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:305:1
|
||||||
|
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20203.107203ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:319:15)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20089.359097ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (213.225675ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30097.204022ms)
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20111.345033ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (64.830451ms)
|
||||||
|
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20124.549297ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (188.933703ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (65.066059ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 3
|
||||||
|
ℹ fail 5
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 91061.303114
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:157:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (20089.359097ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async ask (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:143:17)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:169:17)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:205:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (213.225675ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
+ 'launch-failed'
|
||||||
|
- 'capacity-full'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:216:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: 'launch-failed',
|
||||||
|
expected: 'capacity-full',
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:230:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (30097.204022ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:240:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:247:1
|
||||||
|
✖ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (20111.345033ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:268:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at tests/thread-launch.test.mjs:305:1
|
||||||
|
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (20124.549297ms)
|
||||||
|
Error: timed out waiting
|
||||||
|
at until (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/thread-launch.test.mjs:319:15)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1202.307722ms)
|
||||||
|
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (431.292479ms)
|
||||||
|
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (879.568947ms)
|
||||||
|
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3595.780022ms)
|
||||||
|
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (362.623568ms)
|
||||||
|
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (142.570763ms)
|
||||||
|
✔ a runner that stops at once ends its launch with the runner's reason (209.45992ms)
|
||||||
|
✔ a Claude Code launch with no session credential refuses before it starts (113.602047ms)
|
||||||
|
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (195.268534ms)
|
||||||
|
✔ a runner killed from the host ends its launch as killed, not failed (260.755627ms)
|
||||||
|
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (119.116659ms)
|
||||||
|
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1017.539544ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (668.125675ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3653.685549ms)
|
||||||
|
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (124.518299ms)
|
||||||
|
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (123.525994ms)
|
||||||
|
✔ a launch client that never closes its side doesn't hold the host's close (127.649735ms)
|
||||||
|
✔ a runner that ignores SIGTERM is killed when the host closes (1268.041829ms)
|
||||||
|
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.577645ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14588.082229
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1221.688504ms)
|
||||||
|
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (431.583027ms)
|
||||||
|
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (883.815567ms)
|
||||||
|
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3596.266654ms)
|
||||||
|
✖ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (107.851503ms)
|
||||||
|
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (138.328266ms)
|
||||||
|
✔ a runner that stops at once ends its launch with the runner's reason (208.047689ms)
|
||||||
|
✔ a Claude Code launch with no session credential refuses before it starts (114.70623ms)
|
||||||
|
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (222.613902ms)
|
||||||
|
✔ a runner killed from the host ends its launch as killed, not failed (325.826349ms)
|
||||||
|
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (124.477897ms)
|
||||||
|
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1142.29206ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (674.537386ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3614.297677ms)
|
||||||
|
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (113.518859ms)
|
||||||
|
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (113.663326ms)
|
||||||
|
✔ a launch client that never closes its side doesn't hold the host's close (119.225169ms)
|
||||||
|
✔ a runner that ignores SIGTERM is killed when the host closes (1234.844201ms)
|
||||||
|
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.595537ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 18
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14488.29819
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/launcher.test.mjs:391:1
|
||||||
|
✖ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (107.851503ms)
|
||||||
|
TypeError: Cannot assign to read only property 'op' of object '#<Object>'
|
||||||
|
at Object.assign (<anonymous>)
|
||||||
|
at wrap (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:393:57)
|
||||||
|
at setup (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:92:13)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/cli/tests/launcher.test.mjs:397:15)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.424583ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.150863ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (35.25504ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.27315ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (141.957345ms)
|
||||||
|
✔ runGate: the first failing step stops the gate and names its log (213.391947ms)
|
||||||
|
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.113586ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (529.928359ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1132.663811
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
✔ a first launch clones the root at its branch, with the root's path as origin (33.780741ms)
|
||||||
|
✔ the clone is not at its place until git clone has finished (23.824884ms)
|
||||||
|
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (68.084632ms)
|
||||||
|
✔ a clone ahead of the root keeps its commits and counts as current (44.68769ms)
|
||||||
|
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||||
|
✔ a modified file (48.03528ms)
|
||||||
|
✔ an untracked file (46.359055ms)
|
||||||
|
✔ a staged file (43.079086ms)
|
||||||
|
✔ another branch (42.915501ms)
|
||||||
|
✔ a detached HEAD (49.981539ms)
|
||||||
|
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (231.50517ms)
|
||||||
|
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (49.275804ms)
|
||||||
|
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||||
|
✔ not-a-clone (30.129059ms)
|
||||||
|
✔ hooks-present (29.626879ms)
|
||||||
|
✔ submodule (38.181524ms)
|
||||||
|
✔ config-changed (32.597796ms)
|
||||||
|
✔ root-unreadable (31.817972ms)
|
||||||
|
✔ root-detached (35.217986ms)
|
||||||
|
✔ status-failed, on the root's branch and clean (37.881384ms)
|
||||||
|
✔ status-failed, dirty (36.624416ms)
|
||||||
|
✔ a clone kept before the branch check, or for a failed status, gets no fetch (273.378164ms)
|
||||||
|
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (37.661727ms)
|
||||||
|
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (50.16932ms)
|
||||||
|
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (78.93048ms)
|
||||||
|
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||||
|
✔ user.name (26.868432ms)
|
||||||
|
✔ user.email (27.934343ms)
|
||||||
|
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (55.265042ms)
|
||||||
|
✔ a commit git can't read after the fast-forward is null (48.984355ms)
|
||||||
|
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (21.541438ms)
|
||||||
|
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||||
|
✔ core.fsmonitor (35.603151ms)
|
||||||
|
✔ core.hooksPath (34.737046ms)
|
||||||
|
✔ a hook file (33.232331ms)
|
||||||
|
✔ include.path (36.30016ms)
|
||||||
|
✔ includeIf (35.232282ms)
|
||||||
|
✔ a filter driver (32.900995ms)
|
||||||
|
✔ origin moved (33.949975ms)
|
||||||
|
✔ a second origin url (34.74862ms)
|
||||||
|
✔ the origin url twice, both the root (34.966195ms)
|
||||||
|
✔ an ext:: origin (37.636707ms)
|
||||||
|
✔ a branch tracking another remote (32.251826ms)
|
||||||
|
✔ a branch merging a tag (33.575779ms)
|
||||||
|
✔ a fetch line onto local branches (34.315906ms)
|
||||||
|
✔ no origin (38.652341ms)
|
||||||
|
✔ a config file over the size cap (36.21229ms)
|
||||||
|
✔ config a symlink to /dev/zero (34.640648ms)
|
||||||
|
✔ the clone a symlink to the bait (31.285268ms)
|
||||||
|
✔ the clone a file (32.583438ms)
|
||||||
|
✔ the clone a plain directory (33.026692ms)
|
||||||
|
✔ .git a gitdir: file (31.237799ms)
|
||||||
|
✔ .git a symlink (30.421966ms)
|
||||||
|
✔ .git/logs a symlink (31.363094ms)
|
||||||
|
✔ .git/refs/heads a symlink (32.354658ms)
|
||||||
|
✔ .git/objects a symlink (33.31079ms)
|
||||||
|
✔ a reflog hard-linked to a file outside (32.521602ms)
|
||||||
|
✔ HEAD a fifo (31.320266ms)
|
||||||
|
✔ a commondir file (33.454178ms)
|
||||||
|
✔ an alternates file (31.914408ms)
|
||||||
|
✔ a gitlink staged, no .gitmodules (45.229707ms)
|
||||||
|
✔ a gitlink and .gitmodules staged (45.616457ms)
|
||||||
|
✔ a gitlink to a repository with its own gitlink (52.44187ms)
|
||||||
|
✔ a gitlink and .gitmodules committed (47.801858ms)
|
||||||
|
✔ a gitlink and submodule.active in config (46.540826ms)
|
||||||
|
✔ a .git/modules with no gitlink (33.556382ms)
|
||||||
|
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1219.218153ms)
|
||||||
|
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||||
|
✔ missing (9.940027ms)
|
||||||
|
✔ not a repository (9.805732ms)
|
||||||
|
✔ a plain directory inside another repository (15.698224ms)
|
||||||
|
✔ unreadable (11.842842ms)
|
||||||
|
✔ on no branch (11.847933ms)
|
||||||
|
✔ missing an object (18.513393ms)
|
||||||
|
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (78.431515ms)
|
||||||
|
✔ a clone whose root is on no branch, or gone, is kept and named (28.240299ms)
|
||||||
|
✔ no credential or forge remote of the root reaches a clone (48.117801ms)
|
||||||
|
✔ every project in the business file gets its own clone at its own branch (35.215117ms)
|
||||||
|
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.254587ms)
|
||||||
|
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1015.975689ms)
|
||||||
|
✔ a timeout signals git's process group, so a process git started dies with it (512.959495ms)
|
||||||
|
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (513.521346ms)
|
||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.547572ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.162313ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.068869ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.387808ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (157.717577ms)
|
||||||
|
✖ runGate: the first failing step stops the gate and names its log (147.364142ms)
|
||||||
|
✖ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.168203ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (550.085413ms)
|
||||||
|
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.985402ms)
|
||||||
|
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.851839ms)
|
||||||
|
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.279942ms)
|
||||||
|
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.84569ms)
|
||||||
|
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.691092ms)
|
||||||
|
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.199414ms)
|
||||||
|
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1707.874339ms)
|
||||||
|
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2469.427669ms)
|
||||||
|
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (263.65085ms)
|
||||||
|
✔ resolveSeat: by name under --repo resolves the repo layout (1.252956ms)
|
||||||
|
✔ resolveSeat: by path resolves the fleet layout (0.315026ms)
|
||||||
|
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.741634ms)
|
||||||
|
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.647829ms)
|
||||||
|
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.896433ms)
|
||||||
|
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.354151ms)
|
||||||
|
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.185631ms)
|
||||||
|
✔ CLI launch: registers, execs the fake launch script, and passes args through (29.540712ms)
|
||||||
|
✔ CLI launch: --harness lands in the record (28.689824ms)
|
||||||
|
✔ CLI launch: the launch script's own exit code passes through (26.996727ms)
|
||||||
|
✔ CLI launch: relaunching a seat rewrites the one registration record (61.34607ms)
|
||||||
|
✔ CLI launch: omitting --task records an empty string, not null (28.79304ms)
|
||||||
|
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (83.001905ms)
|
||||||
|
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (135.400989ms)
|
||||||
|
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.478489ms)
|
||||||
|
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.706764ms)
|
||||||
|
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.71127ms)
|
||||||
|
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.171762ms)
|
||||||
|
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (269.787114ms)
|
||||||
|
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.801036ms)
|
||||||
|
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.689715ms)
|
||||||
|
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.269757ms)
|
||||||
|
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.466905ms)
|
||||||
|
✔ session file and launch log: 0600, the session file written once (1.010292ms)
|
||||||
|
✔ endReason maps the runner's exit codes; a signal is killed (0.116223ms)
|
||||||
|
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.193741ms)
|
||||||
|
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.588223ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (2.867402ms)
|
||||||
|
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.871553ms)
|
||||||
|
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (281.694173ms)
|
||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.147966ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (160.304935ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (136.741882ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (72.040763ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (49.363452ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (173.705653ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (96.934926ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (89.154899ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (54.575858ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (99.122228ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (156.481748ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (396.377187ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (31.210664ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2195.080989ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1029.037334ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (23.617561ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (120.949682ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (13.391771ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.241609ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (215.29908ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (147.057776ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (121.311561ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (361.948194ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (247.841541ms)
|
||||||
|
ℹ tests 148
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 146
|
||||||
|
ℹ fail 2
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6055.97211
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/landing.test.mjs:126:1
|
||||||
|
✖ runGate: the first failing step stops the gate and names its log (147.364142ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/landing.test.mjs:132:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/landing.test.mjs:142:1
|
||||||
|
✖ runGate: an abort stops the running step and everything in its group, and runs nothing after it (163.168203ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/landing.test.mjs:163:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
base 7a2987cf5 DOCKER_HOST=unset docker=29.7.2 start 18:49:43
|
||||||
|
pkg-bus rc=0 18:49:43-18:49:55 ℹ pass 302 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 11643.870722
|
||||||
|
pkg-business rc=0 18:49:55-18:49:57 ℹ pass 109 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1902.454793
|
||||||
|
pkg-cli rc=0 18:49:57-18:50:17 ℹ pass 202 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 19914.143774
|
||||||
|
pkg-cli-launcher rc=0 18:50:17-18:50:31 ℹ pass 19 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 14753.442572
|
||||||
|
pkg-control-board rc=0 18:50:31-18:50:32 ℹ pass 124 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 601.318424
|
||||||
|
pkg-conversation rc=0 18:50:32-18:51:20 ℹ pass 182 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 47622.749502
|
||||||
|
pkg-discord rc=0 18:51:20-18:51:22 ℹ pass 183 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2585.981236
|
||||||
|
pkg-harness rc=0 18:51:22-18:51:34 ℹ pass 108 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 12062.67946
|
||||||
|
pkg-ledger rc=0 18:51:34-18:51:57 ℹ pass 86 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 22208.339871
|
||||||
|
pkg-mosaic rc=0 18:51:57-18:51:59 ℹ pass 69 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 2056.635811
|
||||||
|
pkg-plugins rc=0 18:51:59-18:51:59 ℹ pass 28 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 223.296533
|
||||||
|
pkg-project rc=0 18:51:59-18:52:00 ℹ pass 30 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 1176.427414
|
||||||
|
pkg-runs rc=0 18:52:00-18:52:01 ℹ pass 43 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 718.469224
|
||||||
|
pkg-seat rc=0 18:52:01-18:52:07 ℹ pass 148 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 6079.672118
|
||||||
|
pkg-tasks rc=0 18:52:07-18:52:12 ℹ pass 97 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 5020.853991
|
||||||
|
pkg-webui rc=0 18:52:12-18:53:07 ℹ pass 113 ℹ fail 0 ℹ skipped 0 | ℹ duration_ms 55154.695667
|
||||||
|
script-auth rc=0 18:53:07-18:53:08 | selftest: 15 passed, 0 failed
|
||||||
|
script-conductor rc=0 18:53:08-18:53:13 | selftest: 17 passed, 0 failed
|
||||||
|
script-config rc=0 18:53:13-18:53:15 | selftest: 24 passed, 0 failed
|
||||||
|
script-discord rc=0 18:53:15-18:53:22 | discord suite: 78 passed, 0 failed
|
||||||
|
script-extension-package rc=0 18:53:22-18:53:23 | extension package selftest: 18 passed, 0 failed
|
||||||
|
script-foundation rc=0 18:53:23-18:54:02 | selftest: 44 passed, 0 failed
|
||||||
|
script-land-work rc=0 18:54:02-18:54:15 | land-work selftests: 84 passed, 0 failed
|
||||||
|
script-queue rc=0 18:54:15-18:54:46 ℹ pass 156 ℹ fail 0 | queue suite: 28 passed, 0 failed
|
||||||
|
script-release rc=0 18:54:46-18:54:57 | selftest: 14 passed, 0 failed
|
||||||
|
script-task rc=0 18:54:57-18:55:25 | selftest: 98 passed, 0 failed
|
||||||
|
GATE_PASSED 18:55:25
|
||||||
|
network darkwing-r137_default removed
|
||||||
Executable
+33
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -o pipefail
|
||||||
|
# Darkwing builder gate, row 137 (#1631), candidate in the r137 worktree on
|
||||||
|
# base 7a2987cf5. Every package's node suite except queue's (test-queue.sh
|
||||||
|
# runs it), then every scripts/test-*.sh, sequential, each teed to its own
|
||||||
|
# log; stops at the first failure. cli's launcher test runs on its own under
|
||||||
|
# the session's inherited TMPDIR (the bwrap runner fails "did not start" under
|
||||||
|
# an override or with TMPDIR unset).
|
||||||
|
G=$HOME/darkwing-scratch/r137/wt
|
||||||
|
OUT=$HOME/darkwing-scratch/r137/gate${1:+-$1}
|
||||||
|
INHERITED_TMPDIR=${TMPDIR:?the session TMPDIR}
|
||||||
|
export TMPDIR=$HOME/darkwing-scratch/r137/tmp
|
||||||
|
export COMPOSE_PROJECT_NAME=darkwing-r137
|
||||||
|
dropnet() { n=${COMPOSE_PROJECT_NAME}_default
|
||||||
|
if docker network inspect "$n" >/dev/null 2>&1; then
|
||||||
|
c=$(docker network inspect -f '{{len .Containers}}' "$n"); [ "$c" = 0 ] && docker network rm "$n" >/dev/null && echo "network $n removed" || echo "network $n kept, $c containers"
|
||||||
|
fi; }
|
||||||
|
trap dropnet EXIT
|
||||||
|
mkdir -p "$OUT" "$TMPDIR"
|
||||||
|
cd "$G" || exit 9
|
||||||
|
[ -e "$G/node_modules" ] || { echo "STOP no node_modules in $G"; exit 8; }
|
||||||
|
echo "base $(git rev-parse --short HEAD) DOCKER_HOST=${DOCKER_HOST:-unset} docker=$(docker info --format '{{.ServerVersion}}' 2>/dev/null || echo none) start $(date -u +%H:%M:%S)"
|
||||||
|
run() { local name="$1" dir="$2" cmd="$3" t0; t0=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$G/$dir" && bash -c "$cmd") 2>&1 | tee "$OUT/$name.log" > /dev/null; local rc=$?
|
||||||
|
echo "$name rc=$rc $t0-$(date -u +%H:%M:%S) $(grep -E '^ℹ (pass|fail|skipped) [0-9]+' "$OUT/$name.log" | tr '\n' ' ') | $(tail -n1 "$OUT/$name.log")"
|
||||||
|
[ $rc -eq 0 ] || { echo "STOP $name"; exit $rc; }; }
|
||||||
|
for d in packages/*/; do p=$(basename "$d"); [ -d "$d/tests" ] || continue; [ "$p" = queue ] && continue
|
||||||
|
if [ "$p" = cli ]; then
|
||||||
|
run pkg-cli packages/cli 'node --test $(ls tests/*.test.mjs | grep -v "^tests/launcher\.test\.mjs$")'
|
||||||
|
run pkg-cli-launcher packages/cli "TMPDIR=$INHERITED_TMPDIR node --test tests/launcher.test.mjs"
|
||||||
|
else run "pkg-$p" "packages/$p" 'node --test tests/*.test.mjs'; fi; done
|
||||||
|
for s in scripts/test-*.sh; do n=$(basename "$s" .sh); run "script-${n#test-}" . "bash $s"; done
|
||||||
|
echo "GATE_PASSED $(date -u +%H:%M:%S)"
|
||||||
@@ -0,0 +1,310 @@
|
|||||||
|
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (144.05929ms)
|
||||||
|
✔ agents: working counts what the holder received and has not read; routed alone is not working (213.346928ms)
|
||||||
|
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (345.556383ms)
|
||||||
|
✔ agents: working wins over waiting, and Input needed still shows (179.954512ms)
|
||||||
|
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (210.800758ms)
|
||||||
|
✔ agents: state reads only its own business, even for a run name both use (175.100516ms)
|
||||||
|
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (214.74548ms)
|
||||||
|
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (182.239793ms)
|
||||||
|
✔ agents: stranded is oldest first and capped at 50 for a role (885.389857ms)
|
||||||
|
✔ agents: stranded is per role and per business (329.753864ms)
|
||||||
|
✔ agents: a message routed to a held role and not yet received is not stranded (136.839639ms)
|
||||||
|
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (265.502052ms)
|
||||||
|
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (194.901872ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (268.53578ms)
|
||||||
|
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (264.138006ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (247.882667ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (352.427312ms)
|
||||||
|
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (175.464817ms)
|
||||||
|
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (269.391653ms)
|
||||||
|
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (293.680928ms)
|
||||||
|
✔ launch events require a human CLI capability; generic emit cannot forge authority events (191.580167ms)
|
||||||
|
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (192.187452ms)
|
||||||
|
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (260.938844ms)
|
||||||
|
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (178.170841ms)
|
||||||
|
✔ task action subjects and linked decision trail are complete and ordered (181.627308ms)
|
||||||
|
✔ launch binding is durable and reconnecting requires the identical trusted record (110.334877ms)
|
||||||
|
✔ business isolation includes inherited object names and cross-business message references (194.872137ms)
|
||||||
|
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (325.151088ms)
|
||||||
|
✔ task projection uses schema current view, skipping earlier and equal-start polls (151.025872ms)
|
||||||
|
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (225.769996ms)
|
||||||
|
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (151.980561ms)
|
||||||
|
✔ both arbiters require human resolution when their cross-role route is themselves (246.483924ms)
|
||||||
|
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (175.47955ms)
|
||||||
|
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.215999ms)
|
||||||
|
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (254.44728ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (326.383224ms)
|
||||||
|
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (254.756276ms)
|
||||||
|
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (244.248268ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (255.167246ms)
|
||||||
|
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (279.645384ms)
|
||||||
|
✔ REQ-COS-1: the chief of staff cannot end its own run or the assistant's through role.end (262.029861ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (270.183817ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (311.670727ms)
|
||||||
|
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (305.806919ms)
|
||||||
|
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (385.436063ms)
|
||||||
|
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (547.299838ms)
|
||||||
|
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (971.93228ms)
|
||||||
|
✔ comment cursors isolate businesses, move only forward and remain append-only (146.56018ms)
|
||||||
|
✔ only trusted sync writes validated cursors; events and cursor share rollback (119.600379ms)
|
||||||
|
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (879.596381ms)
|
||||||
|
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1516.80763ms)
|
||||||
|
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (797.021667ms)
|
||||||
|
✔ migration refuses mismatched source metadata without changing schema or evidence (767.716303ms)
|
||||||
|
✔ offline command migrates only the supplied fixture root and reports usage errors (1031.434504ms)
|
||||||
|
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (106.572352ms)
|
||||||
|
✔ credentials refuses a role session and any argument (174.177222ms)
|
||||||
|
✔ credentials reads the status on each request, and a broker without one lists none (222.966953ms)
|
||||||
|
✔ the broker process answers credentials without a token, path or variable in its output, log or store (218.695392ms)
|
||||||
|
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.93501ms)
|
||||||
|
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (2.415081ms)
|
||||||
|
✔ expiry refuses use and env references never become client data (0.653496ms)
|
||||||
|
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.22835ms)
|
||||||
|
✔ opaque tokens shorter than 16 characters refuse before use (0.291602ms)
|
||||||
|
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (2.333507ms)
|
||||||
|
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (472.617413ms)
|
||||||
|
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (483.596555ms)
|
||||||
|
✔ chief-executive-officer: another C-suite role isn't on the lists either (398.904562ms)
|
||||||
|
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (439.372537ms)
|
||||||
|
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (491.050882ms)
|
||||||
|
✔ chief-financial-officer: another C-suite role isn't on the lists either (386.048306ms)
|
||||||
|
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (472.419681ms)
|
||||||
|
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (455.229065ms)
|
||||||
|
✔ chief-information-officer: another C-suite role isn't on the lists either (410.738186ms)
|
||||||
|
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (529.453115ms)
|
||||||
|
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (516.767302ms)
|
||||||
|
✔ chief-information-security-officer: another C-suite role isn't on the lists either (387.98007ms)
|
||||||
|
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (437.277805ms)
|
||||||
|
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (434.285457ms)
|
||||||
|
✔ chief-marketing-officer: another C-suite role isn't on the lists either (343.030321ms)
|
||||||
|
✔ a human resolve sends the raising role one message from the human, and its request is the answer (227.47827ms)
|
||||||
|
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (241.261649ms)
|
||||||
|
✔ a human withdraw sends one message with the note (243.397158ms)
|
||||||
|
✔ a human seen before the close leaves the request on the close's answer, not the seen (313.858185ms)
|
||||||
|
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (263.109493ms)
|
||||||
|
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (291.209925ms)
|
||||||
|
✔ a raising role nobody holds at the close gets the message on the next claim (247.910634ms)
|
||||||
|
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (236.878189ms)
|
||||||
|
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (286.201279ms)
|
||||||
|
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (297.082822ms)
|
||||||
|
✔ a route the raiser hears from is allowed, checked from the route to the raiser (358.292683ms)
|
||||||
|
✔ a refused supersede withdraws nothing (295.233421ms)
|
||||||
|
✔ the assistant's within-role and gated raises still work (300.699805ms)
|
||||||
|
✔ roles lists open decisions routed to a role, and never the human inbox (210.465021ms)
|
||||||
|
✔ recent lists closed decisions of every route, newest close first, with how each closed (302.276529ms)
|
||||||
|
✔ recent gives the closing event as closed when the decision was seen first (300.372063ms)
|
||||||
|
✔ recent stops at RECENT rows (793.217442ms)
|
||||||
|
✔ every row is what trail already gives the same session for that id (263.144818ms)
|
||||||
|
✔ a role session can't list decisions, so it can't read another role's open decisions (429.759421ms)
|
||||||
|
✔ decisions is a read: one business, strict arguments, nothing written (393.163901ms)
|
||||||
|
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (142.917216ms)
|
||||||
|
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (143.986521ms)
|
||||||
|
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (155.472208ms)
|
||||||
|
✔ endLaunch leaves a claim another run took alone (192.667767ms)
|
||||||
|
✔ refuse records action.refused against the caller with the code only (134.34704ms)
|
||||||
|
✔ launches off refuses role.launch with launch-revoked until launches on (205.787798ms)
|
||||||
|
✔ broker process: launch ops authorize role.launch, record refusals and end runs (311.617838ms)
|
||||||
|
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.428167ms)
|
||||||
|
✔ process reader gets own kernel identity without exposing environment values (0.538745ms)
|
||||||
|
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.663909ms)
|
||||||
|
✔ real pid 1 remains inspectable when its environment is protected (0.243614ms)
|
||||||
|
✔ checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (245.354458ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (325.023483ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (252.355977ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (583.610972ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (238.540455ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (267.964982ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent merge decision this role raised for a task in this thread (290.740704ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (163.341282ms)
|
||||||
|
✔ a message to a stopped role sends launch.by one notice, and the result says so (203.923332ms)
|
||||||
|
✔ a message to a role outside launch.instances says so in its result and in the notice (173.36188ms)
|
||||||
|
✔ a message to a running role sends no notice and its result is unchanged (157.876236ms)
|
||||||
|
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (255.323027ms)
|
||||||
|
✔ a run launched but not yet claimed counts as no holder (139.757418ms)
|
||||||
|
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (258.179438ms)
|
||||||
|
✔ a business with no launch block tells nobody and says there is no launcher (116.612643ms)
|
||||||
|
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (332.223962ms)
|
||||||
|
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (202.946908ms)
|
||||||
|
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (290.873044ms)
|
||||||
|
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (451.637256ms)
|
||||||
|
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (208.532641ms)
|
||||||
|
✔ missing and foreign-business citations refuse and roll back message and grant (206.947969ms)
|
||||||
|
✔ cross-role sends still need a matching resolved decision and consume it once (271.944948ms)
|
||||||
|
✔ messages pages all human messages newest first without writes; read state is history (2563.822625ms)
|
||||||
|
✔ messages refuses role callers, invalid paging and cursors outside this human feed (265.300298ms)
|
||||||
|
✔ views messages passes only its paging arguments through (0.51912ms)
|
||||||
|
✔ messages isolates businesses even with a valid foreign cursor (171.903575ms)
|
||||||
|
✔ the assistant sends to the user and to the chief of staff only (306.537956ms)
|
||||||
|
✔ an assistant send to any other role, or to the tester, is refused and logged (331.658653ms)
|
||||||
|
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (339.31255ms)
|
||||||
|
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (337.231323ms)
|
||||||
|
✔ a sender-side list alone refuses a send to a role that has no list (320.785661ms)
|
||||||
|
✔ a target-side list alone refuses a send from a role that has no list (336.350706ms)
|
||||||
|
✔ the sender list is checked before the target list (293.643159ms)
|
||||||
|
✔ roles without the field behave exactly as before (427.337522ms)
|
||||||
|
✔ a business with no role definitions at all is unlimited (344.528011ms)
|
||||||
|
✔ a malformed messaging field refuses at boot (123.355385ms)
|
||||||
|
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (384.105943ms)
|
||||||
|
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (449.896392ms)
|
||||||
|
✔ review requests and verdicts between roles without the field are unchanged (314.692601ms)
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (189.424426ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (474.947934ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (441.022854ms)
|
||||||
|
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (214.082489ms)
|
||||||
|
✔ startup token refusal returns safe code without value or partial listening broker (67.208041ms)
|
||||||
|
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (200.354192ms)
|
||||||
|
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (226.239933ms)
|
||||||
|
✔ trusted host registers later launches; socket clients never have a registration verb (229.84155ms)
|
||||||
|
✔ runtime excludes declared project roots even when host supplies no repoRoots (64.094057ms)
|
||||||
|
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (210.437994ms)
|
||||||
|
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (150.599482ms)
|
||||||
|
✔ D2: spec.read refuses without content if its role is released during the read (151.653041ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged content without content (141.445631ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged subject without content (184.04861ms)
|
||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.372603ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (202.918249ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (213.18783ms)
|
||||||
|
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (219.245447ms)
|
||||||
|
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (228.472489ms)
|
||||||
|
✔ a message with no reply gives an empty list (156.927627ms)
|
||||||
|
✔ replies come oldest first and stop at REPLIES (741.089021ms)
|
||||||
|
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (292.641353ms)
|
||||||
|
✔ strict arguments; a role session gets human-required (371.177219ms)
|
||||||
|
✔ views passes replies through as one call with the id (0.238469ms)
|
||||||
|
✔ requirements returns the committed list to a holding role session, and no one else (215.226683ms)
|
||||||
|
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (159.499926ms)
|
||||||
|
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (167.25647ms)
|
||||||
|
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (246.528365ms)
|
||||||
|
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (241.635802ms)
|
||||||
|
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (291.751571ms)
|
||||||
|
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (360.022747ms)
|
||||||
|
✔ reviewFetch answers only the addressed reviewer, for the request it cites (235.238553ms)
|
||||||
|
✔ review.verdict answers one request once, to the role that asked (312.244488ms)
|
||||||
|
✔ task.close on a pushed task needs an approve verdict for the latest push (404.675532ms)
|
||||||
|
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (295.287783ms)
|
||||||
|
✔ v3b prototype refusals, views and append-only mutations (1443.370064ms)
|
||||||
|
✔ gated approval authorizes once, survives store reopen, and fresh approval works (248.27825ms)
|
||||||
|
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (207.879642ms)
|
||||||
|
✔ two scheduled callers have exactly one grant and one consumed refusal (156.645944ms)
|
||||||
|
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (319.755398ms)
|
||||||
|
✔ class drift gated to cross-role refuses before consumption (217.404565ms)
|
||||||
|
✔ class drift cross-role to gated refuses before consumption (256.569884ms)
|
||||||
|
✔ class drift gated to within-role refuses before consumption (225.502317ms)
|
||||||
|
✔ class drift cross-role to within-role refuses before consumption (282.531965ms)
|
||||||
|
✔ class drift within-role to gated refuses before consumption (246.975882ms)
|
||||||
|
✔ class drift within-role to cross-role refuses before consumption (226.516789ms)
|
||||||
|
✔ message.send consumes approval and prevents a later send or authorize (293.698376ms)
|
||||||
|
✔ role.revoke consumes approval and prevents a later revoke or authorize (258.574863ms)
|
||||||
|
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1339.585071ms)
|
||||||
|
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (252.134135ms)
|
||||||
|
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (189.047194ms)
|
||||||
|
✔ two real socket writes to one repository yield one commit and one project-busy refusal (209.570865ms)
|
||||||
|
✔ client disconnect during await tolerates late reply (170.261308ms)
|
||||||
|
✔ client disconnect during await tolerates late refusal (187.686062ms)
|
||||||
|
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (362.119637ms)
|
||||||
|
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (295.80187ms)
|
||||||
|
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (312.815983ms)
|
||||||
|
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (227.988018ms)
|
||||||
|
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (262.196464ms)
|
||||||
|
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (227.301945ms)
|
||||||
|
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (314.739815ms)
|
||||||
|
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (149.711731ms)
|
||||||
|
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (425.596753ms)
|
||||||
|
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (455.988926ms)
|
||||||
|
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (407.786491ms)
|
||||||
|
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (290.270226ms)
|
||||||
|
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (588.532539ms)
|
||||||
|
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (432.620333ms)
|
||||||
|
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (227.947296ms)
|
||||||
|
✔ a business that never switched launches reads allowed with no time and no event (131.231526ms)
|
||||||
|
✔ launches revoked and then restored read allowed, with the restore time and event id (156.726798ms)
|
||||||
|
✔ a task closed on the tracker leaves the open list, and total counts the open ones (137.986053ms)
|
||||||
|
✔ a tombstone is not open (144.321565ms)
|
||||||
|
✔ the open list stops at the cap and says so; total still counts every open task (144.096806ms)
|
||||||
|
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (139.384511ms)
|
||||||
|
✔ a human session reads the same state, with the same cap (165.792148ms)
|
||||||
|
✔ reading state writes nothing: every table keeps its row count (168.096666ms)
|
||||||
|
✔ creates private WAL store and excludes a second writer until explicit close (125.795527ms)
|
||||||
|
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (177.078756ms)
|
||||||
|
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (184.619521ms)
|
||||||
|
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (198.388518ms)
|
||||||
|
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (113.13483ms)
|
||||||
|
✔ async transactions refuse before invoking their function (107.323659ms)
|
||||||
|
✔ the session default fits under the reply cap and pages to the end with next (313.561137ms)
|
||||||
|
✔ the short form: no description, assignees by role, every listed key (277.454348ms)
|
||||||
|
✔ each filter, alone and together, and total counts every match (343.794468ms)
|
||||||
|
✔ task_ref reads one task in full, as the whole board has it (377.385568ms)
|
||||||
|
✔ no arguments is the read the Console and mosaic make, unchanged (249.971048ms)
|
||||||
|
✔ an unknown argument or a bad value refuses invalid-request (909.062664ms)
|
||||||
|
✔ tasks rows carry priority and requirement for every session that reads tasks (334.485901ms)
|
||||||
|
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (371.119884ms)
|
||||||
|
✔ an empty business and one with snapshots but no task.created read cleanly (114.388617ms)
|
||||||
|
✔ recordTask keeps sync reads and a role write apart (203.854399ms)
|
||||||
|
✔ read_at must be one canonical UTC format, so the projection compares strings safely (115.386305ms)
|
||||||
|
✔ a bad entry refuses the whole record (135.404217ms)
|
||||||
|
✔ taskView reads the projection for one business (145.342065ms)
|
||||||
|
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (279.3021ms)
|
||||||
|
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (495.938555ms)
|
||||||
|
✔ without an adapter the server refuses every task verb (212.882634ms)
|
||||||
|
✔ the runtime refuses an invalid adapter and closes a valid one (199.108836ms)
|
||||||
|
✔ the process loads the S3 adapter from plain-data trackers (324.23708ms)
|
||||||
|
✔ the tester binds only when the business sets bus.tester to exactly true (879.263527ms)
|
||||||
|
✔ a business may not name a role tester, so the tester address is never a role (300.496414ms)
|
||||||
|
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (541.744279ms)
|
||||||
|
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (225.91737ms)
|
||||||
|
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (252.162895ms)
|
||||||
|
✔ the tester reads the human views a reader reads (168.249503ms)
|
||||||
|
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.080436ms)
|
||||||
|
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.318087ms)
|
||||||
|
✔ testerNonce reads only the tester's variable and gives null on any read error (0.208512ms)
|
||||||
|
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (109.507557ms)
|
||||||
|
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (880.628091ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1144.651491ms)
|
||||||
|
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (789.919403ms)
|
||||||
|
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (801.50748ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (366.655408ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1204.453558ms)
|
||||||
|
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (322.820901ms)
|
||||||
|
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3551.967817ms)
|
||||||
|
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (144.409622ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (157.570831ms)
|
||||||
|
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (273.600268ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (233.703195ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (188.016116ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (136.142461ms)
|
||||||
|
✔ REQ-USER-2: the human verbs refuse another owner's thread (184.452407ms)
|
||||||
|
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (124.182281ms)
|
||||||
|
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (151.70596ms)
|
||||||
|
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (490.86068ms)
|
||||||
|
✔ socket capability stamps launch identity; shared views use wire, no SQL client (160.442983ms)
|
||||||
|
✔ two wire claims serialize; a lost reply never automatically retries (180.376464ms)
|
||||||
|
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (117.750631ms)
|
||||||
|
✔ client preserves UTF-8 when a response divides a multibyte character (11.585371ms)
|
||||||
|
✔ committed mutation followed by dropped reply reports unknown and is never retried (183.173211ms)
|
||||||
|
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (167.981984ms)
|
||||||
|
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (169.817193ms)
|
||||||
|
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (258.876929ms)
|
||||||
|
✔ a broker with no web service refuses a granted role (145.330454ms)
|
||||||
|
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (201.981838ms)
|
||||||
|
✔ a session that is not the role holder is refused (132.040888ms)
|
||||||
|
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (373.993538ms)
|
||||||
|
✔ web.search with no search source configured is a refused result, not an error (144.461978ms)
|
||||||
|
✔ a search source that fails with its own refusal, or that throws, is handled (180.174112ms)
|
||||||
|
✔ a slow search source ends in a refusal at the deadline (186.269174ms)
|
||||||
|
✔ a secret in the arguments is refused before anything is trailed or fetched (132.148515ms)
|
||||||
|
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (215.793213ms)
|
||||||
|
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.241426ms)
|
||||||
|
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (189.721166ms)
|
||||||
|
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (176.24401ms)
|
||||||
|
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (439.994006ms)
|
||||||
|
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (195.29039ms)
|
||||||
|
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (189.385971ms)
|
||||||
|
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (159.218931ms)
|
||||||
|
ℹ tests 302
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 302
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 11643.870722
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
✔ the role file loads and resolves through loadBusiness (7.295639ms)
|
||||||
|
✔ the shipped file is exactly the approved list (1.015557ms)
|
||||||
|
✔ the assistant's authority is message.send and record.write within role (2.744656ms)
|
||||||
|
✔ the assistant talks to the user and the chief of staff only, and no other shipped role is limited (0.741397ms)
|
||||||
|
✔ a business grant through limits does not widen the role (1.860594ms)
|
||||||
|
✔ a launch block whose by is the assistant is refused (3.582574ms)
|
||||||
|
✔ the instance takes no credential references and no tracker (5.816844ms)
|
||||||
|
✔ an arbiter whose role definition declares messaging lists is refused, for each kind (7.824869ms)
|
||||||
|
✔ an arbiter without messaging lists is accepted beside the limited assistant (4.580557ms)
|
||||||
|
✔ the contract passes work to the chief of staff and directs no one (0.847222ms)
|
||||||
|
✔ REQ-HARN-2: the assistant holds the web grant, and no other role file does (1.541725ms)
|
||||||
|
✔ config directory and file path follow MOSAIC_CONFIG (2.010692ms)
|
||||||
|
✔ the fixture business validates and comes back frozen (5.766025ms)
|
||||||
|
✔ two instances may share a definition (1.983435ms)
|
||||||
|
✔ top-level refusals (5.955983ms)
|
||||||
|
✔ arbiters and projects (9.224749ms)
|
||||||
|
✔ role instances (5.611284ms)
|
||||||
|
✔ Vikunja bots (7.694304ms)
|
||||||
|
✔ a role without Vikunja takes no tracker block (2.643587ms)
|
||||||
|
✔ credential references match the definition's services (2.664123ms)
|
||||||
|
✔ launch (8.140884ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (3.791929ms)
|
||||||
|
✔ loadBusiness: file checks (1.67058ms)
|
||||||
|
✔ loadBusiness: not a regular file (35.492597ms)
|
||||||
|
✔ loading writes nothing (1.025281ms)
|
||||||
|
✔ names that are Object.prototype properties don't count as declared (2.629262ms)
|
||||||
|
✔ the shipped example refuses as written and validates once filled in (0.757987ms)
|
||||||
|
✔ the role file loads and resolves through loadBusiness (8.939764ms)
|
||||||
|
✔ the shipped file is exactly the approved list (0.306155ms)
|
||||||
|
✔ the resolved record matches the approved list, so a widened file fails (2.433298ms)
|
||||||
|
✔ the chief of staff holds role.launch, message.send, role.end, organization.change and record.write; every other action is gated (2.09852ms)
|
||||||
|
✔ the pm does not hold role.launch (2.194301ms)
|
||||||
|
✔ a business grant of a gated action through limits does not widen the role (2.968052ms)
|
||||||
|
✔ a limit that drops role.launch leaves the chief of staff with no launch block (3.635672ms)
|
||||||
|
✔ a launch block whose by is the pm instance is refused (2.172558ms)
|
||||||
|
✔ the contract names no duty to talk to the human and the pm contract no launch (0.545488ms)
|
||||||
|
✔ the instance takes no credential references and no tracker (2.980725ms)
|
||||||
|
✔ usage errors exit 4 (287.877184ms)
|
||||||
|
✔ validate: a good business exits 0 and prints instance digests (64.932397ms)
|
||||||
|
✔ validate: project files (309.581292ms)
|
||||||
|
✔ validate: missing files and a broken system config (231.238899ms)
|
||||||
|
✔ validate: credential reference problems exit 2 and name each one (64.023052ms)
|
||||||
|
✔ validate: a token file inside the repository is refused (57.378655ms)
|
||||||
|
✔ validate: role definitions come from MOSAIC_ROLES_DIR (181.025248ms)
|
||||||
|
✔ resolve: prints one instance's record (251.819527ms)
|
||||||
|
✔ resolve: refusals (378.96756ms)
|
||||||
|
✔ parse: exactly one of file or env, plus the service's date (3.306724ms)
|
||||||
|
✔ check: a good file has no problems (1.067342ms)
|
||||||
|
✔ check never opens the file: a write-only token passes (0.475452ms)
|
||||||
|
✔ check: file problems (1.215801ms)
|
||||||
|
✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.16964ms)
|
||||||
|
✔ check: dates and environment references (0.532944ms)
|
||||||
|
✔ each definition loads, with a contract file, and is exactly the approved list (4.343331ms)
|
||||||
|
✔ an organization file that declares them passes, and each resolves to least privilege (7.165442ms)
|
||||||
|
✔ the chief of staff launches each one; no other role does (4.710977ms)
|
||||||
|
✔ a C-suite role can't be made the launcher: launch.by must hold role.launch (2.924979ms)
|
||||||
|
✔ limits can narrow a C-suite role but never widen it (2.405157ms)
|
||||||
|
✔ any unknown key, tool, action or version in a role file is refused (1.417506ms)
|
||||||
|
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (19.878316ms)
|
||||||
|
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (1.115318ms)
|
||||||
|
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (211.921651ms)
|
||||||
|
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (234.929059ms)
|
||||||
|
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (2.991907ms)
|
||||||
|
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (196.269825ms)
|
||||||
|
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.858399ms)
|
||||||
|
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (117.367157ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (15.053581ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (249.570124ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (344.954801ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.466084ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (45.193425ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.350106ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (96.044149ms)
|
||||||
|
✔ optional project repo is preserved and must be a normalized absolute path (13.21796ms)
|
||||||
|
✔ loaded business project repo cannot be nested in any declared code checkout (3.973366ms)
|
||||||
|
✔ path and load (3.009119ms)
|
||||||
|
✔ refusals (1.646795ms)
|
||||||
|
✔ record.write is within-role for the eleven approved v2 agents, never gated-only (4.410754ms)
|
||||||
|
✔ systemVars flattens the validated config (2.79505ms)
|
||||||
|
✔ precedence: system, business, project, project role, agent (8.008792ms)
|
||||||
|
✔ limits narrow the definition and never widen it (4.634502ms)
|
||||||
|
✔ role.launch stays within-role only for the instance the launch block names (6.674282ms)
|
||||||
|
✔ limits.authority without role.launch leaves the launcher with no launch block (2.383492ms)
|
||||||
|
✔ limits.authority narrows cross-role actions too (1.417899ms)
|
||||||
|
✔ classify (1.21735ms)
|
||||||
|
✔ the record carries what the broker and launcher need (0.844633ms)
|
||||||
|
✔ digest: key order doesn't matter, any value change does (7.963973ms)
|
||||||
|
✔ refusals (1.877433ms)
|
||||||
|
✔ the four shipped version 2 roles load (4.380209ms)
|
||||||
|
✔ shipped role scopes match addendum B section 2 and the SR runbook (1.748847ms)
|
||||||
|
✔ shipped authority follows the note's table (1.010085ms)
|
||||||
|
✔ every role file in roles/ loads through the validator, and a v2 contract exists (1.104631ms)
|
||||||
|
✔ version 1 files keep loading with no authority (1.583923ms)
|
||||||
|
✔ the conductor policy isn't a role (0.26823ms)
|
||||||
|
✔ a missing role file is exit 4, a symbolic link too (0.543889ms)
|
||||||
|
✔ version 2 refusals (1.907805ms)
|
||||||
|
✔ authority: closed vocabulary, no gated-only action, no overlap (3.612598ms)
|
||||||
|
✔ messaging: optional, role definitions and human, never the tester (2.392288ms)
|
||||||
|
✔ credentials: Gitea scopes (1.113399ms)
|
||||||
|
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.007523ms)
|
||||||
|
✔ credentials: services (0.431382ms)
|
||||||
|
✔ contract: a non-empty regular Markdown file beside the role file (0.731417ms)
|
||||||
|
✔ every key names known layers and a merge rule (1.053692ms)
|
||||||
|
✔ unknown keys and wrong layers refuse (0.659538ms)
|
||||||
|
✔ types (2.289186ms)
|
||||||
|
✔ merge: defaults, then the most specific layer wins (0.252787ms)
|
||||||
|
✔ merge: limits only narrow, and provenance lists each source (0.366087ms)
|
||||||
|
✔ merge doesn't change its inputs (0.138391ms)
|
||||||
|
✔ web.searxng takes https anywhere and http on loopback, so Jason's 127.0.0.1:8888 passes (0.24056ms)
|
||||||
|
ℹ tests 109
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 109
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1902.454793
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1199.665821ms)
|
||||||
|
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (435.850497ms)
|
||||||
|
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (877.080276ms)
|
||||||
|
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3594.111026ms)
|
||||||
|
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (416.61912ms)
|
||||||
|
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (208.996173ms)
|
||||||
|
✔ a runner that stops at once ends its launch with the runner's reason (221.990934ms)
|
||||||
|
✔ a Claude Code launch with no session credential refuses before it starts (114.83846ms)
|
||||||
|
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (200.914036ms)
|
||||||
|
✔ a runner killed from the host ends its launch as killed, not failed (256.566631ms)
|
||||||
|
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (115.969336ms)
|
||||||
|
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1173.546373ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (673.294266ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3611.82562ms)
|
||||||
|
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (103.196827ms)
|
||||||
|
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (110.866327ms)
|
||||||
|
✔ a launch client that never closes its side doesn't hold the host's close (114.035064ms)
|
||||||
|
✔ a runner that ignores SIGTERM is killed when the host closes (1231.20764ms)
|
||||||
|
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.665307ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14753.442572
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1591.021574ms)
|
||||||
|
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (79.455607ms)
|
||||||
|
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (159.318469ms)
|
||||||
|
✔ NO_COLOR: no escape codes, except reverse video on the selected row (227.017275ms)
|
||||||
|
✔ 1-9 shows the decide flow's own lines and question; only y resolves (201.365574ms)
|
||||||
|
✔ the app shows the same decide text as mosaic decide (114.624351ms)
|
||||||
|
✔ any key but y or Y at the question answers No; nothing is sent (3228.171324ms)
|
||||||
|
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (442.325414ms)
|
||||||
|
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (2172.488862ms)
|
||||||
|
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (225.875066ms)
|
||||||
|
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (160.691095ms)
|
||||||
|
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (783.470771ms)
|
||||||
|
✔ quitting at the question answers No and sends nothing, armed or not (217.73538ms)
|
||||||
|
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (129.224976ms)
|
||||||
|
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (126.9589ms)
|
||||||
|
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (845.989228ms)
|
||||||
|
✔ at every size the decide box shows each line y depends on, or says it is hidden (8032.986892ms)
|
||||||
|
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (156.560848ms)
|
||||||
|
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (122.690774ms)
|
||||||
|
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (58.979884ms)
|
||||||
|
✔ keys: views, moving, trail of a selection, the command line, help and quit (259.334087ms)
|
||||||
|
✔ one option: the status line says Press 1, not 1-1 (99.541378ms)
|
||||||
|
✔ no business: the app says so and :business picks one (54.107712ms)
|
||||||
|
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.688651ms)
|
||||||
|
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (166.033824ms)
|
||||||
|
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.441383ms)
|
||||||
|
✔ decide with --note still asks; a No sends nothing (67.113451ms)
|
||||||
|
✔ the app's business comes from a live bus host only (0.909393ms)
|
||||||
|
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.54517ms)
|
||||||
|
✔ draw is pure: same state, same frame (0.703602ms)
|
||||||
|
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (8.887766ms)
|
||||||
|
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (830.685852ms)
|
||||||
|
✔ a missing file is recorded too, and a valid file clears the status on the next start (591.702414ms)
|
||||||
|
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (178.773192ms)
|
||||||
|
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (150.264502ms)
|
||||||
|
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (122.729988ms)
|
||||||
|
✔ decide prints a declining choice as declining (184.367327ms)
|
||||||
|
✔ an unknown outcome is reported once and never resent (143.963741ms)
|
||||||
|
✔ a decision closed before the answer arrives exits 2 and points at its trail (115.226511ms)
|
||||||
|
✔ a prefix that matches two open decisions exits 2 and resolves neither (173.503987ms)
|
||||||
|
✔ without --business a command uses the live host's business, and a stale host.json is not a host (196.97232ms)
|
||||||
|
✔ every human command refuses inside an agent run before it touches the bus (128.292031ms)
|
||||||
|
✔ usage errors exit 4; no business and no host is a usage error (99.633512ms)
|
||||||
|
✔ agents and tasks print through the broker (95.340224ms)
|
||||||
|
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.304509ms)
|
||||||
|
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (68.404728ms)
|
||||||
|
✔ trackers come from the tracker.* variables of the one project that names a tracker project (96.642824ms)
|
||||||
|
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (41.037775ms)
|
||||||
|
✔ two projects that each name a tracker project refuse, since the boot shape holds one (41.703429ms)
|
||||||
|
✔ a business without tracker.baseUrl gets no trackers entry (33.546315ms)
|
||||||
|
✔ an unknown business and a broken system config refuse with exit 3 (66.084291ms)
|
||||||
|
✔ follow prints an unsolicited message after plain talk returned (227.879932ms)
|
||||||
|
✔ talk --follow continues after reply and prints a later unsolicited message (198.018636ms)
|
||||||
|
✔ inbox lists all unread human messages under decisions, does not deliver or read them (3838.508577ms)
|
||||||
|
✔ follow refuses agent context and bad arguments (747.276022ms)
|
||||||
|
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (384.221255ms)
|
||||||
|
✔ plain talk leaves the process SIGINT handlers unchanged (156.711898ms)
|
||||||
|
✔ empty views say so (1.155373ms)
|
||||||
|
✔ the trail keeps the broker's order and names a decision's task without its rows (1.537824ms)
|
||||||
|
✔ tasks print the tracker fields the snapshot carries (0.305215ms)
|
||||||
|
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (879.022195ms)
|
||||||
|
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (937.531999ms)
|
||||||
|
✔ the size cap refuses a push before any byte (397.931343ms)
|
||||||
|
✔ a fetch over the cap refuses before any byte reaches the reviewer (592.104487ms)
|
||||||
|
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (1286.46415ms)
|
||||||
|
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1600.269491ms)
|
||||||
|
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (418.780112ms)
|
||||||
|
✔ a review of a project the business no longer has refuses unknown-project (924.676162ms)
|
||||||
|
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (328.578266ms)
|
||||||
|
✔ close() answers host-closing to a connection still sending its request line (342.814005ms)
|
||||||
|
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (1087.092917ms)
|
||||||
|
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (596.417438ms)
|
||||||
|
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (667.372596ms)
|
||||||
|
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.720119ms)
|
||||||
|
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (592.627393ms)
|
||||||
|
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (44.225799ms)
|
||||||
|
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.911879ms)
|
||||||
|
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (455.693055ms)
|
||||||
|
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (394.070898ms)
|
||||||
|
✔ land: refusals before the gate answer the role at once and leave main and no worktree (393.96618ms)
|
||||||
|
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (379.413456ms)
|
||||||
|
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (380.610517ms)
|
||||||
|
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (403.506241ms)
|
||||||
|
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1042.963277ms)
|
||||||
|
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (446.878422ms)
|
||||||
|
✔ a second host for the same data root refuses with exit 3 while the first runs (278.059918ms)
|
||||||
|
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (615.807438ms)
|
||||||
|
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (3.027215ms)
|
||||||
|
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.751732ms)
|
||||||
|
✔ a live host's lock stays, however old the file is (0.542264ms)
|
||||||
|
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (924.866953ms)
|
||||||
|
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (217.648796ms)
|
||||||
|
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (26.821005ms)
|
||||||
|
✔ a broker fork that throws leaves no host.lock and no host.json (31.107336ms)
|
||||||
|
✔ a broker send that throws leaves no host.lock and no host.json (35.758426ms)
|
||||||
|
✔ a broker that misses its boot wait leaves no host.lock and no host.json (51.071836ms)
|
||||||
|
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (756.048315ms)
|
||||||
|
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (738.696623ms)
|
||||||
|
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (287.346364ms)
|
||||||
|
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (212.355254ms)
|
||||||
|
✔ a host.json that can't be written stops both children and leaves no host.lock (300.911136ms)
|
||||||
|
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (28.332914ms)
|
||||||
|
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (184.953071ms)
|
||||||
|
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (693.482872ms)
|
||||||
|
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (331.353976ms)
|
||||||
|
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (343.614874ms)
|
||||||
|
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1581.106304ms)
|
||||||
|
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (359.476775ms)
|
||||||
|
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (182.635827ms)
|
||||||
|
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (223.41664ms)
|
||||||
|
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (209.801065ms)
|
||||||
|
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (180.22754ms)
|
||||||
|
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (188.563553ms)
|
||||||
|
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (137.843063ms)
|
||||||
|
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (291.022308ms)
|
||||||
|
✔ watchChildren reports a child that died before it was called, and one that dies later (25.520935ms)
|
||||||
|
✔ bus stop refuses to signal a live pid that is not a bus host (202.502773ms)
|
||||||
|
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (271.007106ms)
|
||||||
|
✔ bus start refuses with exit 3 without a notifier config (103.002579ms)
|
||||||
|
✔ bus start runs until bus stop; status reports it while it runs (752.035373ms)
|
||||||
|
✔ bus-service.sh renders the unit and installs it into a given directory (51.909162ms)
|
||||||
|
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (63.479256ms)
|
||||||
|
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (14.536722ms)
|
||||||
|
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.202513ms)
|
||||||
|
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (42.165463ms)
|
||||||
|
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (25.956461ms)
|
||||||
|
✔ limits view/set use the human bus transport and pass only the explicit patch (2.296534ms)
|
||||||
|
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (259.872018ms)
|
||||||
|
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (2.397591ms)
|
||||||
|
✔ zoned uses the IANA zone across DST (25.173292ms)
|
||||||
|
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (189.697607ms)
|
||||||
|
✔ two blocking decisions get two DMs with different nonces (138.42423ms)
|
||||||
|
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.207029ms)
|
||||||
|
✔ a failed DM is journaled, backs off, and is retried until it lands (121.539236ms)
|
||||||
|
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (129.589775ms)
|
||||||
|
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (187.539261ms)
|
||||||
|
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (111.577004ms)
|
||||||
|
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (210.511264ms)
|
||||||
|
✔ a restart after the second refusal does not send before that refusal's 30 min are up (272.128758ms)
|
||||||
|
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (148.373707ms)
|
||||||
|
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (95.731714ms)
|
||||||
|
✔ an inbox read failure is logged and the next poll retries (0.800144ms)
|
||||||
|
✔ no Discord id reaches the journal or the log (186.138968ms)
|
||||||
|
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (35.731523ms)
|
||||||
|
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (38.436979ms)
|
||||||
|
✔ the journal: a whole file that is one torn line truncates to empty (34.253709ms)
|
||||||
|
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (1.874436ms)
|
||||||
|
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (2.581045ms)
|
||||||
|
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (2.948407ms)
|
||||||
|
✔ the journal: a symlinked directory refuses and says it is a link (0.373186ms)
|
||||||
|
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.598802ms)
|
||||||
|
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.481844ms)
|
||||||
|
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.474711ms)
|
||||||
|
✔ digest content stays within Discord's 2000 characters (0.28783ms)
|
||||||
|
✔ runLoop never overlaps ticks and stops after the one in flight (110.292041ms)
|
||||||
|
✔ a human command refused with human-required prints the other-tree line and exits 3 (2.766139ms)
|
||||||
|
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.017762ms)
|
||||||
|
✔ other exit-3 refusals print no other-tree line (1.823116ms)
|
||||||
|
✔ the line names no path (0.221177ms)
|
||||||
|
✔ project init/check use declared business repo and never contact the bus (173.891009ms)
|
||||||
|
✔ project commands validate args and refuse undeclared projects and agent init (40.68926ms)
|
||||||
|
✔ project dispatcher reaches the human CLI (107.115626ms)
|
||||||
|
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (596.602542ms)
|
||||||
|
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (459.372563ms)
|
||||||
|
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (656.670595ms)
|
||||||
|
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (344.294121ms)
|
||||||
|
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4750.465609ms)
|
||||||
|
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (609.56675ms)
|
||||||
|
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (267.818684ms)
|
||||||
|
✔ install never shows a template name on systemd 261; template drop-ins still refuse (247.678304ms)
|
||||||
|
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (349.070778ms)
|
||||||
|
✔ inherited mosaic-.service.d override refuses without changing the unit (200.862718ms)
|
||||||
|
✔ inherited service.d override refuses without changing the unit (220.381918ms)
|
||||||
|
✔ inherited drop-in unreadable directory or file refuses before writing (190.24853ms)
|
||||||
|
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (206.706776ms)
|
||||||
|
✔ talk --tester refuses text without the [mos test] prefix before any call (110.022621ms)
|
||||||
|
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (114.825956ms)
|
||||||
|
✔ decide, stop and launches take no --tester (165.570772ms)
|
||||||
|
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.378425ms)
|
||||||
|
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.542788ms)
|
||||||
|
✔ talk --tester to a stopped role says nobody is told to launch it (140.925825ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (6528.684831ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (2066.392531ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4477.84807ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2893.847919ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (99.118035ms)
|
||||||
|
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (210.200526ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (245.99505ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (96.615805ms)
|
||||||
|
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
|
||||||
|
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
|
||||||
|
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (433.90771ms)
|
||||||
|
✔ the transport writes {business, verb, args} to the child and reads its JSON (43.78643ms)
|
||||||
|
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2171.47226ms)
|
||||||
|
✔ busExit and refuseInsideAgent (0.4918ms)
|
||||||
|
✔ talk sends a REQUEST, prints and reads only the reply to it, and leaves other messages unread (287.659562ms)
|
||||||
|
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1156.90567ms)
|
||||||
|
✔ a late reply the Console has listed stays unread for mosaic inbox, and the next talk skips it (2335.399554ms)
|
||||||
|
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (1292.077277ms)
|
||||||
|
✔ talk to a role launch.by can't launch says it isn't in the launch block (126.364509ms)
|
||||||
|
✔ talk to a stopped role prints the waiting line once, skips a non-reply and prints the reply (243.993133ms)
|
||||||
|
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (99.438483ms)
|
||||||
|
✔ launches off and on go to the broker and change the business's launch state (101.885841ms)
|
||||||
|
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (105.148689ms)
|
||||||
|
ℹ tests 202
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 202
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 19914.143774
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (10.888837ms)
|
||||||
|
✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.222722ms)
|
||||||
|
✔ completed smoke replies and ordinary questions are idle, not human blockers (0.695014ms)
|
||||||
|
✔ only an explicit first-line input request makes a finished reply waiting (0.144798ms)
|
||||||
|
✔ tool activity, user text, errors and unfinished turns override attention text (0.119822ms)
|
||||||
|
✔ STOP access failure is unknown, not absence, under a non-root identity (26.166394ms)
|
||||||
|
✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (2.465177ms)
|
||||||
|
✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.190201ms)
|
||||||
|
✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (5.084404ms)
|
||||||
|
✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.53972ms)
|
||||||
|
✔ server rescans connector discovery and refuses HTTP reply without transport (28.805015ms)
|
||||||
|
✔ connector session links and linked directories are not read (0.969546ms)
|
||||||
|
✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.21077ms)
|
||||||
|
✔ CLI print uses the relaunch notice instead of old current preview (54.80542ms)
|
||||||
|
✔ connector owner and fixed task never inherit a native relaunch notice (1.727576ms)
|
||||||
|
✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (0.936956ms)
|
||||||
|
✔ loadConfig: missing file throws ConfigError (1.326856ms)
|
||||||
|
✔ loadConfig: invalid JSON throws ConfigError (0.261884ms)
|
||||||
|
✔ loadConfig: missing dataRoot throws ConfigError (0.189803ms)
|
||||||
|
✔ loadConfig: relative dataRoot throws ConfigError (0.187634ms)
|
||||||
|
✔ loadConfig: valid config returns dataRoot (0.579646ms)
|
||||||
|
✔ findNewestSession: picks the newest by mtime among two files (0.406185ms)
|
||||||
|
✔ findNewestSession: finds files in nested subdirectories (0.268369ms)
|
||||||
|
✔ findNewestSession: returns null for a missing dir (0.120632ms)
|
||||||
|
✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.572852ms)
|
||||||
|
✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.101409ms)
|
||||||
|
✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.415102ms)
|
||||||
|
✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (0.983746ms)
|
||||||
|
✔ deriveState: full state table (0.151896ms)
|
||||||
|
✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.278753ms)
|
||||||
|
✔ rule: newest entry is a tool result with no assistant text after it is working (0.260654ms)
|
||||||
|
✔ rule: a finished ordinary turn is idle, even if it says your move (0.240247ms)
|
||||||
|
✔ task: the first user message of the session, from text blocks (0.229101ms)
|
||||||
|
✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.230569ms)
|
||||||
|
✔ task: no user message in the log means null (shown as unknown), never a guess (0.235798ms)
|
||||||
|
✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.33822ms)
|
||||||
|
✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.476204ms)
|
||||||
|
✔ scan: the written record carries task, workspace and activeProject (0.425522ms)
|
||||||
|
✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.508379ms)
|
||||||
|
✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.341825ms)
|
||||||
|
✔ registration: a record whose pid is gone is stale; derived values win, sources say derived, registered stays with alive false; a pid the probe cannot decide is not stale; pidAlive itself (0.857884ms)
|
||||||
|
✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.381559ms)
|
||||||
|
✔ loadRegistrations: a missing seatsDir gives empty lists (0.131345ms)
|
||||||
|
✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.642531ms)
|
||||||
|
✔ matchRegistration: matches by sessionsDir, and by realpath through a symlink; sessionsDir null never matches; same seat name with a different sessionsDir does not match (fleet vs repo darkwing) (0.284592ms)
|
||||||
|
✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (1.080403ms)
|
||||||
|
✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.229211ms)
|
||||||
|
✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.408988ms)
|
||||||
|
✔ scanAgent: ageSeconds is computed from the injected now (0.212592ms)
|
||||||
|
✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.128874ms)
|
||||||
|
✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.290571ms)
|
||||||
|
✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.305484ms)
|
||||||
|
✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (0.732899ms)
|
||||||
|
✔ scan: relative boardDir throws ConfigError (0.079779ms)
|
||||||
|
✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (49.23747ms)
|
||||||
|
✔ CLI: missing config exits 2 with a refused: message (47.858379ms)
|
||||||
|
✔ CLI: unknown command exits 2 (50.591731ms)
|
||||||
|
✔ CLI: unknown --liveness value exits 2 (49.823212ms)
|
||||||
|
✔ panesRunPi: true when any trimmed line equals 'pi' (0.192496ms)
|
||||||
|
✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.071154ms)
|
||||||
|
✔ tmuxIsAlive: a pane running pi is alive (0.181932ms)
|
||||||
|
✔ tmuxIsAlive: session exists but pi has exited is not alive (0.06911ms)
|
||||||
|
✔ tmuxIsAlive: no such tmux session is not alive (0.046821ms)
|
||||||
|
✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.057404ms)
|
||||||
|
✔ tmuxIsAlive: passes -L <socket> only when a socket is given (0.095249ms)
|
||||||
|
✔ parsePanes: one pane per line, command and optional tab-separated path (0.078093ms)
|
||||||
|
✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.076043ms)
|
||||||
|
✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.090043ms)
|
||||||
|
✔ loadSeen: missing file returns {} (0.113973ms)
|
||||||
|
✔ loadSeen: invalid JSON throws ConfigError (0.165747ms)
|
||||||
|
✔ loadSeen: a JSON array throws ConfigError (0.145241ms)
|
||||||
|
✔ loadSeen: a non-string value throws ConfigError (0.157019ms)
|
||||||
|
✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.29243ms)
|
||||||
|
✔ markSeen: seen false deletes the key (0.243001ms)
|
||||||
|
✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.206415ms)
|
||||||
|
✔ markSeen: project containing '/' throws ConfigError (0.1146ms)
|
||||||
|
✔ markSeen: non-boolean seen throws ConfigError (0.134206ms)
|
||||||
|
✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.264181ms)
|
||||||
|
✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.223795ms)
|
||||||
|
✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.241342ms)
|
||||||
|
✔ scanAgent: an error-state session with a matching mark is seen (0.244274ms)
|
||||||
|
✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.495021ms)
|
||||||
|
✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.171633ms)
|
||||||
|
✔ taskSetBy: a registered task carries the record's setter; a record without the field (pre-#1511) reads unknown; the value is not copied into registered (0.590734ms)
|
||||||
|
✔ taskSetBy: null whenever the task shown is not the registered one: no registration, an empty registered task, a stale registration; the field is always present (0.5529ms)
|
||||||
|
✔ taskSetBy: scan() reads the field from disk through the seat package (bounded there), writes it to the per-agent record and index, and an invalid on-disk value is a registrationError, never a row value (1.351508ms)
|
||||||
|
✔ isLoopbackHost: recognizes loopback hosts (1.076256ms)
|
||||||
|
✔ isLoopbackHost: rejects non-loopback hosts (3.963866ms)
|
||||||
|
✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (2.764653ms)
|
||||||
|
✔ startServer: serves page, healthz, and a rescanning /api/board (30.484138ms)
|
||||||
|
✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (5.113572ms)
|
||||||
|
✔ startServer: /api/board returns 500 JSON with an error field when scan throws (2.033325ms)
|
||||||
|
✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (49.317158ms)
|
||||||
|
✔ CLI: serve rejects a non-numeric --port with exit 2 (54.576778ms)
|
||||||
|
✔ CLI: scan still works after the async cli refactor (49.566434ms)
|
||||||
|
✔ CLI: live serve prints its URL and answers /healthz (57.404442ms)
|
||||||
|
✔ page.html: esc() escapes every HTML-significant character (0.642657ms)
|
||||||
|
✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (7.802869ms)
|
||||||
|
✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (3.04973ms)
|
||||||
|
✔ POST /api/seen with invalid JSON returns 400 (1.52427ms)
|
||||||
|
✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (2.002411ms)
|
||||||
|
✔ POST /api/seen with a missing agent returns 400 (1.248928ms)
|
||||||
|
✔ POST /api/board returns 405; PUT /api/seen returns 405 (1.620133ms)
|
||||||
|
✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (48.19492ms)
|
||||||
|
✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.30782ms)
|
||||||
|
✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.24574ms)
|
||||||
|
✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.201989ms)
|
||||||
|
✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.137128ms)
|
||||||
|
✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.273765ms)
|
||||||
|
✔ page.html: task and active project cells show their source via sourceTag(); the detail has a Registered row via registeredText(); SOURCE_LABEL maps registration to registered; every dynamic value in sourceTag/fromSource/registeredText is escaped (0.55768ms)
|
||||||
|
✔ POST /api/reply: runs agent-send.sh with -s from the registration, -S <host>:control-board, -m text plus the fixed trailer, no -L on the default socket, MOSAIC_TMUX_SOCKET stripped; answers delivered with the exit code and both streams (32.008463ms)
|
||||||
|
✔ POST /api/reply: a registration with a tmux socket adds -L <socket> (25.376751ms)
|
||||||
|
✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (23.779993ms)
|
||||||
|
✔ POST /api/reply: refusals before the tool runs: empty or blank or long text 400, unknown row 404, no registration 409, stale registration 409, no tmux session 409, bad JSON 400; the tool is never called (14.05863ms)
|
||||||
|
✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (4.454093ms)
|
||||||
|
✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (0.175846ms)
|
||||||
|
✔ page.html: the reply box appears only where canReply() holds (live registration with a tmux session), the detail has a Reply row, the submit posts JSON to /api/reply, receipts and drafts survive a refresh, and every receipt value is escaped (0.562455ms)
|
||||||
|
✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (2.234822ms)
|
||||||
|
✔ page.html: the task cell and detail show who set a registered task via setByTag()/setByText(), both escaped, only from rec.taskSetBy; the reply gate does not read it (0.287769ms)
|
||||||
|
✔ Host/Origin guard: GET /api/board and POST /api/reply refuse a foreign Host, a wrong port and a cross-origin Origin with 403 JSON, before any scan or send, and never send CORS headers (7.785953ms)
|
||||||
|
✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (36.928879ms)
|
||||||
|
✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (4.400183ms)
|
||||||
|
✔ every refusal code the reader can raise has an HTTP status (0.891593ms)
|
||||||
|
✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (46.137447ms)
|
||||||
|
ℹ tests 124
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 124
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 601.318424
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
✔ W1: two processes acquire the same pair at once; exactly one claim (192.905535ms)
|
||||||
|
✔ W1: two writers publish the same revision at once: one wins, the other gets null, the winner's record stays (31.820809ms)
|
||||||
|
✔ W1: a revision name appears only after its bytes are synced; before that, only a temp file exists (17.755114ms)
|
||||||
|
✔ W2: acquire while a claim is reserved or active refuses already-active (332.345527ms)
|
||||||
|
✔ W3: acquire while stopping, uncertain, or stopped without proof refuses unsafe-replacement (404.606171ms)
|
||||||
|
✔ W4: same session with another seat tuple, and the reverse, both refuse; a loser on the seat key closes it no-unit (244.528326ms)
|
||||||
|
✔ W4: a hard link of one session under another seat is the same session: the second controller refuses already-active and launches nothing (199.660361ms)
|
||||||
|
✔ W4: a copy of one session under another seat is the same session: the second controller refuses already-active and launches nothing (196.934061ms)
|
||||||
|
✔ W4: a session header ID that changes after construction refuses target; nothing is claimed or launched (2.454403ms)
|
||||||
|
✔ W5: SIGKILL between every publication barrier of acquire and transition; restart never finds two holders or a lost claim (9865.800484ms)
|
||||||
|
✔ W5: SIGKILL between every publication barrier of release; restart finishes or holds the release (31662.430741ms)
|
||||||
|
✔ W6: controller killed mid-turn while the engine lives; restart is uncertain, no launch, prompts refuse (262.000518ms)
|
||||||
|
✔ W12: a live owner paused with SIGSTOP; a second controller refuses already-active and changes nothing (138.033523ms)
|
||||||
|
✔ W13: crash after the engine spawns, before active; restart finds the live unit: uncertain, no second spawn, force stop only (416.127032ms)
|
||||||
|
✔ W14: crash after reservation, before the spawn marker: stopped with a no-unit observation; the pair is free (269.870361ms)
|
||||||
|
✔ W20: crash after the spawn marker, scope collected; uncertain in both runs, the marker is copied, no launch until a boot proof (342.192583ms)
|
||||||
|
✔ W15: crash between the two keys during release; restart finishes it under the same claim ID (109.246706ms)
|
||||||
|
✔ W7: recorded boot ID differs on the same machine: stopped with a boot proof; open tool calls become uncertain (172.308583ms)
|
||||||
|
✔ W8: resume after a proven stop with the same pins: new claim ID, generation +1, same conversation, branch and leaf (272.153982ms)
|
||||||
|
✔ W9: resume with a changed binary, argv digest, branch or leaf is refused and the claim is unchanged (802.966757ms)
|
||||||
|
✔ W11: the controller writes no session file; only the fake engine's own appends appear (187.800639ms)
|
||||||
|
✔ W16: a highest revision that won't parse holds the pair uncertain; the older stopped revision is not reused (85.854102ms)
|
||||||
|
✔ W17: a claim root copied from another host refuses foreign-host and promotes nothing (66.087461ms)
|
||||||
|
✔ G1: a session path or claim root under .pi/state, ~/.claude, the data root or a registration refuses at construction (4.404493ms)
|
||||||
|
✔ G2: a symlink inside the fixture root to a live session file is refused by the real-path check (1.013057ms)
|
||||||
|
✔ G3: a fixture path swapped for a live path after construction is refused at bind (1.699707ms)
|
||||||
|
✔ no shim from this file's tests is left running for the after hook (5.411386ms)
|
||||||
|
✔ K1: force stop kills a tool child that called setsid; stopped with a verified proof (554.853608ms)
|
||||||
|
✔ K2: K1 on the process-group fallback ends uncertain, never stopped (441.410655ms)
|
||||||
|
✔ K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM (560.512734ms)
|
||||||
|
✔ K4: two engines; force stop one; the other survives by independent observation (2748.412366ms)
|
||||||
|
✔ K5: a stop during a tool call leaves the effect uncertain, and it is shown (476.148895ms)
|
||||||
|
✔ K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill (572.123875ms)
|
||||||
|
✔ K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete (471.989002ms)
|
||||||
|
✔ K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain (5174.7574ms)
|
||||||
|
✔ K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop (839.819033ms)
|
||||||
|
✔ K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop (697.723036ms)
|
||||||
|
✔ K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain (491.754845ms)
|
||||||
|
✔ K6: recover without proof, without confirmation, or with changed pins is refused (725.556844ms)
|
||||||
|
✔ K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed (369.232319ms)
|
||||||
|
✔ K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop (555.246544ms)
|
||||||
|
✔ K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced (3307.26963ms)
|
||||||
|
✔ K16: a claim from another machine ID refuses foreign-host; no boot proof is issued (43.439044ms)
|
||||||
|
✔ K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine (374.058381ms)
|
||||||
|
✔ K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof (351.809086ms)
|
||||||
|
✔ K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names (63.054165ms)
|
||||||
|
✔ R1: after a proven force stop the controller releases the scope; the shim and the unit are gone (383.664723ms)
|
||||||
|
✔ R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run (488.644069ms)
|
||||||
|
✔ R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence (1104.7877ms)
|
||||||
|
✔ E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released (393.563689ms)
|
||||||
|
✔ E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it (2515.619987ms)
|
||||||
|
✔ E3: an engine exit and a force stop take one escalation slot, in either order (1020.610519ms)
|
||||||
|
✔ E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot (954.767091ms)
|
||||||
|
✔ E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current (2574.344704ms)
|
||||||
|
✔ E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks (339.706442ms)
|
||||||
|
✔ R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on #1533) (394.479085ms)
|
||||||
|
✔ R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope (129.013545ms)
|
||||||
|
✔ R7: controller killed after the claim is stopped, before the release: the restart releases the scope (2588.312589ms)
|
||||||
|
✔ R8: controller killed between the two keys' stopped revisions: the restart releases the scope (447.55983ms)
|
||||||
|
✔ R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one (441.930316ms)
|
||||||
|
✔ R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on #1536) (376.282428ms)
|
||||||
|
✔ R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more (2539.229003ms)
|
||||||
|
✔ R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed (248.376051ms)
|
||||||
|
✔ no shim from this file's tests is left running for the after hook (4.14531ms)
|
||||||
|
✔ S1: `/goal x`, with leading spaces or a tab, refuses text-policy at admission; zero engine bytes (192.679869ms)
|
||||||
|
✔ S2: every prefix pinned Pi interprets is refused, from the list the code uses; the rest reach the engine exactly (187.428899ms)
|
||||||
|
✔ S3: `/goal` on the second line is pinned from the source: Pi checks only index 0, so it is admitted and sent exactly (187.016888ms)
|
||||||
|
✔ S4: a `/` left in the composer is cleared when control transfers and returns; the next submit sends only the new text (296.185434ms)
|
||||||
|
✔ S5: an observer terminal gets a paste then Enter, as send-message.sh does: not admitted: controller, nothing sent (192.193114ms)
|
||||||
|
✔ S6: a mediated-shaped registration (no tmux) passed to the board's replyToRow: 409 no tmux session; exec never runs (0.476499ms)
|
||||||
|
✔ S7: ESC, bracketed-paste markers and U+2028/U+2029 travel as one JSON string; the engine receives the exact text in one record (186.33684ms)
|
||||||
|
✔ P3: a Pi confirm, select, input or editor dialog is shown disabled with a reason and never answered (302.697904ms)
|
||||||
|
✔ E1: send, ack, user, toolCall, toolResult, final answer: shown once, no refresh, draft and reading position kept (197.0822ms)
|
||||||
|
✔ E2: U+2028, U+2029 inside JSON strings and CRLF line ends each parse as one record, on the splitter and through the controller (196.203943ms)
|
||||||
|
✔ E3: a multipart final, two blocks, null request correlation and duplicate delivery (200.659798ms)
|
||||||
|
✔ E4: a page read after message_end but before its entry is persisted: marker at the seam, re-read after run-settled, each message once (193.303673ms)
|
||||||
|
✔ E4: a gap or a new epoch also reconciles; nothing is concatenated across a gap (10.850223ms)
|
||||||
|
✔ E5: an unknown native event gives no client event; evidence records its type and bytes; the terminal count goes up (194.518832ms)
|
||||||
|
✔ E6: a tool result delayed across a pause and a reconnect is reconciled without a manual refresh (210.696139ms)
|
||||||
|
✔ E7: the terminal renders the same stream as the library client, as observer and then as controller, and submits only as controller (254.806462ms)
|
||||||
|
✔ terminal: engine control characters are made visible; a lost connection refuses submit (190.399337ms)
|
||||||
|
✔ terminal: outcome unknown is shown as such, with no resend offer, and nothing is resent (0.378716ms)
|
||||||
|
✔ terminal: text after Enter in the same input chunk starts the next message; it never joins the one submitted (0.274749ms)
|
||||||
|
✔ terminal: a paste-start marker split right after its ESC still opens the paste; the Enter inside it never submits (0.30238ms)
|
||||||
|
✔ terminal: Ctrl-T then Enter in one chunk is judged after the takeover, as if typed one key at a time (Filbert F2, #1507) (0.459794ms)
|
||||||
|
✔ terminal: input held behind Ctrl-T waits for that takeover while an earlier action is still pending (Darkwing T1 on #1522) (30.981075ms)
|
||||||
|
✔ terminal: a hold inside held input holds again, and once it is drained later input and Ctrl-C still reach the terminal (Darkwing note 1 on #1522) (0.393389ms)
|
||||||
|
✔ terminal: an action that throws still releases the input held behind it, in order, then rethrows (5.710595ms)
|
||||||
|
✔ terminal: after an action throws, later input still runs; input() puts the error in the status line (Filbert N1 on #1522) (0.319268ms)
|
||||||
|
✔ terminal: input() reports an error when it happens, so it never overwrites a later status; held input's promise doesn't carry the holder's error (Filbert N4 on #1522) (0.300248ms)
|
||||||
|
✔ terminal: invisible and bidi characters are made visible; head, status and notice lines stay one line (0.091451ms)
|
||||||
|
✔ every record these fixtures produced is a valid CHAT-01 record (E5: no record fails the schema) (209.17872ms)
|
||||||
|
✔ H1: two takeovers with the same expected generation: one wins, +1; the other refuses generation (232.152157ms)
|
||||||
|
✔ H2: the old controller's prompt after a takeover commits is refused with zero engine bytes (267.292839ms)
|
||||||
|
✔ H3: a takeover while a prompt holds the dispatch lock: written under the old actor, or refused; never both (817.800329ms)
|
||||||
|
✔ H4: self-takeover is refused (186.725333ms)
|
||||||
|
✔ H9: Interrupt racing a prompt's dispatch: before the write, dispatch-refused and no-turn; after, §3 rules (434.191352ms)
|
||||||
|
✔ H10: Interrupt and force stop together: one stop chain, force stop supersedes (985.415658ms)
|
||||||
|
✔ H10: an overlap during the pause before the abort: no abort, the stop ends uncertain (211.241779ms)
|
||||||
|
✔ H10: a no-turn Interrupt lifts only its own fence; admission stays closed under force stop, overlap or revocation (564.117555ms)
|
||||||
|
✔ H11: the controller disconnects mid-turn: work continues, the claim is unchanged, control stays put (261.603407ms)
|
||||||
|
✔ H12: an exact retry after reconnecting to the same incarnation returns the same receipt; one dispatch (143.983195ms)
|
||||||
|
✔ H13: a retry with the same request ID and different text is refused (184.339154ms)
|
||||||
|
✔ H14: late stdout from the old engine after a replacement is dropped by incarnation, counted, never rendered (567.772072ms)
|
||||||
|
✔ H15: a revoked connection's command is refused; the revocation fence holds (287.496189ms)
|
||||||
|
✔ H16: a second controller for the same session refuses already-active; the first is untouched (193.101167ms)
|
||||||
|
✔ H10: a second force stop while the first escalation runs refuses fenced; one escalation, and the claim records only the first stop's phases (825.501847ms)
|
||||||
|
✔ a force stop whose fence throws leaves no escalation flag behind, so the next force stop runs (Darkwing F2, #1507) (336.034907ms)
|
||||||
|
✔ H17: a confirmation reused, answered from another connection, or used after the stop changed is refused (757.438901ms)
|
||||||
|
✔ H18: two prompts before any native output: the second refuses busy; one engine write (200.358289ms)
|
||||||
|
✔ H19: the pipe fails mid-line under a large prompt: delivery-unknown transport-unknown, poisoned, no later write (341.375492ms)
|
||||||
|
✔ H19: the link itself never writes again after an unknown outcome, whoever calls it (0.660103ms)
|
||||||
|
✔ H19: the controller dies mid-write of a large line: after restart the outcome is unknown and nothing is resent (643.617436ms)
|
||||||
|
✔ H20: the line is written but the ack is lost when the controller dies: orphan, outcome unknown, nothing resent (559.564812ms)
|
||||||
|
✔ H21: a retry of the exact request with the old token after a crash is stale-incarnation; no second write (767.781798ms)
|
||||||
|
✔ H22: after H21 and a valid recovery, a new request with the new token is admitted (3113.532831ms)
|
||||||
|
✔ H23: requests pending at a restart are not resent; each shows outcome unknown (643.967785ms)
|
||||||
|
✔ no shim from this file's tests is left running for the after hook (4.695308ms)
|
||||||
|
✔ a plain conversation: catalogue row, one page, CHAT-01 records (5.350949ms)
|
||||||
|
✔ native entries map to blocks: tools, thinking, bash, notices, ids that do not fit (1.42647ms)
|
||||||
|
✔ F1: a malformed line is an unavailable part at its position, and reading continues (1.406124ms)
|
||||||
|
✔ F1: a missing parent stops the history with a notice that names the unreadable lines (2.120684ms)
|
||||||
|
✔ F1: an unreadable fork is never merged into another branch's history (1.414288ms)
|
||||||
|
✔ F1: a follow stays on its branch when the next entry's parent is unreadable (1.75514ms)
|
||||||
|
✔ F1: a file whose entries are all unreadable shows a notice per line (0.675984ms)
|
||||||
|
✔ F2: a truncated trailing line marks the view incomplete, not an error (1.085988ms)
|
||||||
|
✔ pagination: 100 parts, then the rest; parts concatenate to the whole branch (2.938377ms)
|
||||||
|
✔ F3: a replaced file (new inode) refuses old cursors with reconcile (4.626696ms)
|
||||||
|
✔ F4: a same-inode rewrite of the prefix refuses old cursors with reconcile (5.473159ms)
|
||||||
|
✔ F5: growth between pages keeps the epoch and the page stops at the pinned length (4.584001ms)
|
||||||
|
✔ F6: unknown, foreign and expired cursors refuse and leave the cursor usable (6.574015ms)
|
||||||
|
✔ F7: a symlinked file and a symlinked directory component are refused, never opened (7.660996ms)
|
||||||
|
✔ F8: a file swapped for a symlink after the catalogue is refused (1.559971ms)
|
||||||
|
✔ F9: registrations never add or redirect a root (1.514914ms)
|
||||||
|
✔ F10: a header cwd naming another project is refused (3.721596ms)
|
||||||
|
✔ F11: parentSession renders with a marker and the parent is never opened (0.617378ms)
|
||||||
|
✔ F12: two leaves: the default leaf is shown and the other branch reads alone (3.539503ms)
|
||||||
|
✔ F12: a follow refuses when an appended duplicate id changes the branch's earlier parts (1.759674ms)
|
||||||
|
✔ F12: a second root (Pi's resetLeaf) starts its own branch (1.243839ms)
|
||||||
|
✔ F13: compaction is a marker in place, then the retained content (0.680477ms)
|
||||||
|
✔ F14: long strings split into fragments and parts, reassemble exactly, and pages respect the byte cap (483.629378ms)
|
||||||
|
✔ fragments never cut a surrogate pair and keep an empty string (4.238066ms)
|
||||||
|
✔ F15: a Claude seat is an unsupported-harness placeholder whose directory is never read (1.388542ms)
|
||||||
|
✔ unknown conversations, empty files and non-Pi files refuse (2.202407ms)
|
||||||
|
✔ an unreadable file or root inside the roots is refused per row, not a failed catalogue (0.996614ms)
|
||||||
|
✔ a seat directory without search permission refuses that root, not the catalogue (1.827785ms)
|
||||||
|
✔ every page and cursor is a valid CHAT-01 record (764.100088ms)
|
||||||
|
✔ the engine pin holds for the installed package (1.56512ms)
|
||||||
|
✔ pinned Pi, sealed and without credentials, answers the controller's commands with the shapes the fake models (247.157683ms)
|
||||||
|
✔ sealed, pinned Pi ignores a trusted project's .pi resources; --approve past the seal would load them, and checkSeal refuses it (Filbert F2 on #1522) (479.45788ms)
|
||||||
|
✔ pinned Pi appends thinking_level_change at start when the branch lacks one, so the leaf moves (K8 then fails closed) (247.010397ms)
|
||||||
|
✔ N25: ordinary Interrupt reconciles; a non-empty queue_update in the window is O5 (453.216124ms)
|
||||||
|
✔ N1: an extension's follow-up queued after the fence is cleared before any abort; O5, Unknown (450.798763ms)
|
||||||
|
✔ N1: a follow-up queued before the fence is O5 at once; the Interrupt refuses fenced (226.027611ms)
|
||||||
|
✔ N2: with abort first, the fake runs the external item (the ordering guard has teeth) (21.004943ms)
|
||||||
|
✔ N3: the fence lands in preflight, preflight errors, no run: failed, No run, uncertain (349.263497ms)
|
||||||
|
✔ N4: the ack arrives after the first abort and a run starts: clear and abort again; Interrupted (197.381239ms)
|
||||||
|
✔ N5: an input handler takes the prompt: ack, no run, delivery-unknown handled-without-run (293.651925ms)
|
||||||
|
✔ N6: an extension queues between clear_queue and abort: O5 and O6, Unknown (456.638715ms)
|
||||||
|
✔ N7: clear_queue times out: no abort, nativeQueue unknown, force stop still ends it (1879.594338ms)
|
||||||
|
✔ N7: clear_queue answers an error: no abort, nativeQueue unknown, the link not poisoned (184.841429ms)
|
||||||
|
✔ N8: an extension prompt starts a run during Mosaic preflight; the losing settle is O3 (272.343828ms)
|
||||||
|
✔ N9: a run that started before the fence and ends aborted: failed interrupted, Interrupted (184.926542ms)
|
||||||
|
✔ N9: decision 34: a run that ends aborted with no stop in progress: aborted-without-stop, uncertain, outcome unknown (226.330856ms)
|
||||||
|
✔ N9: an aborted that lands after the fence but before any abort is written: aborted-without-stop, Unknown (376.525065ms)
|
||||||
|
✔ N10: fake conformance (32.34731ms)
|
||||||
|
✔ N11: the run fails before any user message_start: delivery-unknown ack-without-start, never failed (407.191233ms)
|
||||||
|
✔ N12: input that starts a run after the final empty clear is O1 and not part of the stop's proof (252.851936ms)
|
||||||
|
✔ N13: agent_start with no slot held is O1; a later prompt refuses with zero engine bytes (285.255003ms)
|
||||||
|
✔ N14: the run completes while clear_queue is in flight: finished, Completed first, uncertain (360.50267ms)
|
||||||
|
✔ N14: the run completes after the abort is written, before Pi applies it: finished, never relabelled (364.011315ms)
|
||||||
|
✔ N15: the fence lands in preflight, then an input handler takes it: handled-without-run, No run (365.745737ms)
|
||||||
|
✔ N16: Interrupt with no slot and no run refuses no-turn: no stop, no bytes, admission open (191.595336ms)
|
||||||
|
✔ N17: the run fails on its own during the exchange: failed, Failed on its own (300.506682ms)
|
||||||
|
✔ N18: no final assistant message_end, or a lost line: working stays working; before working, transport-unknown (648.720732ms)
|
||||||
|
✔ N19: a losing extension prompt settles inside the Mosaic run before its user message: O3, run-overlap (587.948533ms)
|
||||||
|
✔ N20: an extension triggerTurn during Mosaic preflight starts first; while streaming it queues with no signal (441.302705ms)
|
||||||
|
✔ N21: a losing settle after the receipt settled finished is O2; the receipt stays finished (229.167016ms)
|
||||||
|
✔ N22: an agent-level custom message is dropped by the clear with no signal; evidence names the seal (203.034852ms)
|
||||||
|
✔ N23: a nextTurn message survives clear and abort and attaches to the next prompt, with no signal (203.425476ms)
|
||||||
|
✔ N24: the seal is an allow-list: --extension, a missing --no-* flag, a second --mode or --session, a session or output flag, or a stray word refuses unsealed-engine; no engine starts (389.198186ms)
|
||||||
|
✔ N24b: the seal covers the engine command and environment: config can't name either, the env is built from names, and a mutated command is refused at bind (182.741365ms)
|
||||||
|
ℹ tests 182
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 182
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 47622.749502
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
✔ approvals: a request is validated before anything is posted; the rendering shows names and never ids (3.03173ms)
|
||||||
|
✔ approvals: the ledger is appended and folded into open requests with bind and approval states (1.393183ms)
|
||||||
|
✔ approvals: a reply approves only when it points at a request, says exactly approve, and comes from a listed approver once (0.776429ms)
|
||||||
|
✔ approvals: a button approves only on its own request message with the matching custom id (0.450407ms)
|
||||||
|
✔ approvals flow: a turn that opened a request posts the message with the button, records it, binds it, and both approvers approve (15.014293ms)
|
||||||
|
✔ approvals flow: a non-approver, a repeat, a wrong custom id and a service refusal each get their fixed line and a drop entry (6.238592ms)
|
||||||
|
✔ approvals flow: an invalid request from the model, a refused post, and no api client are recorded and post nothing (6.947676ms)
|
||||||
|
✔ approvals flow: start retries a bind and an approval left as unknown, under their original keys (2.259194ms)
|
||||||
|
✔ authorize: open channel, listed user (1.758668ms)
|
||||||
|
✔ authorize: wrong guild (0.187367ms)
|
||||||
|
✔ authorize: no guild (DM) (0.300664ms)
|
||||||
|
✔ authorize: unlisted channel (0.172948ms)
|
||||||
|
✔ authorize: unknown channel, no info (0.227557ms)
|
||||||
|
✔ authorize: thread of listed parent (0.178038ms)
|
||||||
|
✔ authorize: thread of unlisted parent (0.237693ms)
|
||||||
|
✔ authorize: text channel that is not a thread and not listed (0.133611ms)
|
||||||
|
✔ authorize: unlisted user (1.100752ms)
|
||||||
|
✔ authorize: no author (0.470109ms)
|
||||||
|
✔ authorize: bot author (listed id, bot flag) (0.219791ms)
|
||||||
|
✔ authorize: system author (0.260249ms)
|
||||||
|
✔ authorize: the bot itself (0.073372ms)
|
||||||
|
✔ authorize: webhook (0.097446ms)
|
||||||
|
✔ authorize: mention channel without mention (0.131408ms)
|
||||||
|
✔ authorize: mention channel with bot mention (0.114214ms)
|
||||||
|
✔ authorize: mention channel with @everyone only (0.141535ms)
|
||||||
|
✔ authorize: mention channel mentioning someone else (0.066436ms)
|
||||||
|
✔ authorize: mention channel, content says @bot but mentions empty (0.080139ms)
|
||||||
|
✔ authorize: private thread under mention channel, mentioned (0.06901ms)
|
||||||
|
✔ authorize: private thread under mention channel, not mentioned (0.063324ms)
|
||||||
|
✔ authorize: thread in another guild per channel info (0.067592ms)
|
||||||
|
✔ authorize: not an object (0.055976ms)
|
||||||
|
✔ authorize: no id (0.063084ms)
|
||||||
|
✔ authorize: oversize content is accepted and flagged (0.071001ms)
|
||||||
|
✔ authorize: exactly the limit is not oversize (0.066287ms)
|
||||||
|
✔ authorize: a user's channel allowlist drops them outside it, threads count as the parent, others are unaffected (0.704634ms)
|
||||||
|
✔ authorize: order puts wrong guild before user, and user before channel (no channel lookup for strangers) (0.138311ms)
|
||||||
|
✔ binding: a complete binding validates and is frozen (2.447554ms)
|
||||||
|
✔ binding: unknown key, missing field, wrong type refuse with exit 2 (1.288838ms)
|
||||||
|
✔ binding: empty allowlists refuse (0.371339ms)
|
||||||
|
✔ binding: a user's channel allowlist must be non-empty, listed and unique; absent means every listed channel (1.265621ms)
|
||||||
|
✔ reloadDiff: reloadable keys are summarised by id; every fixed key refuses with exit 2 (1.52064ms)
|
||||||
|
✔ binding: dmRecipient is optional, a snowflake, one of the listed users, and a fixed key (1.193903ms)
|
||||||
|
✔ binding: file must be 0600, regular, not a symlink (1.885247ms)
|
||||||
|
✔ binding: token file mode, symlink, emptiness and shape are checked; token never appears in errors (1.250876ms)
|
||||||
|
✔ cli: check refuses a non-0600 token file with exit 2 before any network use (85.329934ms)
|
||||||
|
✔ context files: absolute paths, traversal, symlinks and out-of-repo targets refuse; in-repo files resolve (2.714187ms)
|
||||||
|
✔ cli: check refuses a missing context file and a missing binding with exit 2; usage is exit 4 (292.393518ms)
|
||||||
|
✔ cli: reload validates the file first (exit 2), then needs a live owner (exit 1); usage is exit 4 (177.209687ms)
|
||||||
|
✔ cli: run refuses when STOP is present, before any network use (106.318782ms)
|
||||||
|
✔ binding: tools is optional, validated strictly, a fixed key for reload, and its roots are resolved against the data root (1.567432ms)
|
||||||
|
✔ binding: a git key is validated at load and reaches the extension whole, and only on a writable root (1.043677ms)
|
||||||
|
✔ delivery: an accepted message is in the inbox before the turn, the reply is chunked with one nonce per chunk, and the turn record is write-once (15.782359ms)
|
||||||
|
✔ delivery: refused and unknown outcomes are journaled; a later chunk is not sent after a failure (16.773317ms)
|
||||||
|
✔ delivery: restart with an unknown entry re-sends the same nonce once and reconciles before accepting traffic (1.30001ms)
|
||||||
|
✔ delivery: an unknown entry older than the dedupe window is marked refused, not re-sent; a still-unknown one refuses start (0.95609ms)
|
||||||
|
✔ delivery: repeated unknown reconciliations never refresh the dedupe window; the original intent time decides (1.127706ms)
|
||||||
|
✔ turn: a failed engine turn posts the fixed line, never model output, and writes a failed record (2.123953ms)
|
||||||
|
✔ turn: a second message during a turn is held by the engine, both get their own reply and record (33.147607ms)
|
||||||
|
✔ turn: a thread under a listed channel is answered in the thread; an unknown thread is looked up once (1.629066ms)
|
||||||
|
✔ drop: an unlisted user gets silence and one drop line; no inbox entry, no REST call, no engine call (0.816436ms)
|
||||||
|
✔ drop: an oversize message is accepted into the inbox, answered with the fixed line and journaled as a drop (0.943282ms)
|
||||||
|
✔ restart: an inbox with three ids and a replay of the same three produces zero turns (40.844739ms)
|
||||||
|
✔ stop: STOP present refuses start; STOP written while running refuses new turns and the current one finishes (31.363721ms)
|
||||||
|
✔ ceiling: the ceiling plus one is refused and journaled; one fixed line per UTC day; a new day accepts again (5.541029ms)
|
||||||
|
✔ ceiling: a burst arriving while turns are still running cannot queue past the ceiling (3.848343ms)
|
||||||
|
✔ ceiling: a turn interrupted by a crash still counts after restart; admissions are durable (2.451829ms)
|
||||||
|
✔ ceiling: the daily notice survives a same-day restart; one delivery attempt in total, even when the first attempt crashed mid-flight (4.249323ms)
|
||||||
|
✔ duplicate: the same event delivered twice while the thread lookup is held yields one prompt, one admission and one reply (1.128174ms)
|
||||||
|
✔ journal: no token-shaped string and no model output on the drop path reaches disk (0.420783ms)
|
||||||
|
✔ receipt: an admitted message gets one eyes reaction on the inbound message; drops and refusals get none; a failed reaction is recorded and does not fail the turn (2.206485ms)
|
||||||
|
✔ receipt: Discord refusing the reaction leaves the turn intact and records ok false (1.868096ms)
|
||||||
|
✔ reload: a new user is silent before and answered after; a removed channel goes silent; a lower ceiling applies at once (3.728874ms)
|
||||||
|
✔ reload: a fixed key refuses with exit 2 and the old binding stays in force (1.93698ms)
|
||||||
|
✔ tools: with a tools binding the turn record lists every read and its outcome; without one the field is null (3.629657ms)
|
||||||
|
✔ context: the Discord block names the server, channels and modes, and states the rules from Q15 and Q16 (2.619294ms)
|
||||||
|
✔ context: with tools the block names the roots, keeps file content as data, and says to state refusals plainly (0.816684ms)
|
||||||
|
✔ context: a writable root adds the write rules and says a write is real only once Jason commits (1.942989ms)
|
||||||
|
✔ context: the envelope is one bracketed line then the text; names cannot break the line (1.167856ms)
|
||||||
|
✔ context: a git root swaps the terminal-commit line for the git verbs, and a vault root adds the id protocol (1.293544ms)
|
||||||
|
✔ context: assembleContext concatenates files in launcher format and appends the block; sha256 is stable (1.107096ms)
|
||||||
|
✔ context: splitReply keeps paragraphs together under the limit and splits long ones at lines, spaces, then hard (0.833917ms)
|
||||||
|
✔ pinned Discord render/install and missing prerequisites; checkout bytes unchanged (76.260098ms)
|
||||||
|
✔ Discord status reports effective WorkingDirectory from a fake user manager (40.64704ms)
|
||||||
|
✔ engine: buildPiArgs carries the fixed flags, engine settings, session dir and prompt file (2.235239ms)
|
||||||
|
✔ engine: with tools, buildPiArgs turns pi's own tools off, loads the extension explicitly and allowlists exactly our three (0.393092ms)
|
||||||
|
✔ engine: a run with tool turns settles once, on the answer, with every tool call in the result (46.418454ms)
|
||||||
|
✔ engine: a run that ends on a tool-only turn fails the prompt as empty; a retried run settles on the real end (38.280247ms)
|
||||||
|
✔ engine: one prompt, one turn, text and usage come back (30.629036ms)
|
||||||
|
✔ engine: a prompt while streaming is held until pi settles, then sent as its own run, and answered in order (344.704065ms)
|
||||||
|
✔ engine: a held prompt that times out before pi settles fails on its own and is never sent (228.681035ms)
|
||||||
|
✔ engine: timeout sends abort and fails only that turn; the process stays (104.531123ms)
|
||||||
|
✔ engine: tool events from a run that outlived its timeout never land in the next prompt's record (224.211242ms)
|
||||||
|
✔ engine: a prompt after a turn that timed out before its agent_start waits for pi to settle instead of being refused (124.791143ms)
|
||||||
|
✔ engine: when pi has not started a timed-out turn by the end of the abort grace, the engine stops pi and fails held prompts (212.958803ms)
|
||||||
|
✔ engine: a timed-out turn pi starts only after the grace never answers a later prompt (613.826326ms)
|
||||||
|
✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (early prompt response) (1.34177ms)
|
||||||
|
✔ engine: late events of a run past its grace, before pi exits, answer nothing and nothing more is sent (late prompt response) (0.539539ms)
|
||||||
|
✔ engine: a timed-out run pi did start outlives the grace; the next prompt goes out when it ends (425.964934ms)
|
||||||
|
✔ engine: a malformed JSONL line fails the turn, not the process (23.070738ms)
|
||||||
|
✔ engine: a turn that ends in error rejects with the error code; process exit fails pending turns (46.164314ms)
|
||||||
|
✔ gateway: hello -> identify with intents, ready, heartbeat with jitter, ack (2.427136ms)
|
||||||
|
✔ gateway: missed ack closes the socket and resumes with the last sequence (1.561158ms)
|
||||||
|
✔ gateway: op 7 reconnect resumes; op 9 non-resumable re-identifies (0.554654ms)
|
||||||
|
✔ gateway: op 9 resumable resumes (0.338333ms)
|
||||||
|
✔ gateway: close 4014 is fatal, reports the missing intent, never reconnects (0.981991ms)
|
||||||
|
✔ gateway: 4004 and 4013 are fatal too; 1006 reconnects with identify when no session (0.530492ms)
|
||||||
|
✔ gateway: close() is final and unparseable frames are ignored (0.365576ms)
|
||||||
|
✔ git: config validation is strict, needs write: true, a work tree and a private token file (51.254199ms)
|
||||||
|
✔ git: the child environment drops every host git config, names one helper, and carries the token path only for origin (45.773419ms)
|
||||||
|
✔ git: status reports the branch, ahead/behind and changed paths, and refuses off the named branch or mid-merge (70.541007ms)
|
||||||
|
✔ git: parseStatus reads porcelain v2 including renames and conflicts (0.374891ms)
|
||||||
|
✔ git: a commit stages exactly the named files, carries the seat author and the requester trailer, and pushes at once (71.973914ms)
|
||||||
|
✔ git: commit refusals: message, paths, requester, nothing to commit, and an index that already holds other work (79.286745ms)
|
||||||
|
✔ git: a commit whose push fails is still a commit, says so, and the next commit's push carries both (D6) (76.151776ms)
|
||||||
|
✔ git: pull is fast-forward only; a diverged origin or dirty local files refuse with nothing merged (175.44649ms)
|
||||||
|
✔ git: push pushes the named branch only and reports up to date (55.461941ms)
|
||||||
|
✔ git: no token value or token path ever reaches a git argument list; outputs are masked and capped (75.152748ms)
|
||||||
|
✔ git: the credential helper answers get over https from a private file and nothing else (176.342882ms)
|
||||||
|
✔ git: the vault protocol validates before a commit, honours another owner's lock, reserves ids, and locks around writes (693.866732ms)
|
||||||
|
✔ lock: the claim is exclusive; a second start against a live owner refuses (4.157014ms)
|
||||||
|
✔ lock: a stale lock (dead owner, reused pid, or record without start) refuses run and is never signaled; only unlock clears it (66.059278ms)
|
||||||
|
✔ lock: an incomplete claim (directory without owner record) is busy and refuses run; unlock clears it (0.865204ms)
|
||||||
|
✔ lock: an owner record that exists but cannot be read is invalid: never signaled, never removed, never claimed over (2.868611ms)
|
||||||
|
✔ lock: legacy upgrade; a live connector holding a {pid, start} record is unknown, unlock refuses and nothing changes; after it exits, unlock clears it (39.674149ms)
|
||||||
|
✔ lock: a live pid whose record carries a malformed or noncanonical start or boot string is unknown, not a mismatch; nothing signals, removes, or claims over it (255.416462ms)
|
||||||
|
✔ lock: identity syntax; only canonical unsigned decimal start ticks and lowercase boot uuids are identities (0.373693ms)
|
||||||
|
✔ lock: a process whose start marker or boot id cannot be read refuses to claim (21.909632ms)
|
||||||
|
✔ lock: a live pid whose identity cannot be read right now is unknown: never signaled, never removed, never claimed over (0.911374ms)
|
||||||
|
✔ lock: four processes racing for the same binding; exactly one claims it and the others refuse (40.112074ms)
|
||||||
|
✔ lock: stale handoff; concurrent starts over a stale lock all refuse, nothing reclaims, one unlock then exactly one live owner (113.687809ms)
|
||||||
|
✔ lock: four-party schedule; claims landing inside an unlock's gap never survive, one unlock leaves no owner and no residue (80.106416ms)
|
||||||
|
✔ notices: a kind is recorded per UTC day and found again (0.413556ms)
|
||||||
|
✔ notify: the DM channel opens once, every send carries the nonce, and only the message id comes back (4.702438ms)
|
||||||
|
✔ notify: refusals and unknowns surface as RestOutcome without ids; a refused send reopens the channel next time (2.048797ms)
|
||||||
|
✔ notify: no dmRecipient, a non-0600 binding or token, or a missing binding refuse before any network use (1.608676ms)
|
||||||
|
✔ check --offline validates local fixture without REST or gateway calls (150.817177ms)
|
||||||
|
✔ check --offline refuses token mode and missing context under the selected repo (110.771481ms)
|
||||||
|
✔ run --offline is a usage refusal before reading config or networking (57.183533ms)
|
||||||
|
✔ recover: nothing to do is clean; a lock whose owner is gone or that has no record is cleared and STOP ends up absent (44.798623ms)
|
||||||
|
✔ recover: an operator STOP refuses with exit 3 and is never removed, whatever the lock says (36.345364ms)
|
||||||
|
✔ recover: a brake written during the unlock wins; STOP stays with both lines and the start is refused (32.302513ms)
|
||||||
|
✔ recover: a held binding refuses with exit 3 and writes no STOP: live owner, alive pid without verifiable identity, unreadable record (61.235502ms)
|
||||||
|
✔ cli: recover exits 0 when ready, 3 behind a brake or a held binding, and run's own STOP refusal is 3 (586.840274ms)
|
||||||
|
✔ rest: createMessage sends nonce, enforce_nonce, empty allowed_mentions and a soft reply reference (2.139357ms)
|
||||||
|
✔ rest: 429 waits retry_after and retries; 4xx is refused; 5xx and socket errors are unknown (2.735058ms)
|
||||||
|
✔ rest: content and nonce limits are enforced locally; typing never throws (0.59211ms)
|
||||||
|
✔ rest: react PUTs the encoded emoji on the inbound message for @me; 2xx is true, anything else is false and never throws (0.783952ms)
|
||||||
|
✔ rest: createDm posts the recipient and resolves the channel id; 4xx refused, 5xx unknown, bad id never sent (0.722211ms)
|
||||||
|
✔ setspark config: a bare https or loopback origin, a private key file, a principal (4.751927ms)
|
||||||
|
✔ setspark config: reaches the tools config and the binding as a fixed key (2.757479ms)
|
||||||
|
✔ setspark config: the binding's key survives resolveToolRoots and the engine's JSON hand-off to the extension (1.49611ms)
|
||||||
|
✔ setspark config: approvers come from the binding's users, never from the binding's setspark key (1.889711ms)
|
||||||
|
✔ setspark verbs: required_approvers go out as discord ids from names and come back as names (20.378576ms)
|
||||||
|
✔ setspark verbs: no Discord user id reaches tool text, whatever shape the service returns it in (8.206234ms)
|
||||||
|
✔ setspark contract: a decision made with names opens a request the connector accepts; names stored by an old record still refuse (5.431484ms)
|
||||||
|
✔ setspark keys: read per call, one printable token per file, rotation without a restart (3.270034ms)
|
||||||
|
✔ setspark idempotency keys: principal, turn id, call index; connector keys name a step (0.480031ms)
|
||||||
|
✔ setspark http core: json in and out, bearer header, idempotency header, fixed user agent, no key anywhere else (1.947357ms)
|
||||||
|
✔ setspark http core: error bodies become fixed refusals with code and the 409 fields; server text is data, cut (1010.604435ms)
|
||||||
|
✔ setspark verbs: a setspark key enables the eight verbs and no counters (0.436634ms)
|
||||||
|
✔ setspark verbs: writes carry the turn's key and the asserted requester, reads carry no key, and the api key never appears in text or details (6.000569ms)
|
||||||
|
✔ setspark verbs: no turn refuses every write before any request; bad arguments refuse before any request; reads still work (1.132799ms)
|
||||||
|
✔ setspark verbs: renderRecord caps long output and hides the accepted snapshot (0.225757ms)
|
||||||
|
✔ setspark api: bind, add_approval (button and reply) and get use integer request ids and the connector's keys (2.200019ms)
|
||||||
|
✔ tools: config refuses a missing, symlinked, dotted, non-directory or duplicate root and bad limits (3.696544ms)
|
||||||
|
✔ tools: every escape is refused with a fixed reason and nothing outside the root is read (3.741975ms)
|
||||||
|
✔ tools: happy paths list, read a window, and search case-insensitively; dotfiles and symlinks never appear (4.746462ms)
|
||||||
|
✔ tools: the tool set renders text for the model, records details for the journal, and enforces the per-run budget (3.450612ms)
|
||||||
|
✔ tools: listing and search caps hold (10.04876ms)
|
||||||
|
✔ tools: credential shapes are caught; ordinary prose and ids are not (0.845122ms)
|
||||||
|
✔ tools: the read uses the checked file itself; a symlink, a swapped file, a FIFO, a grown file or a hard link at read time is refused (5.126589ms)
|
||||||
|
✔ tools: an unreadable file under the root is skipped by search and refused by read (1.120697ms)
|
||||||
|
✔ tools: config accepts write: true only as a boolean, and enables the write tools only then (1.111217ms)
|
||||||
|
✔ tools: every write outside the fence is refused before any byte lands, and no temp file remains (5.409338ms)
|
||||||
|
✔ tools: write_file leaves the exact bytes, edit_file replaces one exact match, and the set renders the change as uncommitted (2.797542ms)
|
||||||
|
✔ tools: a target that changed between the check and the rename is refused and the temp file is removed (1.727607ms)
|
||||||
|
✔ web: config takes an https or loopback-http SearXNG base url and a bounded fetch cap (2.242278ms)
|
||||||
|
✔ web: address rules refuse every private, loopback, link-local, mapped and multicast form (1.418045ms)
|
||||||
|
✔ web: web_fetch refuses bad urls, private hosts, rebinding names, non-https redirects, too many hops, error status, non-text bodies, and times out (1021.625644ms)
|
||||||
|
✔ web: web_fetch returns html as text with the title, follows an https redirect, keeps plain text and json, and cuts at the cap (4.09233ms)
|
||||||
|
✔ web: html to text drops scripts, styles and comments, decodes entities and keeps block breaks (0.217576ms)
|
||||||
|
✔ web: web_search asks the instance for json, returns at most ten clean results, and refuses a bad query, a down instance or an unusable answer (2.555515ms)
|
||||||
|
✔ web: the tool set enables the web tools only with a web key, counts them in the budget, and records url, status and hits (2.159134ms)
|
||||||
|
ℹ tests 183
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 183
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 2585.981236
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
✔ sessionModel: agent vars win, then the system's execution settings (15.426201ms)
|
||||||
|
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (5.953766ms)
|
||||||
|
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (3.970248ms)
|
||||||
|
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (5.896742ms)
|
||||||
|
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (10.174631ms)
|
||||||
|
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (2.805548ms)
|
||||||
|
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (8.604071ms)
|
||||||
|
✔ the prompt names the project clones in the workspace, and none when there are none (5.986235ms)
|
||||||
|
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.387195ms)
|
||||||
|
✔ the prompt explains landing to a role with land_work, and to no other (3.738884ms)
|
||||||
|
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (6.416866ms)
|
||||||
|
✔ a bundle is written once: an existing file refuses (1.314855ms)
|
||||||
|
✔ a path with a single quote can't go into the hook command (1.269205ms)
|
||||||
|
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (2.473563ms)
|
||||||
|
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.666416ms)
|
||||||
|
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.515497ms)
|
||||||
|
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.607276ms)
|
||||||
|
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.491851ms)
|
||||||
|
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.994382ms)
|
||||||
|
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (4.607494ms)
|
||||||
|
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (7.10498ms)
|
||||||
|
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.963859ms)
|
||||||
|
✔ allow exits 0, a deny exits 2 with the reason on stderr (136.608806ms)
|
||||||
|
✔ a missing or wrong policy, or a bad event, exits 2 (80.428616ms)
|
||||||
|
✔ the bundle's wrapped command: a missing gate or node still blocks (1083.272246ms)
|
||||||
|
✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (809.201996ms)
|
||||||
|
✔ claude: the hook alone blocks a path outside the workspace (492.968668ms)
|
||||||
|
✔ claude: a second turn resumes the first turn's session (743.320282ms)
|
||||||
|
✔ claude adapter: --restricted is always passed (5.322758ms)
|
||||||
|
✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (16.674144ms)
|
||||||
|
✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (5.584381ms)
|
||||||
|
✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (731.222879ms)
|
||||||
|
✔ claude: a missing hook or MCP file refuses before claude starts (7.77514ms)
|
||||||
|
✔ pi: policy tools and typed tools pass, anything else is blocked (4.031057ms)
|
||||||
|
✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.893263ms)
|
||||||
|
✔ file tool paths must resolve inside the workspace (1.51737ms)
|
||||||
|
✔ pi's own path normalisation can't be used to step out (1.134759ms)
|
||||||
|
✔ a symlink inside the workspace that points out is outside (1.230296ms)
|
||||||
|
✔ a dangling symlink is refused at any depth, in both harnesses (5.347227ms)
|
||||||
|
✔ read is checked under every spelling pi's read would open, in both harnesses (20.029458ms)
|
||||||
|
✔ other spellings cover directories, dangling links and pi's cwd (2.006651ms)
|
||||||
|
✔ a relative path climbs from the workspace's real path, in both harnesses (6.380537ms)
|
||||||
|
✔ claude path fields per tool (1.778925ms)
|
||||||
|
✔ glob patterns stay inside the workspace (1.88594ms)
|
||||||
|
✔ a path that can't be checked is blocked (0.458795ms)
|
||||||
|
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (235.925094ms)
|
||||||
|
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (147.389035ms)
|
||||||
|
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1808.811567ms)
|
||||||
|
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.6597ms)
|
||||||
|
✔ land_work sends one land line and resolves the host's started answer (3.224586ms)
|
||||||
|
✔ initialize, ping and tools/list (58.635604ms)
|
||||||
|
✔ tools/call goes through the tool socket; a refusal is an isError result (48.439466ms)
|
||||||
|
✔ replies are compact JSON; over the cap a tool error names the size and the cap (39.641118ms)
|
||||||
|
✔ unknown tools and methods are JSON-RPC errors and never reach the socket (31.19734ms)
|
||||||
|
✔ a missing argument is a usage error (24.706001ms)
|
||||||
|
✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (389.253501ms)
|
||||||
|
✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (330.067992ms)
|
||||||
|
✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (319.172745ms)
|
||||||
|
✔ pi: a read is refused when pi would open another spelling outside (302.313433ms)
|
||||||
|
✔ pi: a relative path climbs from the real path of a workspace behind a symlink (298.076739ms)
|
||||||
|
✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (305.810518ms)
|
||||||
|
✔ pi: a missing extension refuses before any model call (6.18366ms)
|
||||||
|
✔ pi: an extension without its configuration fails pi's start (256.935667ms)
|
||||||
|
✔ founderCheck: founder variables, then a needed service without a usable token (1.626178ms)
|
||||||
|
✔ turnRequest names the sender, class, reply and decision (0.298951ms)
|
||||||
|
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.301766ms)
|
||||||
|
✔ turnRequest shows the message's own sent time, a day old as well as new (0.2ms)
|
||||||
|
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.349308ms)
|
||||||
|
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (280.758678ms)
|
||||||
|
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (230.484175ms)
|
||||||
|
✔ a task closed on the tracker is missing from the next turn's open list (230.839356ms)
|
||||||
|
✔ a message read a day after it was sent shows the time it was sent (184.473324ms)
|
||||||
|
✔ a decision the human resolves becomes a turn citing the decision and the answer (224.814103ms)
|
||||||
|
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (119.528307ms)
|
||||||
|
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (105.392451ms)
|
||||||
|
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (430.052564ms)
|
||||||
|
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (429.257417ms)
|
||||||
|
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1282.709813ms)
|
||||||
|
✔ the bus's launch notice is one turn with no reply, and is not taken again (251.272061ms)
|
||||||
|
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (148.847029ms)
|
||||||
|
✔ founder credentials stop before the claim (20) (170.30994ms)
|
||||||
|
✔ a refused claim exits 21; an ended run's capability exits 22 (195.756258ms)
|
||||||
|
✔ the launch ending under a running session exits 22 (145.490512ms)
|
||||||
|
✔ a broker that stays unreachable exits 23 after brokerRetries polls (252.902448ms)
|
||||||
|
✔ a broker that is down at the claim exits 23, not 21 (88.491142ms)
|
||||||
|
✔ no capability, or a malformed one, on stdin exits 2 (191.406913ms)
|
||||||
|
✔ a missing or malformed policy exits 2 before the claim (122.254862ms)
|
||||||
|
✔ every role sees read_spec, record writer follows its grant, citation schemas stay strict (17.592288ms)
|
||||||
|
✔ typed socket forwards read content/history and agent record writes, and cannot write a spec (195.670224ms)
|
||||||
|
✔ the PM gets its task verbs and the reads, and no launch (10.560908ms)
|
||||||
|
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (4.040919ms)
|
||||||
|
✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (13.654609ms)
|
||||||
|
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.398039ms)
|
||||||
|
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.171689ms)
|
||||||
|
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (9.199641ms)
|
||||||
|
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (1.093508ms)
|
||||||
|
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.138514ms)
|
||||||
|
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.151429ms)
|
||||||
|
✔ a coder with a tracker gets its own task tools and no task_reassign (0.957224ms)
|
||||||
|
✔ launch only when the business's launch block names the instance as launcher (1.704609ms)
|
||||||
|
✔ an action outside the instance's authority has no tool (1.454172ms)
|
||||||
|
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.824057ms)
|
||||||
|
✔ land_work is there only with land, after push_working, with the task and the decision (3.115143ms)
|
||||||
|
✔ callTool: one JSON line out, the result back, a refusal rejects (8.947507ms)
|
||||||
|
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.417558ms)
|
||||||
|
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.604895ms)
|
||||||
|
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.604995ms)
|
||||||
|
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.565861ms)
|
||||||
|
ℹ tests 108
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 108
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 12062.67946
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
✔ a raw token file, with or without one trailing newline, reaches curl only through the config stream (103.319993ms)
|
||||||
|
✔ the raw path accepts nothing else, and refuses before curl runs (344.416836ms)
|
||||||
|
✔ the file checks still apply on the raw path: mode, symlink, missing, directory (259.419296ms)
|
||||||
|
✔ the raw path base URL has no override (49.408313ms)
|
||||||
|
✔ the JSON path is unchanged, and JSON never falls through to the raw path (233.546237ms)
|
||||||
|
✔ a file that changes between the two reads refuses before curl runs, with or without a body (677.833959ms)
|
||||||
|
✔ the token reaches no child environment, even with an inherited CFG or SHELLOPTS=allexport (635.806294ms)
|
||||||
|
✔ real helper GET HTTP 200 preserves exit 0 without credentials (13.423963ms)
|
||||||
|
✔ real helper POST HTTP 201 preserves exit 0 without credentials (9.971225ms)
|
||||||
|
✔ real helper GET HTTP 403 preserves exit 1 without credentials (8.654743ms)
|
||||||
|
✔ fixture git subjects only, follow-ups and three session kinds (174.44122ms)
|
||||||
|
✔ text and JSON carry same numbers, open and truncated title (215.285336ms)
|
||||||
|
✔ missing credentials exit 2, no-issues never calls API and shows unknown (173.684134ms)
|
||||||
|
✔ empty range gives no rows and zero totals (149.759399ms)
|
||||||
|
✔ inclusive UTC dates, first-line preamble only, role and seat boundaries (144.336957ms)
|
||||||
|
✔ close-only issue included, even median, missing metadata stays unknown (141.311961ms)
|
||||||
|
✔ unique commits but per-issue links count multiple tags once each (141.717138ms)
|
||||||
|
✔ issue pages of 50, 50 and 7 read 107 issues in 3 pages (298.180178ms)
|
||||||
|
✔ one short page reads 1 page; --no-issues reads none and says so (260.285241ms)
|
||||||
|
✔ a short page 10 is read; a full page 10 refuses at the ceiling (679.782078ms)
|
||||||
|
✔ an issue number on two pages refuses (152.780721ms)
|
||||||
|
✔ a failing page 2 refuses the whole read without its stderr (150.538684ms)
|
||||||
|
✔ page 2 with a malformed record refuses (150.693881ms)
|
||||||
|
✔ page 2 with more than 50 rows refuses (156.248507ms)
|
||||||
|
✔ bad API payload not JSON refuses (154.473755ms)
|
||||||
|
✔ bad API payload {} refuses (149.195319ms)
|
||||||
|
✔ bad API payload [{"number":1}] refuses (152.653228ms)
|
||||||
|
✔ partial or malformed session log refuses with location, not content (252.118138ms)
|
||||||
|
✔ a U+2028 or U+2029 inside a session string is one line, not a malformed record (146.427506ms)
|
||||||
|
✔ no sessions is an empty table; symlink source refuses (206.995223ms)
|
||||||
|
✔ reads only refactor even when another branch is checked out (161.436673ms)
|
||||||
|
✔ invalid dates, reverse dates and duplicate options refuse (112.167186ms)
|
||||||
|
✔ T3 agent assignments do not count as human in Table 2 (151.831422ms)
|
||||||
|
✔ preamble parsing and issue number boundaries (0.542246ms)
|
||||||
|
✔ T3 header: agent, or board from control-board; anything short of the full header is human (0.201219ms)
|
||||||
|
✔ no closed issues with human messages means undefined ratio, not invented zero (0.244746ms)
|
||||||
|
✔ T3: seat, archived, unmapped and Researcher threads count; imported, deleted and other-project threads do not (458.65423ms)
|
||||||
|
✔ T3: the default path is read from HOME and prints no path line; --no-t3 says so (698.556343ms)
|
||||||
|
✔ T3: a HOME with no database exits 1 and names --no-t3 (128.50896ms)
|
||||||
|
✔ T3: a file that is not a database exits 1 and names --no-t3 (129.02726ms)
|
||||||
|
✔ T3: a seat thread renamed to another seat exits 1 naming thread, title and roles (372.466509ms)
|
||||||
|
✔ T3: an unmapped thread addressed as a seat exits 1 (371.964628ms)
|
||||||
|
✔ T3: a header to another thread id is not cross-checked (434.135603ms)
|
||||||
|
✔ T3: no project, or two, for this root exits 1 (1039.515227ms)
|
||||||
|
✔ T3: a removed column exits 1 and names it (220.860321ms)
|
||||||
|
✔ T3: a missing table exits 1 and names it (231.282681ms)
|
||||||
|
✔ T3: a counted row with an unknown role exits 1 without its text (373.954159ms)
|
||||||
|
✔ T3: a counted row with role reasoning without the reasoning: id prefix exits 1 without its text (399.565674ms)
|
||||||
|
✔ T3: a counted row with non-text content exits 1 without its text (385.413317ms)
|
||||||
|
✔ T3: a counted row with an unparseable created_at exits 1 without its text (400.195979ms)
|
||||||
|
✔ T3: a reasoning summary is skipped before any check and counted as excluded (1046.821063ms)
|
||||||
|
✔ T3: a missing orchestration_events makes the diagnostic unknown and keeps the counts (699.329392ms)
|
||||||
|
✔ T3: a human message with no event counts in humanWithoutEvent (407.052043ms)
|
||||||
|
✔ T3: an unparseable event makes the diagnostic unknown and keeps the counts (707.239156ms)
|
||||||
|
✔ T3: an event with no string messageId makes the diagnostic unknown and keeps the counts (666.305508ms)
|
||||||
|
✔ T3: an error that is not from SQLite is rethrown, not reported as a database failure (308.350284ms)
|
||||||
|
✔ T3: a symlink at ~/.t3 exits 1 (132.290988ms)
|
||||||
|
✔ T3: a symlink at ~/.t3/userdata exits 1 (128.109277ms)
|
||||||
|
✔ T3: a symlink at ~/.t3/userdata/state.sqlite exits 1 (124.702265ms)
|
||||||
|
✔ T3: with --t3-db, a symlinked file or directory exits 1 (423.551244ms)
|
||||||
|
✔ T3 WAL: the newest message only in -wal, writer attached, is counted (406.23556ms)
|
||||||
|
✔ T3 WAL: stopped cleanly, counts are correct and the main file is unchanged (384.074874ms)
|
||||||
|
✔ T3 WAL: -wal without -shm in a writable directory is read (429.825639ms)
|
||||||
|
✔ T3 WAL: -wal without -shm in a read-only directory exits 1 (406.330152ms)
|
||||||
|
✔ T3 WAL: stopped cleanly in a read-only directory exits 1 (383.286737ms)
|
||||||
|
✔ T3: a lock held past the 5 s busy timeout exits 1 and names --no-t3 (5377.931527ms)
|
||||||
|
✔ a done row whose closing issue is open is a violation; a row that is not done is not (1.740114ms)
|
||||||
|
✔ an issue several rows close is expected closed only once all of them are done (0.483797ms)
|
||||||
|
✔ closure needs positive evidence: unknown is undecided, and so is a skipped or short issue check (0.357854ms)
|
||||||
|
✔ each owner of an in-progress or in-review row gets one liveness class (7.309545ms)
|
||||||
|
✔ a required row not done after 14 days is a violation; a legacy row uses genesis as its lower bound (0.372233ms)
|
||||||
|
✔ an ISO requiredSince, as `set required` writes it, ages from its UTC day; one that does not parse is a violation (0.214026ms)
|
||||||
|
✔ the text section always ends in a count and a result, and never prints a full pass (0.31421ms)
|
||||||
|
✔ pidAlive: a running pid is present, an exited one is gone, and EPERM still means present (25.052542ms)
|
||||||
|
✔ issue states: open list first, then the metric page, then at most 10 lookups (264.018577ms)
|
||||||
|
✔ a full open list: lookups settle what it leaves out, and only an unsettled issue keeps it undecided (341.699272ms)
|
||||||
|
✔ the open list refuses on a failed call or a bad record, and never echoes the helper (166.824529ms)
|
||||||
|
✔ a helper call past the deadline is killed with its child, and the call reports it (2007.303402ms)
|
||||||
|
✔ readQueue loads queue.json through the queue validator and refuses anything else (115.002317ms)
|
||||||
|
✔ protected changes list every in-range entry that changes a required or parked row (411.070368ms)
|
||||||
|
✔ the CLI prints the queue section above the weekly table and under a queue key in --json (630.015555ms)
|
||||||
|
✔ a queue with nothing wrong prints 0 violations and a reduced pass, never a full pass (248.341279ms)
|
||||||
|
✔ --no-issues makes no call and leaves the issue checks undecided; --no-queue skips the section (298.631142ms)
|
||||||
|
✔ the CLI refuses a bad queue before any call, and a failed open list with exit 2 (279.836515ms)
|
||||||
|
✔ --unsupported-runtime repeats once per seat and takes a seat name (335.559956ms)
|
||||||
|
✔ an unreadable config makes every owner invalid instead of passing them (180.835801ms)
|
||||||
|
ℹ tests 86
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 86
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 22208.339871
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
✔ pure resolution selects current default or explicit enrolled account (1.858635ms)
|
||||||
|
✔ scope is explicit, bounded and never inferred (1.562406ms)
|
||||||
|
✔ fork pin is preserved against default change, override, missing account and revocation (0.704737ms)
|
||||||
|
✔ unenrolled account/provider, missing harness, model expansion and native model ceiling refuse (0.776972ms)
|
||||||
|
✔ only explicit synthetic credential forms and internal fixture stores admitted (5.241997ms)
|
||||||
|
✔ two concurrent workspaces of the same agent publish distinct complete private generations (61.235418ms)
|
||||||
|
✔ same execution ID is exclusively claimed and cannot overwrite a published generation (37.145447ms)
|
||||||
|
✔ failed generation after-auth preserves prior files, records failure and refuses blind same-ID retry (46.092803ms)
|
||||||
|
✔ failed generation before-publish preserves prior files, records failure and refuses blind same-ID retry (56.224213ms)
|
||||||
|
✔ credential lock contention refuses without duplicate side effects (11.441063ms)
|
||||||
|
✔ symlinked pre-existing final target is refused and never followed (26.274133ms)
|
||||||
|
✔ invalid registry cannot resolve; no fallback to supplied partial entries (0.261534ms)
|
||||||
|
✔ post-publication failure records uncertainty, preserves complete generation and prevents replay (26.469833ms)
|
||||||
|
✔ expired credentials refresh under transaction and subsequent generation reuses rotation (85.705359ms)
|
||||||
|
✔ refresh failure retains prior generation and store state (67.915398ms)
|
||||||
|
✔ refresh timeout retains prior generation and store state (143.987798ms)
|
||||||
|
✔ refresh malformed retains prior generation and store state (61.043056ms)
|
||||||
|
✔ concurrent refresh on same account refuses contention while unrelated account proceeds (222.143186ms)
|
||||||
|
✔ invalid refresh options refuse before burning claim (32.939424ms)
|
||||||
|
✔ fixed fake process rotates both OAuth fields without mutating caller input (27.644165ms)
|
||||||
|
✔ concurrent isolated processes preserve separate provider credentials (26.277778ms)
|
||||||
|
✔ fake failure is refused with fixed diagnostics (20.804511ms)
|
||||||
|
✔ fake malformed is refused with fixed diagnostics (21.082616ms)
|
||||||
|
✔ fake timeout is refused with fixed diagnostics (103.077709ms)
|
||||||
|
✔ fake unchanged is refused with fixed diagnostics (26.513141ms)
|
||||||
|
✔ caller executable/environment injection is rejected before spawning (0.267455ms)
|
||||||
|
✔ valid fixture tree validates and lists without secrets (66.070767ms)
|
||||||
|
✔ unknown-field refuses (0.370577ms)
|
||||||
|
✔ invalid-id refuses uppercase and traversal shapes (0.258256ms)
|
||||||
|
✔ plain-http baseUrl requires allowInsecureTransport (0.28458ms)
|
||||||
|
✔ native provider rejects allowInsecureTransport (0.192161ms)
|
||||||
|
✔ unsupported credential type and kind refuse (0.156443ms)
|
||||||
|
✔ account provider-path mismatch refuses (0.592846ms)
|
||||||
|
✔ profile account refs must be provider/account shaped (0.217551ms)
|
||||||
|
✔ seat selection accepts fork pin field, validates account refs (0.203263ms)
|
||||||
|
✔ harness manifest id must equal executable (gate 1) (0.19166ms)
|
||||||
|
✔ CLI validate: duplicate provider id across files refuses (24.805729ms)
|
||||||
|
✔ CLI validate: missing referenced provider/account refuse (31.890107ms)
|
||||||
|
✔ CLI validate: broken JSON refuses without secret echo (28.954697ms)
|
||||||
|
✔ CLI usage errors exit 2 (46.619033ms)
|
||||||
|
✔ credential.json sibling presence does not break validation and is never read (62.210114ms)
|
||||||
|
✔ D1 missing, empty and structurally empty roots refuse, no list projection (158.235171ms)
|
||||||
|
✔ D1 required directory auth cannot be absent (50.176557ms)
|
||||||
|
✔ D1 required directory auth/providers cannot be absent (50.342313ms)
|
||||||
|
✔ D1 required directory auth/accounts cannot be absent (58.020423ms)
|
||||||
|
✔ D1 required directory auth/settings cannot be absent (60.093777ms)
|
||||||
|
✔ D1 required directory harnesses cannot be absent (61.94281ms)
|
||||||
|
✔ D1 root file and unreadable metadata refuse (104.987282ms)
|
||||||
|
✔ D2 no symlink traversal at auth/providers/openai-codex.json (53.597215ms)
|
||||||
|
✔ D2 no symlink traversal at auth/accounts/openai-codex/homelab-openai (63.876425ms)
|
||||||
|
✔ D2 no symlink traversal at auth/providers (51.350593ms)
|
||||||
|
✔ D2 no symlink traversal at auth (56.989942ms)
|
||||||
|
✔ D2 root and ancestor symlinks and lexical traversal refuse (147.35417ms)
|
||||||
|
✔ private filesystem modes enforced for root (49.138433ms)
|
||||||
|
✔ private filesystem modes enforced for auth (50.331309ms)
|
||||||
|
✔ private filesystem modes enforced for auth/providers/openai-codex.json (53.638332ms)
|
||||||
|
✔ private filesystem modes enforced for auth/accounts/openai-codex/homelab-openai/account.json (55.961905ms)
|
||||||
|
✔ D3 numeric version 1 only across all record kinds (1.148025ms)
|
||||||
|
✔ D4 nested unknown keys and missing per-kind required fields refuse (61.70438ms)
|
||||||
|
✔ D5 unenrolled default refuses even when account exists (67.552416ms)
|
||||||
|
✔ D6 provider/account credential type must match (64.573731ms)
|
||||||
|
✔ D7 every harness endpoint enforces HTTP opt-in and shape (0.437575ms)
|
||||||
|
✔ D8 URLs reject embedded credentials and unsupported protocols without echo (162.634531ms)
|
||||||
|
✔ D9 malformed JSON diagnostics contain no content excerpt (59.317986ms)
|
||||||
|
✔ D10 missing metadata is missing-path, not invalid-json (62.937779ms)
|
||||||
|
✔ D10 library returns no partial entries on any invalid record (73.549746ms)
|
||||||
|
✔ null/scalar/array metadata refuses without stack or echo (235.698678ms)
|
||||||
|
✔ credential sibling is never opened, even when an unreadable symlink (29.630318ms)
|
||||||
|
✔ oversized metadata refuses before parsing (59.179473ms)
|
||||||
|
ℹ tests 69
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 69
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 2056.635811
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.007903ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.217903ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.838794ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.146828ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.143146ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.653064ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.514702ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.548189ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.47303ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.154364ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.874133ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.644965ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.31592ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.756848ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.61993ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.431135ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.602182ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.795577ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.068206ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.16316ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (0.987973ms)
|
||||||
|
✔ REQ-PLUG-2 the real tree's searxng-url module switches on as the search-source and answers (2.624486ms)
|
||||||
|
✔ REQ-PLUG-2 a SearXNG that refuses JSON (403) is search-down, a bad settings url throws (1.111132ms)
|
||||||
|
✔ REQ-PLUG-2 search-source takes one name, not a list (0.234458ms)
|
||||||
|
✔ REQ-PLUG-2 searxng-bundled queries the fixed loopback address and ignores web.searxng (0.722013ms)
|
||||||
|
✔ REQ-PLUG-2 harness-builtin switches on, serves no broker search, and refuses if called (0.593234ms)
|
||||||
|
✔ the searxng modules end the request when the broker's AbortSignal fires (41.535969ms)
|
||||||
|
✔ hasModule: true for a shipped module, false for a missing one, an unknown kind or a bad name (0.464909ms)
|
||||||
|
ℹ tests 28
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 28
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 223.296533
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
✔ failed init cleans its layout and permits retry (pre-existing=false) (30.351989ms)
|
||||||
|
✔ failed init cleans its layout and permits retry (pre-existing=true) (28.403711ms)
|
||||||
|
✔ project check distinguishes a complete but uncommitted layout (13.761872ms)
|
||||||
|
✔ record repo refuses every declared code root including a sibling project (0.619841ms)
|
||||||
|
✔ agent record writer refuses a human definition without changing history or files (12.851689ms)
|
||||||
|
✔ failed init preserves an unrelated file created while its commit runs (11.086909ms)
|
||||||
|
✔ failed init preserves an unrelated file inside a newly created layout directory (11.418719ms)
|
||||||
|
✔ failed init refuses to delete a replacement of its owned metadata file (11.324705ms)
|
||||||
|
✔ init creates a checked versioned layout, valid templates and human-authored local history (25.409061ms)
|
||||||
|
✔ init honors repo, refuses a non-empty directory and an undeclared project without touching files (14.678882ms)
|
||||||
|
✔ check reports every bad record, filename mismatch and unknown top-level path (12.535479ms)
|
||||||
|
✔ one writer commits validated docs, requirements and decisions with the bound agent author (100.149809ms)
|
||||||
|
✔ writer refuses spec paths, bad schemas, mismatched IDs and invalid actor metadata before changing history (14.904455ms)
|
||||||
|
✔ writer refuses human pending edits and remotes instead of absorbing or contacting them (20.882314ms)
|
||||||
|
✔ links, repo/code overlap, identity mismatch and a busy writer refuse safely (21.909453ms)
|
||||||
|
✔ schemas remain package-owned and reject invalid nested data and dates (0.326768ms)
|
||||||
|
✔ git commit failure restores only the attempted record and leaves human history unchanged (153.162615ms)
|
||||||
|
✔ git hooks and ambient git identity cannot alter the record writer or execute outside actions (37.383567ms)
|
||||||
|
✔ project-local schemas cannot weaken checks; invalid UTF-8 and linked git directories refuse (14.476643ms)
|
||||||
|
✔ schema constraints and layout omissions are reported independently (14.310685ms)
|
||||||
|
✔ unsupported schema keywords, malformed contexts, ignored local config and nonempty markers refuse (20.847602ms)
|
||||||
|
✔ a linked git directory is refused before a writer lock can touch its target (33.005222ms)
|
||||||
|
✔ spec reads exact committed content and its path commit/log, not dirty bytes or a later docs commit (61.511428ms)
|
||||||
|
✔ latest agent spec edit is visible but never confirmed or replaced by an earlier human version (29.860129ms)
|
||||||
|
✔ shared file reader exposes committed docs and refuses path/revision injection or another history (55.077987ms)
|
||||||
|
✔ reader rejects missing paths, links, invalid UTF-8, NUL and oversized committed blobs (219.312497ms)
|
||||||
|
✔ reader refuses mismatched committed project identity, unsafe config and unknown argument keys (28.722384ms)
|
||||||
|
✔ path history is bounded at 100 and explicitly marks truncation (667.051499ms)
|
||||||
|
✔ committed UTF-8 BOM, Unicode and trailing newlines are returned without normalization (28.831474ms)
|
||||||
|
✔ D4: spec log refuses a commit subject larger than its 256 KiB read bound (33.139387ms)
|
||||||
|
ℹ tests 30
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 30
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1176.427414
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
✔ isRunId accepts the run id shape and nothing else (0.855325ms)
|
||||||
|
✔ a missing data root or runs directory lists nothing (1.301876ms)
|
||||||
|
✔ runs as a regular file lists nothing, as before (0.513664ms)
|
||||||
|
✔ listRunIds keeps r- names only, sorted oldest first (0.650391ms)
|
||||||
|
✔ listRunRecords returns each result, or null for an incomplete or unreadable one (1.203557ms)
|
||||||
|
✔ readRunRecord returns documents and artifacts in directory order (0.849036ms)
|
||||||
|
✔ readRunRecord is null for a missing run, a dangling link or a file (0.565499ms)
|
||||||
|
✔ readRunRecord and readRunDocument refuse an invalid run id before touching the disk (0.553379ms)
|
||||||
|
✔ readRunDocument reads only the three run documents (0.466004ms)
|
||||||
|
✔ a link inside the data root is followed (0.823587ms)
|
||||||
|
✔ a data root that is itself a link is trusted as configured (0.552043ms)
|
||||||
|
✔ a run directory linked out of the data root is never read (0.574095ms)
|
||||||
|
✔ a document linked out of the data root reads as null (0.716721ms)
|
||||||
|
✔ a runs directory linked out of the data root refuses (0.491276ms)
|
||||||
|
✔ a relative link that climbs out of the data root refuses (0.345388ms)
|
||||||
|
✔ a sibling whose name starts with the data root's name is outside it (0.418242ms)
|
||||||
|
✔ a link loop refuses instead of reading as missing (0.521519ms)
|
||||||
|
✔ an unreadable runs directory refuses instead of listing nothing (0.357978ms)
|
||||||
|
✔ an unreadable run directory refuses instead of reading as missing (0.42653ms)
|
||||||
|
✔ a link to the data root's parent is outside it (0.318816ms)
|
||||||
|
✔ listRunIds sorts whatever order the directory returns (0.642476ms)
|
||||||
|
✔ listRunRecords lists an r- name that isn't a valid run id, as before (0.404631ms)
|
||||||
|
✔ the readers write nothing (1.612362ms)
|
||||||
|
✔ no pointer is null (1.424732ms)
|
||||||
|
✔ the pointer release.sh writes reads back (0.929509ms)
|
||||||
|
✔ a pointer that isn't the version 1 shape refuses with exit 2 (1.454753ms)
|
||||||
|
✔ a pointer that is a directory refuses with exit 4 (0.947944ms)
|
||||||
|
✔ a state file linked out of the data root refuses (0.800691ms)
|
||||||
|
✔ a state directory linked out of the data root refuses (0.476511ms)
|
||||||
|
✔ a state directory linked out to nothing reads as no release and an empty log (0.400899ms)
|
||||||
|
✔ a missing log is empty (0.305609ms)
|
||||||
|
✔ the log reads oldest first and counts malformed lines (0.801116ms)
|
||||||
|
✔ last must be a positive integer (0.403952ms)
|
||||||
|
✔ the state readers write nothing (0.651569ms)
|
||||||
|
✔ list prints each run in the established format (60.375413ms)
|
||||||
|
✔ list prints a damaged result.json as unknown and keeps listing the runs after it (61.780734ms)
|
||||||
|
✔ list prints each result field that isn't a string as unknown or - (59.241225ms)
|
||||||
|
✔ show prints the run in the established format (61.491812ms)
|
||||||
|
✔ show of a missing run and an invalid id exit 4 as before (93.48065ms)
|
||||||
|
✔ list and show refuse a runs directory linked out of the data root (120.96331ms)
|
||||||
|
✔ show refuses a run linked out of the data root; list reports it unknown (114.079855ms)
|
||||||
|
✔ list shows an r- name that isn't a valid run id, as before (60.056464ms)
|
||||||
|
✔ show refuses an invalid id before reading the config (34.971187ms)
|
||||||
|
ℹ tests 43
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 43
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 718.469224
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
✔ a first launch clones the root at its branch, with the root's path as origin (36.53327ms)
|
||||||
|
✔ the clone is not at its place until git clone has finished (21.72301ms)
|
||||||
|
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (62.082746ms)
|
||||||
|
✔ a clone ahead of the root keeps its commits and counts as current (43.479173ms)
|
||||||
|
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||||
|
✔ a modified file (47.12321ms)
|
||||||
|
✔ an untracked file (51.911516ms)
|
||||||
|
✔ a staged file (46.284785ms)
|
||||||
|
✔ another branch (42.288921ms)
|
||||||
|
✔ a detached HEAD (44.935938ms)
|
||||||
|
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (233.684167ms)
|
||||||
|
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (45.217585ms)
|
||||||
|
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||||
|
✔ not-a-clone (24.93768ms)
|
||||||
|
✔ hooks-present (28.106892ms)
|
||||||
|
✔ submodule (33.456952ms)
|
||||||
|
✔ config-changed (31.339883ms)
|
||||||
|
✔ root-unreadable (30.308475ms)
|
||||||
|
✔ root-detached (38.037936ms)
|
||||||
|
✔ status-failed, on the root's branch and clean (39.674963ms)
|
||||||
|
✔ status-failed, dirty (42.873243ms)
|
||||||
|
✔ a clone kept before the branch check, or for a failed status, gets no fetch (270.011543ms)
|
||||||
|
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (48.97056ms)
|
||||||
|
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (57.771552ms)
|
||||||
|
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (90.311514ms)
|
||||||
|
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||||
|
✔ user.name (29.02329ms)
|
||||||
|
✔ user.email (33.238026ms)
|
||||||
|
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (62.771732ms)
|
||||||
|
✔ a commit git can't read after the fast-forward is null (51.363839ms)
|
||||||
|
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (21.318323ms)
|
||||||
|
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||||
|
✔ core.fsmonitor (36.336067ms)
|
||||||
|
✔ core.hooksPath (35.308412ms)
|
||||||
|
✔ a hook file (31.365203ms)
|
||||||
|
✔ include.path (34.472125ms)
|
||||||
|
✔ includeIf (36.084654ms)
|
||||||
|
✔ a filter driver (34.055899ms)
|
||||||
|
✔ origin moved (32.539935ms)
|
||||||
|
✔ a second origin url (33.07798ms)
|
||||||
|
✔ the origin url twice, both the root (36.790434ms)
|
||||||
|
✔ an ext:: origin (33.773105ms)
|
||||||
|
✔ a branch tracking another remote (32.53664ms)
|
||||||
|
✔ a branch merging a tag (33.0562ms)
|
||||||
|
✔ a fetch line onto local branches (45.722419ms)
|
||||||
|
✔ no origin (37.741976ms)
|
||||||
|
✔ a config file over the size cap (33.097067ms)
|
||||||
|
✔ config a symlink to /dev/zero (32.784416ms)
|
||||||
|
✔ the clone a symlink to the bait (37.309026ms)
|
||||||
|
✔ the clone a file (32.263156ms)
|
||||||
|
✔ the clone a plain directory (32.341275ms)
|
||||||
|
✔ .git a gitdir: file (33.511435ms)
|
||||||
|
✔ .git a symlink (34.115538ms)
|
||||||
|
✔ .git/logs a symlink (31.968904ms)
|
||||||
|
✔ .git/refs/heads a symlink (31.658663ms)
|
||||||
|
✔ .git/objects a symlink (32.924046ms)
|
||||||
|
✔ a reflog hard-linked to a file outside (34.527659ms)
|
||||||
|
✔ HEAD a fifo (33.428633ms)
|
||||||
|
✔ a commondir file (33.702159ms)
|
||||||
|
✔ an alternates file (32.027032ms)
|
||||||
|
✔ a gitlink staged, no .gitmodules (43.814198ms)
|
||||||
|
✔ a gitlink and .gitmodules staged (46.983327ms)
|
||||||
|
✔ a gitlink to a repository with its own gitlink (53.609458ms)
|
||||||
|
✔ a gitlink and .gitmodules committed (49.869838ms)
|
||||||
|
✔ a gitlink and submodule.active in config (47.500325ms)
|
||||||
|
✔ a .git/modules with no gitlink (35.716895ms)
|
||||||
|
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1240.317214ms)
|
||||||
|
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||||
|
✔ missing (10.076311ms)
|
||||||
|
✔ not a repository (9.980061ms)
|
||||||
|
✔ a plain directory inside another repository (14.719629ms)
|
||||||
|
✔ unreadable (10.094249ms)
|
||||||
|
✔ on no branch (11.905195ms)
|
||||||
|
✔ missing an object (15.137253ms)
|
||||||
|
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (72.687428ms)
|
||||||
|
✔ a clone whose root is on no branch, or gone, is kept and named (29.968752ms)
|
||||||
|
✔ no credential or forge remote of the root reaches a clone (48.688931ms)
|
||||||
|
✔ every project in the business file gets its own clone at its own branch (39.973706ms)
|
||||||
|
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.296908ms)
|
||||||
|
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.355942ms)
|
||||||
|
✔ a timeout signals git's process group, so a process git started dies with it (514.766177ms)
|
||||||
|
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (521.179359ms)
|
||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.06295ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.16136ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (25.55366ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.375068ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (146.561651ms)
|
||||||
|
✔ runGate: the first failing step stops the gate and names its log (228.628569ms)
|
||||||
|
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (164.670764ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (568.016482ms)
|
||||||
|
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.698995ms)
|
||||||
|
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.713757ms)
|
||||||
|
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.658155ms)
|
||||||
|
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.164466ms)
|
||||||
|
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.977119ms)
|
||||||
|
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.161728ms)
|
||||||
|
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1712.481289ms)
|
||||||
|
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2456.579466ms)
|
||||||
|
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (260.065427ms)
|
||||||
|
✔ resolveSeat: by name under --repo resolves the repo layout (1.340055ms)
|
||||||
|
✔ resolveSeat: by path resolves the fleet layout (0.338374ms)
|
||||||
|
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.715789ms)
|
||||||
|
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.64427ms)
|
||||||
|
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.789064ms)
|
||||||
|
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.307441ms)
|
||||||
|
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.122049ms)
|
||||||
|
✔ CLI launch: registers, execs the fake launch script, and passes args through (31.622215ms)
|
||||||
|
✔ CLI launch: --harness lands in the record (28.801084ms)
|
||||||
|
✔ CLI launch: the launch script's own exit code passes through (27.301255ms)
|
||||||
|
✔ CLI launch: relaunching a seat rewrites the one registration record (58.619438ms)
|
||||||
|
✔ CLI launch: omitting --task records an empty string, not null (28.870329ms)
|
||||||
|
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (84.419701ms)
|
||||||
|
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (126.363377ms)
|
||||||
|
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.45891ms)
|
||||||
|
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.551553ms)
|
||||||
|
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.715893ms)
|
||||||
|
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.117535ms)
|
||||||
|
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (254.795453ms)
|
||||||
|
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.79778ms)
|
||||||
|
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.743822ms)
|
||||||
|
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.248085ms)
|
||||||
|
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.548494ms)
|
||||||
|
✔ session file and launch log: 0600, the session file written once (1.037325ms)
|
||||||
|
✔ endReason maps the runner's exit codes; a signal is killed (0.131241ms)
|
||||||
|
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.732897ms)
|
||||||
|
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.584148ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.750341ms)
|
||||||
|
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.955864ms)
|
||||||
|
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (302.007076ms)
|
||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.152536ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (150.856635ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (147.418579ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (67.643867ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (44.290334ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (142.98199ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (101.199795ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (103.028033ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (64.100795ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (126.493614ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (172.783866ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (422.39657ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (28.003359ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2187.835368ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.127111ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (28.894443ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (126.674189ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (16.339097ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.352209ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (214.402529ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (146.513368ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (116.446654ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (350.201075ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (227.846829ms)
|
||||||
|
ℹ tests 148
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 148
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6079.672118
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
✔ the boot config is checked before anything starts (96.584994ms)
|
||||||
|
✔ a business with no tracker entry refuses task verbs (110.669488ms)
|
||||||
|
✔ credential.expiring and .expired are recorded once per instance (207.702524ms)
|
||||||
|
✔ a token file that changes on disk records credential.changed (114.476589ms)
|
||||||
|
✔ autostart polls, reconciles and retries a startup the tracker was down for (115.121393ms)
|
||||||
|
✔ a refusal a restart must clear is not retried by the poll (99.826698ms)
|
||||||
|
✔ a poll that fires while two are queued is dropped (100.516178ms)
|
||||||
|
✔ close waits for a running verb and refuses one that has not started (194.156972ms)
|
||||||
|
✔ stopped bus resumes an empty task cursor after a long outage, exactly once (187.684601ms)
|
||||||
|
✔ persisted IDs avoid replay, exclude bots and bound rows to observed new comments (185.894752ms)
|
||||||
|
✔ commit followed by crash before cache advance neither loses nor duplicates a comment (139.72801ms)
|
||||||
|
✔ failed event insert rolls back cursor and a retry still emits the comment once (139.788815ms)
|
||||||
|
✔ initial cursor accepts a comment within the stated one-minute clock skew margin (112.878668ms)
|
||||||
|
✔ the bundled Vikunja is the pinned upstream image the runbook names (1.090074ms)
|
||||||
|
✔ every published port is on 127.0.0.1, and no secret is in the file (0.399021ms)
|
||||||
|
✔ the committed table loads frozen; its verbs are the broker task verbs (1.215147ms)
|
||||||
|
✔ a write names a verb the table has as its own key, not one it inherits (0.432868ms)
|
||||||
|
✔ the schema refuses any other shape (1.85717ms)
|
||||||
|
✔ the Field table in the slice 1 plan names the verbs each field is written by (0.55073ms)
|
||||||
|
✔ each verb refuses, asks for a decision and writes as the table and the role files say (1160.138311ms)
|
||||||
|
✔ the list holds the PRD's requirement ids, in its order, at its version (1.372814ms)
|
||||||
|
✔ the committed list loads frozen (0.601668ms)
|
||||||
|
✔ the schema refuses any other shape (2.208473ms)
|
||||||
|
✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (340.794806ms)
|
||||||
|
✔ the project list holds recorded project objects in the recorded list envelope (98.908802ms)
|
||||||
|
✔ the recorded task bodies pass the checks S3 applies to every read (0.434159ms)
|
||||||
|
✔ the client works against the fake over real HTTP with the platform fetch (263.819591ms)
|
||||||
|
✔ a correct install starts, and the first reconcile records tasks that already exist (120.086942ms)
|
||||||
|
✔ verbs refuse while a business is starting and after startup refused it (125.305217ms)
|
||||||
|
✔ startup refuses a token that can do more than its role needs (388.355867ms)
|
||||||
|
✔ startup refuses an unsupported version and flags an untested one (284.994252ms)
|
||||||
|
✔ startup refuses a board that the runbook did not install (315.403275ms)
|
||||||
|
✔ startup refuses a project the sync bot cannot read (88.583835ms)
|
||||||
|
✔ startup refuses a configured label the pm bot cannot see (85.601883ms)
|
||||||
|
✔ startup refuses an expired credential and a missing sync credential (175.30681ms)
|
||||||
|
✔ an unreachable tracker refuses with tracker-unavailable (78.625244ms)
|
||||||
|
✔ an edit in the UI is recorded once, with the fields that changed (205.506174ms)
|
||||||
|
✔ a move between open buckets is seen on the board, though updated does not change (171.429535ms)
|
||||||
|
✔ a person's comment is counted and a bot's is not (252.930027ms)
|
||||||
|
✔ the hourly reconcile catches a comment through comment_count (222.180551ms)
|
||||||
|
✔ a task closed in the UI leaves the open view with its done bucket (372.418737ms)
|
||||||
|
✔ a task that leaves the board is recorded as deleted, moved or out of reach (256.59276ms)
|
||||||
|
✔ a poll that read before a verb wrote does not overwrite the verb (168.710381ms)
|
||||||
|
✔ a tracker fault during a tick is reported and the next tick catches up (162.570821ms)
|
||||||
|
✔ a malformed answer refuses the tick with tracker-shape (110.548993ms)
|
||||||
|
✔ no token value reaches the database, the log or a refusal (262.694069ms)
|
||||||
|
✔ the first look at a task counts only comments inside the window (167.656451ms)
|
||||||
|
✔ with descendants off the adapter reads no project list and no child, as in v0 (127.877486ms)
|
||||||
|
✔ a three-level tree is read per project, and a project outside it is not (103.112964ms)
|
||||||
|
✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (198.139801ms)
|
||||||
|
✔ a root without the installed buckets refuses with descendants on (107.947563ms)
|
||||||
|
✔ the project list refuses without read_all, and skips archived projects and saved filters (188.613614ms)
|
||||||
|
✔ descendants must be true or false (96.095953ms)
|
||||||
|
✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (155.49092ms)
|
||||||
|
✔ a child made after startup joins the tree at the next reconcile (144.842376ms)
|
||||||
|
✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (165.240335ms)
|
||||||
|
✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (180.419741ms)
|
||||||
|
✔ a reconcile that fails keeps the previous tree (129.199188ms)
|
||||||
|
✔ a closed task the cursor missed takes its own project's done bucket (125.122195ms)
|
||||||
|
✔ closed tasks read at startup take their own project's done bucket (90.309712ms)
|
||||||
|
✔ a closed task the cursor returns takes its own project's done bucket (119.963411ms)
|
||||||
|
✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (118.148168ms)
|
||||||
|
✔ a task in a bucket outside the five keeps its raw bucket id (116.317051ms)
|
||||||
|
✔ bucket 0 on a watch-only task never becomes a bucket or a state (200.992951ms)
|
||||||
|
✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (130.915606ms)
|
||||||
|
✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (119.820865ms)
|
||||||
|
✔ task.create needs a recorded human request and a requirement id (189.952001ms)
|
||||||
|
✔ task.create takes only an approved requirement id (216.402311ms)
|
||||||
|
✔ task.create cites the request a received message carries, not the message's id (169.619466ms)
|
||||||
|
✔ only labels named in the business file can be written (229.247865ms)
|
||||||
|
✔ task.schedule sets and clears a due date and relations (260.417273ms)
|
||||||
|
✔ assign and reassign move the role bots and record task.assigned (300.348024ms)
|
||||||
|
✔ task.update.assigned is for the assignee and records task.state (299.071366ms)
|
||||||
|
✔ a wrong expected digest records task.conflict and writes nothing (169.89321ms)
|
||||||
|
✔ a cross-role verb needs a resolved decision, used once (219.165889ms)
|
||||||
|
✔ task.close needs a verdict; after it every verb refuses with task-done (223.269891ms)
|
||||||
|
✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (252.605569ms)
|
||||||
|
✔ a lost answer is settled by a re-read and never retried (159.739949ms)
|
||||||
|
✔ a create whose answer is lost is reported uncertain, and the poll finds the task (110.98078ms)
|
||||||
|
✔ a task the sync bot cannot read refuses and records nothing (89.993967ms)
|
||||||
|
✔ verbs and polls for one business run one at a time (155.379276ms)
|
||||||
|
✔ a due date with milliseconds is written to the second (151.259331ms)
|
||||||
|
✔ every write landed and the final read failed: the verb succeeds and records what it wrote (106.470259ms)
|
||||||
|
✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (79.960042ms)
|
||||||
|
✔ a create whose final read fails succeeds and records task.created (89.514709ms)
|
||||||
|
✔ an edit between the last write and the final read shows as external on the next poll (113.057946ms)
|
||||||
|
✔ task.created is recorded when a later label write fails (80.096615ms)
|
||||||
|
✔ every verb acts in an installed child, on the child's own board (251.763118ms)
|
||||||
|
✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (162.7464ms)
|
||||||
|
✔ with descendants off, task.create takes only the root project (77.44044ms)
|
||||||
|
✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (111.061527ms)
|
||||||
|
✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (138.744626ms)
|
||||||
|
✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (93.378246ms)
|
||||||
|
✔ a verb and a create in the child record the final read of the child's board (86.427247ms)
|
||||||
|
✔ a create in the child whose final read fails records the child's todo bucket (97.416164ms)
|
||||||
|
✔ a lost answer in the child is settled by a re-read of the child's board (121.123871ms)
|
||||||
|
✔ every related task is read before authority, not only the first (95.843013ms)
|
||||||
|
ℹ tests 97
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 97
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 5020.853991
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (7110.020529ms)
|
||||||
|
✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (7108.811955ms)
|
||||||
|
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (3764.441324ms)
|
||||||
|
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
|
||||||
|
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (5976.082819ms)
|
||||||
|
✔ the README says a refused field table names the file or the key at fault, never a path (1.1232ms)
|
||||||
|
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (7822.316876ms)
|
||||||
|
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (313.304258ms)
|
||||||
|
✔ decisions route serves the roles and recent lists from the reader view (491.517572ms)
|
||||||
|
✔ credentials route serves the broker credential status from the reader view (242.304295ms)
|
||||||
|
✔ replies route serves the replies to one message from the reader view (820.955563ms)
|
||||||
|
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (157.951527ms)
|
||||||
|
✔ bus refusals map to statuses and never carry a path or a stack (124.77814ms)
|
||||||
|
✔ humanCall speaks the human transport protocol without blocking the server (1981.911641ms)
|
||||||
|
✔ busReader takes --business, else the live bus host, else refuses (516.405949ms)
|
||||||
|
✔ humanCall kills a transport that runs past its timeout (527.318275ms)
|
||||||
|
✔ serve refuses a --business value that is not a business id (449.165564ms)
|
||||||
|
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (5248.402447ms)
|
||||||
|
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3273.891833ms)
|
||||||
|
✔ conversation view: a newer session with no readable history keeps the marker (2364.909161ms)
|
||||||
|
✔ conversation view: seats without history say so and offer no reply (3292.855477ms)
|
||||||
|
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (5034.207416ms)
|
||||||
|
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54722.873981ms)
|
||||||
|
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (309.647893ms)
|
||||||
|
✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (10472.019385ms)
|
||||||
|
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (3767.311844ms)
|
||||||
|
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2579.902533ms)
|
||||||
|
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (7103.547226ms)
|
||||||
|
✔ copy writes nothing when an archived path is missing at the commit (1171.150912ms)
|
||||||
|
✔ a copy that loses the rename race leaves no read-only temp directory behind (775.188004ms)
|
||||||
|
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (1376.612304ms)
|
||||||
|
✔ a copy that meets a target holding files says exists: and moves nothing into it (684.587053ms)
|
||||||
|
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (578.112183ms)
|
||||||
|
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (825.43574ms)
|
||||||
|
✔ serve refuses a --checkout that is not an absolute directory path (233.794419ms)
|
||||||
|
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (50.000043ms)
|
||||||
|
✔ preview options are all three or none, and each is checked (11.781432ms)
|
||||||
|
✔ the CLI refuses a partial or invalid preview flag set at start (2374.739031ms)
|
||||||
|
✔ the CLI with all three flags serves the preview mode (259.888502ms)
|
||||||
|
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (24.891883ms)
|
||||||
|
✔ the header name matches without regard to case, and the value compare is exact (5.050395ms)
|
||||||
|
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (38.278194ms)
|
||||||
|
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (15.872345ms)
|
||||||
|
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (8.040004ms)
|
||||||
|
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (25.63645ms)
|
||||||
|
✔ a repeated Host is 400 before any other check, in preview mode and without it (13.005613ms)
|
||||||
|
✔ without the preview flags the public name is refused and writes still reach the board (8.083129ms)
|
||||||
|
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (1.504968ms)
|
||||||
|
✔ credential state from the date alone, as the bus states it (0.16702ms)
|
||||||
|
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1320.020335ms)
|
||||||
|
✔ queue: a refused read fails closed with the store's text, redacted (1511.374048ms)
|
||||||
|
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (3472.365249ms)
|
||||||
|
✔ business: names, vars on the allowlist, authority, credential metadata only (17.056563ms)
|
||||||
|
✔ business: missing or invalid file refuses with the module's text, redacted (30.88067ms)
|
||||||
|
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (9.914278ms)
|
||||||
|
✔ settings: release, board, loopback address, notifier binding name only (1101.071896ms)
|
||||||
|
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (70.191315ms)
|
||||||
|
✔ bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it (33.495431ms)
|
||||||
|
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (5079.14403ms)
|
||||||
|
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (23004.659078ms)
|
||||||
|
✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (7491.145593ms)
|
||||||
|
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13501.555034ms)
|
||||||
|
✔ startServer takes send only as a function and only with the preview mode (9.646301ms)
|
||||||
|
✔ the CLI refuses --send without the preview flags, and without a configured bus (451.701468ms)
|
||||||
|
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (155.833241ms)
|
||||||
|
✔ without --send the route is read-only like every other write, and config says no send (8.831627ms)
|
||||||
|
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (5.852617ms)
|
||||||
|
✔ config says send only on the public name with --send on (1.847424ms)
|
||||||
|
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.534762ms)
|
||||||
|
✔ each request check refuses before anything is sent, and logs the refusal without the body (16.734713ms)
|
||||||
|
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (3.71842ms)
|
||||||
|
✔ a crafted role name cannot forge a log line (2.344858ms)
|
||||||
|
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (6.964962ms)
|
||||||
|
✔ through the human transport the request is exactly the business, message.send and the keys (94.116403ms)
|
||||||
|
✔ against a real broker: the message is written once as a human send, and its refusals map (1503.565407ms)
|
||||||
|
✔ loopback host and board origin fail closed (7.439439ms)
|
||||||
|
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (300.43754ms)
|
||||||
|
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (35.955884ms)
|
||||||
|
✔ unreachable board reports URL; CLI rejects unsupported options (332.623811ms)
|
||||||
|
✔ render prints the unit without the preview flags (8.794885ms)
|
||||||
|
✔ render carries every serve flag, the preview set included (5.735761ms)
|
||||||
|
✔ a partial preview set is refused (13.460139ms)
|
||||||
|
✔ a value the unit cannot carry is refused, for every flag (231.777394ms)
|
||||||
|
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (28.316188ms)
|
||||||
|
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (133.140762ms)
|
||||||
|
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (42.006392ms)
|
||||||
|
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (185.834409ms)
|
||||||
|
✔ status prints the unit state and GET /healthz on the installed port (327.630543ms)
|
||||||
|
✔ usage: an unknown verb or flag, and start or enable, exit 4 (224.602997ms)
|
||||||
|
✔ without --send, render is the template with its placeholders filled, byte for byte (192.46207ms)
|
||||||
|
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (159.047086ms)
|
||||||
|
✔ --send without the whole preview set is refused and writes nothing (265.21341ms)
|
||||||
|
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (542.395198ms)
|
||||||
|
✔ uninstall and status take no --send (150.231725ms)
|
||||||
|
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (466.17361ms)
|
||||||
|
✔ when the state read fails, install and uninstall refuse with one line and change nothing (80.131868ms)
|
||||||
|
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (86.8107ms)
|
||||||
|
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (293.939611ms)
|
||||||
|
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (40.359026ms)
|
||||||
|
✔ the uid header takes only an Authentik uid; the username header still takes a username (310.918573ms)
|
||||||
|
✔ a preview value cannot start with - or . (32.913252ms)
|
||||||
|
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (566.9717ms)
|
||||||
|
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (3355.81786ms)
|
||||||
|
2026-10-16T18:52:18.067Z settings user="jason" changed
|
||||||
|
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (18.457199ms)
|
||||||
|
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (8.091616ms)
|
||||||
|
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (6.830401ms)
|
||||||
|
✔ tokens.css and icons.svg are byte copies of docs/design (1.316614ms)
|
||||||
|
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.626843ms)
|
||||||
|
✔ shipped strings are unchanged, and the web keeps its write boundary (2.985943ms)
|
||||||
|
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (7455.06422ms)
|
||||||
|
✔ five states on Board, Inbox, Tasks, Agents and Trail (3371.199967ms)
|
||||||
|
✔ Queue, Business and Settings in their five states, with no move button (4903.818599ms)
|
||||||
|
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3950.812153ms)
|
||||||
|
✔ the server log names no config path when the system config refuses (316.410919ms)
|
||||||
|
ℹ tests 113
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 113
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 55154.695667
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
OK status with missing harness credential exits 3 and still lists accounts
|
||||||
|
OK status reports harness credential (read-only) + mosaic accounts
|
||||||
|
OK api key material never reaches output
|
||||||
|
OK oauth token material never reaches output
|
||||||
|
OK unparseable credential file exits 2
|
||||||
|
OK symlinked credential file exits 4
|
||||||
|
OK env-side credential names reported
|
||||||
|
OK env var values never reach output
|
||||||
|
OK accounts without an accounts dir reports none and creates nothing
|
||||||
|
OK accounts lists files and marks the active one
|
||||||
|
OK loose account perms flagged in listing
|
||||||
|
OK agent --auth with missing account file refuses (exit 4)
|
||||||
|
OK agent --auth with non-0600 account file refuses
|
||||||
|
OK agent --auth with invalid account name refuses
|
||||||
|
OK auth.sh without valid config refuses
|
||||||
|
|
||||||
|
selftest: 15 passed, 0 failed
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
Note: switching to '7a2987cf51e2c010038783889379ec29fb4332cb'.
|
||||||
|
|
||||||
|
You are in 'detached HEAD' state. You can look around, make experimental
|
||||||
|
changes and commit them, and you can discard any commits you make in this
|
||||||
|
state without impacting any branches by switching back to a branch.
|
||||||
|
|
||||||
|
If you want to create a new branch to retain commits you create, you may
|
||||||
|
do so (now or later) by using -c with the switch command. Example:
|
||||||
|
|
||||||
|
git switch -c <new-branch-name>
|
||||||
|
|
||||||
|
Or undo this operation with:
|
||||||
|
|
||||||
|
git switch -
|
||||||
|
|
||||||
|
Turn off this advice by setting config variable advice.detachedHead to false
|
||||||
|
|
||||||
|
Not currently on any branch.
|
||||||
|
nothing to commit, working tree clean
|
||||||
|
Note: switching to '7a2987cf51e2c010038783889379ec29fb4332cb'.
|
||||||
|
|
||||||
|
You are in 'detached HEAD' state. You can look around, make experimental
|
||||||
|
changes and commit them, and you can discard any commits you make in this
|
||||||
|
state without impacting any branches by switching back to a branch.
|
||||||
|
|
||||||
|
If you want to create a new branch to retain commits you create, you may
|
||||||
|
do so (now or later) by using -c with the switch command. Example:
|
||||||
|
|
||||||
|
git switch -c <new-branch-name>
|
||||||
|
|
||||||
|
Or undo this operation with:
|
||||||
|
|
||||||
|
git switch -
|
||||||
|
|
||||||
|
Turn off this advice by setting config variable advice.detachedHead to false
|
||||||
|
|
||||||
|
OK dry-run: allowed change, exit 0, nothing committed (exit 0)
|
||||||
|
OK dry-run committed nothing
|
||||||
|
OK apply: allowed change exits 0 (exit 0)
|
||||||
|
OK apply: attribution in commit subject
|
||||||
|
OK apply: target tree clean after commit
|
||||||
|
OK disallowed path refused (exit 1)
|
||||||
|
OK disallowed path: target untouched
|
||||||
|
OK syntax gate refused broken .mjs (exit 1)
|
||||||
|
OK syntax gate: target untouched
|
||||||
|
OK suite failure refused (exit 1)
|
||||||
|
OK suite failure: target reverted to clean
|
||||||
|
OK disabled policy refused (exit 2)
|
||||||
|
OK disabled policy: target untouched
|
||||||
|
OK failed run refused (exit 1)
|
||||||
|
OK failed run: target untouched
|
||||||
|
OK missing run exits 4 (exit 4)
|
||||||
|
OK invalid policy exits 2 (exit 2)
|
||||||
|
|
||||||
|
selftest: 17 passed, 0 failed
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
OK absent adapter defaults to pi
|
||||||
|
OK adapter mock validates (exit 0)
|
||||||
|
OK unsupported adapter exits 2 (exit 2)
|
||||||
|
OK env exports adapter
|
||||||
|
OK bootstrap creates default when absent (exit 0)
|
||||||
|
OK bootstrap wrote config file
|
||||||
|
OK bootstrap is idempotent on existing config (exit 0)
|
||||||
|
OK bootstrap did not rewrite existing config
|
||||||
|
OK validate missing config exits 3 (exit 3)
|
||||||
|
OK malformed JSON exits 2 (exit 2)
|
||||||
|
OK unsupported configVersion exits 2 (exit 2)
|
||||||
|
OK unknown top-level key exits 2 (exit 2)
|
||||||
|
OK unknown execution key exits 2 (exit 2)
|
||||||
|
OK unsupported backend exits 2 (exit 2)
|
||||||
|
OK unsupported environment exits 2 (exit 2)
|
||||||
|
OK relative dataRoot exits 2 (exit 2)
|
||||||
|
OK non-canonical dataRoot exits 2 (exit 2)
|
||||||
|
OK filesystem root dataRoot exits 2 (exit 2)
|
||||||
|
OK home directory dataRoot exits 2 (exit 2)
|
||||||
|
OK dataRoot containing config dir exits 2 (exit 2)
|
||||||
|
OK control character in provider exits 2 (exit 2)
|
||||||
|
OK symlinked config file exits 2 (exit 2)
|
||||||
|
OK env exports resolve correctly
|
||||||
|
OK failed validation modified nothing
|
||||||
|
|
||||||
|
selftest: 24 passed, 0 failed
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
toolchain: node v26.8.1
|
||||||
|
|
||||||
|
OK syntax: packages/discord/src/approvals.mjs
|
||||||
|
OK syntax: packages/discord/src/authorize.mjs
|
||||||
|
OK syntax: packages/discord/src/binding.mjs
|
||||||
|
OK syntax: packages/discord/src/cli.mjs
|
||||||
|
OK syntax: packages/discord/src/connector.mjs
|
||||||
|
OK syntax: packages/discord/src/context.mjs
|
||||||
|
OK syntax: packages/discord/src/engine-pi.mjs
|
||||||
|
OK syntax: packages/discord/src/errors.mjs
|
||||||
|
OK syntax: packages/discord/src/gateway.mjs
|
||||||
|
OK syntax: packages/discord/src/git.mjs
|
||||||
|
OK syntax: packages/discord/src/journal.mjs
|
||||||
|
OK syntax: packages/discord/src/notify.mjs
|
||||||
|
OK syntax: packages/discord/src/rest.mjs
|
||||||
|
OK syntax: packages/discord/src/setspark.mjs
|
||||||
|
OK syntax: packages/discord/src/tools.mjs
|
||||||
|
OK syntax: packages/discord/src/web.mjs
|
||||||
|
OK syntax: packages/discord/bin/git-credential.mjs
|
||||||
|
OK syntax: packages/discord/extension/tools.mjs
|
||||||
|
OK syntax: packages/discord/tests/approvals.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/authorize.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/binding.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/connector.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/context.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/copy-service.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/engine.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/fake-pi.mjs
|
||||||
|
OK syntax: packages/discord/tests/gateway.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/git.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/helpers.mjs
|
||||||
|
OK syntax: packages/discord/tests/journal.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/notify.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/offline-check.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/recover.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/rest.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/setspark.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/tools.test.mjs
|
||||||
|
OK syntax: packages/discord/tests/web.test.mjs
|
||||||
|
OK syntax: packages/discord/fixtures/claim-worker.mjs
|
||||||
|
OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs
|
||||||
|
OK syntax: scripts/discord.sh
|
||||||
|
OK syntax: scripts/discord-service.sh
|
||||||
|
OK packages/discord declares no dependencies
|
||||||
|
OK no bot-token-shaped string in packages/discord
|
||||||
|
OK fixture binding uses placeholder ids only
|
||||||
|
OK fixture binding validates
|
||||||
|
OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool
|
||||||
|
OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start
|
||||||
|
OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root
|
||||||
|
OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token
|
||||||
|
OK real pi with protocol vault adds reserve_id to the git verbs
|
||||||
|
OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key
|
||||||
|
OK real pi refuses a git key on a read-only root (fail closed)
|
||||||
|
OK real pi with the pilot flags (--no-tools) exposes no tool at all
|
||||||
|
OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed)
|
||||||
|
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||||
|
OK node --test packages/discord/tests/ (ℹ pass 183)
|
||||||
|
OK scripts/discord.sh --help exits 0
|
||||||
|
OK scripts/discord.sh check without a binding exits 4
|
||||||
|
OK scripts/discord.sh recover without a binding exits 4
|
||||||
|
OK scripts/discord.sh reload without a binding exits 4
|
||||||
|
OK scripts/discord-service.sh without a command exits 4
|
||||||
|
OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP
|
||||||
|
OK service install writes the rendered unit (0644) and leaves no temp file
|
||||||
|
OK service install a second time reports unchanged
|
||||||
|
OK systemd-analyze verify accepts the rendered unit
|
||||||
|
OK service uninstall removes the unit file
|
||||||
|
OK service install with an unknown flag exits 4
|
||||||
|
OK service install with USER unset finishes and names the account for lingering
|
||||||
|
OK pinned render runs copy CLI with copy cwd/repo and no checkout executable
|
||||||
|
OK pinned install writes the rendered unit in a temporary unit directory
|
||||||
|
OK pinned install refuses short prerequisite and writes no unit
|
||||||
|
OK pinned install refuses missing prerequisite and writes no unit
|
||||||
|
OK pinned install refuses cli prerequisite and writes no unit
|
||||||
|
OK pinned install refuses pi prerequisite and writes no unit
|
||||||
|
OK status names the copy from fake systemctl effective cwd
|
||||||
|
OK checkout install explicitly recommends --copy
|
||||||
|
OK wrapper check --offline passes local fixture and makes no network call
|
||||||
|
OK wrapper run --offline refuses usage
|
||||||
|
|
||||||
|
discord suite: 78 passed, 0 failed
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
OK initial ordinary-file install
|
||||||
|
OK installed tree matches canonical source
|
||||||
|
OK installed tree has no symlinks
|
||||||
|
OK check detects installation drift
|
||||||
|
OK sync refuses to overwrite installation drift
|
||||||
|
OK check detects an extra destination file
|
||||||
|
OK check detects an extra destination directory
|
||||||
|
OK check rejects a destination symlink
|
||||||
|
OK sync accepts a canonical source update
|
||||||
|
OK updated installation matches canonical source
|
||||||
|
scripts/test-extension-package.sh: line 14: 548051 Killed "$@" > /dev/null 2>&1
|
||||||
|
OK forced interruption kills the replacing process
|
||||||
|
OK next invocation recovers old consistent installation
|
||||||
|
OK interrupted replacement rolled back
|
||||||
|
OK sync succeeds after interruption recovery
|
||||||
|
OK unlocked stale lock file does not block
|
||||||
|
OK active lock refuses a concurrent sync
|
||||||
|
OK source symlink fails closed
|
||||||
|
OK nested second entrypoint fails closed
|
||||||
|
|
||||||
|
extension package selftest: 18 passed, 0 failed
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0
|
||||||
|
|
||||||
|
OK syntax: scripts/foundation-inspect.mjs
|
||||||
|
OK syntax: scripts/foundation/strict-json.mjs
|
||||||
|
OK syntax: scripts/foundation/canonical.mjs
|
||||||
|
OK syntax: scripts/foundation/resolve.mjs
|
||||||
|
OK syntax: scripts/foundation/validate-record.mjs
|
||||||
|
OK syntax: scripts/foundation/fixtures/build-fixtures.mjs
|
||||||
|
OK syntax: scripts/foundation/canonical.test.mjs
|
||||||
|
OK syntax: scripts/foundation/cli.test.mjs
|
||||||
|
OK syntax: scripts/foundation/fixtures.test.mjs
|
||||||
|
OK syntax: scripts/foundation/resolve.test.mjs
|
||||||
|
OK syntax: scripts/foundation/strict-json.test.mjs
|
||||||
|
OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written)
|
||||||
|
OK fixture generator runs
|
||||||
|
OK checked-in fixtures/bundles equal a fresh generation
|
||||||
|
OK checked-in fixtures/raw equal a fresh generation
|
||||||
|
OK checked-in fixtures/index.json equal a fresh generation
|
||||||
|
OK checked-in demo bundles equal a fresh generation
|
||||||
|
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||||
|
OK node --test scripts/foundation/ (ℹ pass 80)
|
||||||
|
OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof)
|
||||||
|
platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999)
|
||||||
|
node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases)
|
||||||
|
schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10
|
||||||
|
profile column (schema-valid records only): profile-valid 510, profile-invalid 30
|
||||||
|
profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns
|
||||||
|
OK oracle: zero schema-column disagreements with the pinned checker
|
||||||
|
OK oracle: strict-only profile refusals are counted and asserted
|
||||||
|
OK demo: permitted read preview exits 0 (exit 0)
|
||||||
|
OK demo: permitted file.change preview exits 0 (exit 0)
|
||||||
|
OK demo: assignment.change proposal is unresolved (exit 3) (exit 3)
|
||||||
|
OK demo: revoked registration is refused (exit 3) (exit 3)
|
||||||
|
OK demo: message is not authority (exit 3) (exit 3)
|
||||||
|
OK usage: no arguments exits 2 (exit 2)
|
||||||
|
OK io: missing file exits 4 (exit 4)
|
||||||
|
OK io: directory exits 4 (exit 4)
|
||||||
|
OK io: symlink exits 4 (O_NOFOLLOW) (exit 4)
|
||||||
|
OK bound: oversize fixture exits 2 (exit 2)
|
||||||
|
OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2)
|
||||||
|
OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2)
|
||||||
|
OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0)
|
||||||
|
OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed
|
||||||
|
OK text output starts with the disclaimer
|
||||||
|
OK json output is valid JSON with result allowed and exactly the charter §7 fields
|
||||||
|
OK json golden matches byte-for-byte
|
||||||
|
OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal
|
||||||
|
OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs
|
||||||
|
OK canary never printed (bundle run and credential-file run)
|
||||||
|
OK a non-bundle JSON file is refused at the shape gate, not read into output
|
||||||
|
OK no field of the non-bundle file is echoed
|
||||||
|
|
||||||
|
selftest: 44 passed, 0 failed
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
OK args: exit 2, target-branch
|
||||||
|
OK args: exit 2, target-branch
|
||||||
|
OK args: exit 4
|
||||||
|
OK args: exit 4
|
||||||
|
OK args: exit 4
|
||||||
|
OK --base next refuses before the config is read (got 2)
|
||||||
|
OK a missing system config exits 3 (got 3)
|
||||||
|
OK nobus: exit 3
|
||||||
|
OK schema-table: exit 2, bus-schema
|
||||||
|
OK schema-meta: exit 2, bus-schema
|
||||||
|
OK openBus opens the database read-only
|
||||||
|
OK other-business: exit 2, decision-not-found
|
||||||
|
OK no-raise: exit 2, decision-not-found
|
||||||
|
OK not-a-merge: exit 2, not-a-merge
|
||||||
|
OK open: exit 2, not-resolved
|
||||||
|
OK withdrawn: exit 2, not-resolved
|
||||||
|
OK by-agent: exit 2, not-human
|
||||||
|
OK via-webui: exit 2, not-human
|
||||||
|
OK no-answer: exit 2, not-human
|
||||||
|
OK answer-role: exit 2, not-human
|
||||||
|
OK answer-run: exit 2, not-human
|
||||||
|
OK answer-choice: exit 2, not-human
|
||||||
|
OK two-answers: exit 2, not-human
|
||||||
|
OK chose-no: exit 2, not-merge-option
|
||||||
|
OK two-refs: exit 2, work-ref
|
||||||
|
OK bad-ref: exit 2, work-ref
|
||||||
|
OK task-ref-disagrees: exit 2, work-ref
|
||||||
|
OK raise-task-disagrees: exit 2, work-ref
|
||||||
|
OK target-main: exit 2, target-branch
|
||||||
|
OK superseded-question: exit 2, superseded
|
||||||
|
OK superseded-task: exit 2, superseded
|
||||||
|
OK superseded-by: exit 2, superseded
|
||||||
|
OK no-verdict: exit 2, no-verdict
|
||||||
|
OK changes-later: exit 2, not-approved
|
||||||
|
OK short-commit: exit 2, not-approved
|
||||||
|
OK wrong-task-body: exit 2, not-approved
|
||||||
|
OK args: exit 2, decision-not-found
|
||||||
|
OK earlier-merge: exit 0
|
||||||
|
OK ref-moved: exit 2, ref-moved
|
||||||
|
OK root-top: exit 2, root-file
|
||||||
|
OK root-newdir: exit 2, root-file
|
||||||
|
OK root-src: exit 2, root-file
|
||||||
|
OK unrelated: exit 2, base-conflict
|
||||||
|
OK empty: exit 2, base-conflict
|
||||||
|
OK an empty reviewed diff says so
|
||||||
|
OK dirty-changed: exit 2, checkout-dirty
|
||||||
|
OK dirty-staged: exit 2, checkout-dirty
|
||||||
|
OK dirty-untracked: exit 2, checkout-dirty
|
||||||
|
OK conflict: exit 2, base-conflict
|
||||||
|
OK a refusal after the worktree is added leaves no worktree or scratch
|
||||||
|
OK cleanup looks for the worktree's Docker network
|
||||||
|
OK dirty-during: exit 2, checkout-dirty
|
||||||
|
OK a reviewed path dirtied during the gate moves no ref
|
||||||
|
OK drift: exit 2, patch-drift
|
||||||
|
OK patch-drift leaves no worktree or scratch
|
||||||
|
OK gate-pkg: exit 2, gate-failed
|
||||||
|
OK gate-failed names the failing step's log, and it exists
|
||||||
|
OK gate-failed leaves no worktree or scratch
|
||||||
|
OK gate-script: exit 2, gate-failed
|
||||||
|
OK a failing scripts/test-*.sh fails the gate
|
||||||
|
OK a failed gate moves no ref
|
||||||
|
OK nomods: exit 4
|
||||||
|
OK a target without node_modules leaves no worktree or scratch
|
||||||
|
OK moved: exit 2, base-moved
|
||||||
|
OK base-moved keeps the base where it moved to
|
||||||
|
OK dry: exit 0
|
||||||
|
OK --dry-run writes no ref
|
||||||
|
OK --dry-run prints the commit with --subject and --attribution
|
||||||
|
OK --dry-run runs the gate
|
||||||
|
OK --dry-run leaves no worktree or scratch
|
||||||
|
OK land: exit 0
|
||||||
|
OK the landing is one commit on the old base
|
||||||
|
OK its diff is the reviewed diff by patch-id
|
||||||
|
OK its tree is the dry run's
|
||||||
|
OK the message has the option's subject, the citations and the attribution last
|
||||||
|
OK it prints the line for the PM
|
||||||
|
OK the checked-out base has the reviewed paths and keeps the unrelated edit
|
||||||
|
OK only refs/heads/refactor exists in the target
|
||||||
|
OK the work ref is unchanged
|
||||||
|
OK the bus database is unchanged
|
||||||
|
OK the gate ran each package suite but queue, and each scripts/test-*.sh
|
||||||
|
OK the landing leaves no worktree or scratch
|
||||||
|
OK the target's node_modules is still there, with its contents
|
||||||
|
OK the worktree's Docker network is removed
|
||||||
|
---
|
||||||
|
land-work selftests: 84 passed, 0 failed
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
toolchain: node v26.8.1, git version 2.55.0
|
||||||
|
|
||||||
|
OK syntax: packages/queue/src/cli.mjs
|
||||||
|
OK syntax: packages/queue/src/errors.mjs
|
||||||
|
OK syntax: packages/queue/src/io.mjs
|
||||||
|
OK syntax: packages/queue/src/lock.mjs
|
||||||
|
OK syntax: packages/queue/src/queue.mjs
|
||||||
|
OK syntax: packages/queue/src/review.mjs
|
||||||
|
OK syntax: packages/queue/src/store.mjs
|
||||||
|
OK syntax: packages/queue/tests/commit.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/data.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/dispatch.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/gate-owner.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/helpers.mjs
|
||||||
|
OK syntax: packages/queue/tests/lock.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/migration.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/review.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/store.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/write.test.mjs
|
||||||
|
OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs
|
||||||
|
OK syntax: packages/queue/tests/fixtures/kill-at.mjs
|
||||||
|
OK syntax: packages/queue/tests/fixtures/lock-child.mjs
|
||||||
|
OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh
|
||||||
|
OK syntax: scripts/queue-commit.sh
|
||||||
|
OK syntax: scripts/git-hooks/pre-commit
|
||||||
|
OK syntax: scripts/mosaic
|
||||||
|
OK queue-commit.sh, the guard and scripts/mosaic are executable
|
||||||
|
OK packages/queue declares no dependencies
|
||||||
|
ℹ tests 156
|
||||||
|
ℹ pass 156
|
||||||
|
ℹ fail 0
|
||||||
|
OK node --test packages/queue/tests/
|
||||||
|
OK scripts/mosaic queue help
|
||||||
|
skip queue verify and render --check: this checkout (/home/jwoltje/darkwing-scratch/r137/wt) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
|
||||||
|
|
||||||
|
queue suite: 28 passed, 0 failed
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
OK valid RELEASE resolves (exit 0)
|
||||||
|
OK invalid RELEASE exits 1 (exit 1)
|
||||||
|
OK missing RELEASE exits 1 (exit 1)
|
||||||
|
OK valid RELEASE leaves image tag consistent with version
|
||||||
|
OK status safe on empty state (exit 0)
|
||||||
|
OK status created no pointer
|
||||||
|
OK fault-injected activation refuses (exit 1)
|
||||||
|
OK refused activation wrote no pointer
|
||||||
|
OK refusal logged exactly once with valid fields
|
||||||
|
OK healthy activation succeeds (exit 0)
|
||||||
|
OK pointer written with valid fields
|
||||||
|
OK repeat activation succeeds (log grows) (exit 0)
|
||||||
|
OK log is append-only across activations
|
||||||
|
OK rollback without previous refuses (exit 1)
|
||||||
|
|
||||||
|
selftest: 14 passed, 0 failed
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
OK valid task validates (exit 0)
|
||||||
|
OK unknown task key exits 2 (exit 2)
|
||||||
|
OK unsupported taskVersion exits 2 (exit 2)
|
||||||
|
OK invalid task id exits 2 (exit 2)
|
||||||
|
OK empty prompt exits 2 (exit 2)
|
||||||
|
OK NUL in expectExact exits 2 (exit 2)
|
||||||
|
OK out-of-range timeout exits 2 (exit 2)
|
||||||
|
OK missing mission file exits 4 (exit 4)
|
||||||
|
OK task with valid mission validates (exit 0)
|
||||||
|
OK invalid mission exits 2 (exit 2)
|
||||||
|
OK validate missing task exits 4 (exit 4)
|
||||||
|
OK validation does not modify the task file
|
||||||
|
OK prune dry-run exits 0 (exit 0)
|
||||||
|
OK dry-run deleted nothing
|
||||||
|
OK prune --keep=2 --yes removes oldest (exit 0)
|
||||||
|
OK kept exactly 2 newest runs
|
||||||
|
OK newest run kept, oldest pruned
|
||||||
|
OK append-only receipt written (3 entries)
|
||||||
|
OK sessions/workspaces untouched by prune
|
||||||
|
OK prune with invalid keep exits 4 (exit 4)
|
||||||
|
OK mock adapter: gate passes on matching mock response (exit 0)
|
||||||
|
OK mock adapter: expect-mismatch recorded (exit 1)
|
||||||
|
OK mismatch reason recorded
|
||||||
|
OK unknown adapter fails closed (exit 1)
|
||||||
|
OK mission task runs via mock adapter (exit 0)
|
||||||
|
OK mission section injected into generated prompt
|
||||||
|
OK retry of mission run succeeds (exit 0)
|
||||||
|
OK retriedFrom lineage recorded
|
||||||
|
OK mission section present after retry (relative path resolved)
|
||||||
|
OK retry of missing run exits 4 (exit 4)
|
||||||
|
OK skill install bundled ms-tools (exit 0)
|
||||||
|
OK installed to skills-available
|
||||||
|
OK double install refuses (exit 1)
|
||||||
|
OK activate enables skill (exit 0)
|
||||||
|
OK enabled dir populated
|
||||||
|
OK uninstall while enabled refuses (exit 1)
|
||||||
|
OK deactivate moves back to available (exit 0)
|
||||||
|
OK uninstall removes from available (exit 0)
|
||||||
|
OK seat with enabled skill launches
|
||||||
|
OK skill path delivered to adapter
|
||||||
|
OK shipped researcher contract resolves (ceiling + network)
|
||||||
|
OK resolve-role refuses a non-role document (conductor policy) (exit 2)
|
||||||
|
OK resolve-role refuses name/filename mismatch (exit 2)
|
||||||
|
OK resolve-role refuses unknown network declaration (exit 2)
|
||||||
|
OK resolve-role refuses duplicate role tool (exit 2)
|
||||||
|
OK resolve-role refuses unsupported tool (exit 2)
|
||||||
|
OK resolve-role refuses missing contract file (exit 4)
|
||||||
|
OK version 1 role prints no contract line
|
||||||
|
OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer)
|
||||||
|
OK resolve-role accepts a minimal version 2 role (exit 0)
|
||||||
|
OK resolve-role refuses an action outside the vocabulary (exit 2)
|
||||||
|
OK resolve-role refuses a gated-only action in a role file (exit 2)
|
||||||
|
OK resolve-role refuses a Vikunja verb no role may hold (exit 2)
|
||||||
|
OK resolve-role refuses a version 2 role whose contract is missing (exit 2)
|
||||||
|
OK resolve-role refuses a contract that is a symbolic link (exit 2)
|
||||||
|
OK seat launches under role ceiling
|
||||||
|
OK role ceiling narrows seat tools (read,write,bash -> read,bash)
|
||||||
|
OK narrowing recorded loudly
|
||||||
|
OK missing role contract refuses launch (exit 2)
|
||||||
|
OK missing-contract refusal names the role
|
||||||
|
OK empty ceiling intersection -> tool-free seat
|
||||||
|
OK tool-free outcome recorded loudly
|
||||||
|
OK overridden agents dir without seat definition refuses (exit 4)
|
||||||
|
OK seat-resolution refusal names the seat
|
||||||
|
OK policy: mission only -> mission tools
|
||||||
|
OK policy: task only -> task tools
|
||||||
|
OK policy: both -> intersection (task narrowed)
|
||||||
|
OK policy: empty intersection -> tool-free
|
||||||
|
OK invalid mission capabilities rejected (exit 2)
|
||||||
|
mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls)
|
||||||
|
OK task run with user layer present (exit 0)
|
||||||
|
OK user context dispatched into generated prompt
|
||||||
|
OK workspace+tools task runs via mock (exit 0)
|
||||||
|
OK workspace path + tools delivered to adapter
|
||||||
|
OK persistent workspace created on host
|
||||||
|
OK plain task still runs (no workspace/tools) (exit 0)
|
||||||
|
OK workspace var present but empty when absent
|
||||||
|
OK tools empty when absent
|
||||||
|
OK unknown tool exits 2 (exit 2)
|
||||||
|
OK workspace traversal exits 2 (exit 2)
|
||||||
|
OK live hello task succeeds with exact marker
|
||||||
|
OK result.json written in run dir
|
||||||
|
OK result.json contents are correct
|
||||||
|
OK wrong expectExact fails with exit 1 (reason: expect-mismatch)
|
||||||
|
OK each run gets a distinct run dir (no clobber)
|
||||||
|
OK list shows both runs
|
||||||
|
OK fork base: teach succeeds (exit 0)
|
||||||
|
OK fork child recalls ancestor context (exit 0)
|
||||||
|
OK forked child recalled ancestor code word
|
||||||
|
OK ancestor session untouched by fork
|
||||||
|
OK child session dir has its own branch file
|
||||||
|
OK onboard without name exits 4 (non-interactive) (exit 4)
|
||||||
|
OK onboard --name renders profile (exit 0)
|
||||||
|
OK profile written
|
||||||
|
OK canon structure: required filled, optional placeholdered
|
||||||
|
OK canon sections present
|
||||||
|
OK user recall run succeeds
|
||||||
|
OK recalled user name (response: Jason)
|
||||||
|
OK no agent identity on headless run
|
||||||
|
|
||||||
|
selftest: 98 passed, 0 failed
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,31 @@
|
|||||||
|
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
|
||||||
|
128aae5d0d6c3d2b11c474508d75b412d24b2b3fff3079822b4fe6de96b53dce packages/bus/README.md
|
||||||
|
380f01f7d97485ff62acec37692b4b4354615fe1be486d18fbf85c82277819ec packages/bus/src/broker.mjs
|
||||||
|
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
|
||||||
|
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
|
||||||
|
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
|
||||||
|
62b641b44b2939c6eec86856b47de967d501e36d6cf437b993c844d8007353c1 packages/cli/README.md
|
||||||
|
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
|
||||||
|
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
|
||||||
|
03a4903b14ea72781a337e1782cba41918f35849b25e223110ed4d283864cee4 packages/cli/tests/git-socket.test.mjs
|
||||||
|
97c613a0e59d39fa715d32144741bd996a6392862353f0bf204029d707789d50 packages/cli/tests/launcher.test.mjs
|
||||||
|
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
|
||||||
|
a47aecd10338ffa77df4f1993b90ab60dd91cf33651eb5e7ac23f53f73d73d98 packages/harness/README.md
|
||||||
|
b97b5df64d6ea56183b2d672bbe95321ecfab5171f11e1ba643b6778b70b9fb6 packages/harness/src/bundle.mjs
|
||||||
|
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
|
||||||
|
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
|
||||||
|
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
|
||||||
|
81966394d5d875e3e62d231df4e5442849ff7dde40bebe6f52d8d9a7b3b6d99f packages/harness/tests/bundle.test.mjs
|
||||||
|
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
|
||||||
|
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
|
||||||
|
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
|
||||||
|
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
|
||||||
|
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
|
||||||
|
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
|
||||||
|
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
|
||||||
|
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
|
||||||
|
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
|
||||||
|
c09885c94d45a48345c132e7e7bf2233ca6787ca23771a35393e6dc635d784d6 packages/bus/src/landing.mjs
|
||||||
|
7ed287a6035cb2ca9d9df09054403df868820a32cdc714ff6b15aa36f8474e1b packages/bus/tests/land.test.mjs
|
||||||
|
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
|
||||||
|
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
base 7a2987cf5 working.mjs 0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 start 19:18:01
|
||||||
|
seat-working rc=0 19:18:01-19:18:07 ℹ pass 26 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-git-socket rc=0 19:18:07-19:18:16 ℹ pass 23 ℹ fail 0 ℹ skipped 0
|
||||||
|
kill-b1-patch-drift edit: line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
|
||||||
|
kill-b1-patch-drift rc=1 19:18:16-19:18:22 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b1-patch-drift KILLED: only "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed
|
||||||
|
kill-b2-against-root edit: line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
|
||||||
|
kill-b2-against-root rc=1 19:18:22-19:18:29 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b2-against-root KILLED: only "once the root shares no history with a landed main, a push is checked against main, not the root" failed
|
||||||
|
seat rc=0 19:18:29-19:18:36 ℹ pass 150 ℹ fail 0 ℹ skipped 0
|
||||||
|
ROUND_PASSED 19:18:36
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (468.742786ms)
|
||||||
|
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (450.1039ms)
|
||||||
|
✔ the size cap refuses a push before any byte (236.893063ms)
|
||||||
|
✔ a fetch over the cap refuses before any byte reaches the reviewer (426.830271ms)
|
||||||
|
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (261.339696ms)
|
||||||
|
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (393.742348ms)
|
||||||
|
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (298.919766ms)
|
||||||
|
✔ a review of a project the business no longer has refuses unknown-project (296.588919ms)
|
||||||
|
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (255.283971ms)
|
||||||
|
✔ close() answers host-closing to a connection still sending its request line (223.840206ms)
|
||||||
|
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (633.118467ms)
|
||||||
|
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (517.021489ms)
|
||||||
|
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (591.701562ms)
|
||||||
|
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.219983ms)
|
||||||
|
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (534.466153ms)
|
||||||
|
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.021266ms)
|
||||||
|
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.034736ms)
|
||||||
|
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (439.791977ms)
|
||||||
|
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (354.235216ms)
|
||||||
|
✔ land: refusals before the gate answer the role at once and leave main and no worktree (341.591759ms)
|
||||||
|
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (340.561024ms)
|
||||||
|
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (369.785283ms)
|
||||||
|
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (348.641601ms)
|
||||||
|
ℹ tests 23
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 23
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 8216.532812
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.112589ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (132.017935ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (131.951028ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (67.709236ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (48.603794ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (153.530007ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (95.044552ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (91.223103ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (59.921163ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (111.899426ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (157.20872ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (516.007777ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (42.041594ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2225.771609ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1030.601983ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (33.629964ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (136.492586ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (15.783781ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.231816ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (257.142736ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (165.765133ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (260.159955ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (134.259314ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (412.315834ms)
|
||||||
|
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (118.973334ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (229.397188ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 25
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6685.327014
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/working.test.mjs:531:1
|
||||||
|
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (118.973334ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected rejection.
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/tests/working.test.mjs:544:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
operator: 'rejects',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.253114ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (143.549227ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (131.145298ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (71.275578ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (51.942901ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (162.626279ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (93.281737ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (91.170531ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (58.52534ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (105.938776ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (158.522492ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (403.553288ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (31.200166ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2191.630084ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1032.134534ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (25.835822ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (141.45438ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (16.9642ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.422314ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (261.590906ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (152.749522ms)
|
||||||
|
✖ once the root shares no history with a landed main, a push is checked against main, not the root (154.76656ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (134.909937ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (459.66953ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (156.389473ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (253.016454ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 25
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6548.457998
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/working.test.mjs:454:1
|
||||||
|
✖ once the root shares no history with a landed main, a push is checked against main, not the root (154.76656ms)
|
||||||
|
Error: the commit shares no history with main
|
||||||
|
at refuse (file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/src/working.mjs:88:9)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt/packages/seat/src/working.mjs:224:76
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
|
||||||
|
code: 'unrelated-history'
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.088957ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (136.581789ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (113.932866ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (60.62182ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (42.020726ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (127.31239ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (88.374072ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (76.727718ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (50.177052ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (92.643992ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (133.431949ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (395.151927ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (36.656656ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2176.337933ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.409164ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (30.512055ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.265654ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (13.463647ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.170915ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (215.950482ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (148.305906ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (213.001025ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.077733ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (369.212541ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (144.682253ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (238.397869ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 26
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6226.559372
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
✔ a first launch clones the root at its branch, with the root's path as origin (46.402335ms)
|
||||||
|
✔ the clone is not at its place until git clone has finished (30.378869ms)
|
||||||
|
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (79.778759ms)
|
||||||
|
✔ a clone ahead of the root keeps its commits and counts as current (50.404522ms)
|
||||||
|
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||||
|
✔ a modified file (57.910668ms)
|
||||||
|
✔ an untracked file (59.09627ms)
|
||||||
|
✔ a staged file (59.010129ms)
|
||||||
|
✔ another branch (58.797002ms)
|
||||||
|
✔ a detached HEAD (57.695687ms)
|
||||||
|
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (294.01783ms)
|
||||||
|
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (93.14183ms)
|
||||||
|
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||||
|
✔ not-a-clone (60.667167ms)
|
||||||
|
✔ hooks-present (37.843541ms)
|
||||||
|
✔ submodule (38.415573ms)
|
||||||
|
✔ config-changed (82.129898ms)
|
||||||
|
✔ root-unreadable (44.486316ms)
|
||||||
|
✔ root-detached (49.335971ms)
|
||||||
|
✔ status-failed, on the root's branch and clean (50.230333ms)
|
||||||
|
✔ status-failed, dirty (44.808268ms)
|
||||||
|
✔ a clone kept before the branch check, or for a failed status, gets no fetch (409.559046ms)
|
||||||
|
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (49.748997ms)
|
||||||
|
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (56.866448ms)
|
||||||
|
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (98.637908ms)
|
||||||
|
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||||
|
✔ user.name (34.862652ms)
|
||||||
|
✔ user.email (35.274434ms)
|
||||||
|
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (70.748119ms)
|
||||||
|
✔ a commit git can't read after the fast-forward is null (59.167263ms)
|
||||||
|
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (23.690256ms)
|
||||||
|
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||||
|
✔ core.fsmonitor (45.97217ms)
|
||||||
|
✔ core.hooksPath (46.515621ms)
|
||||||
|
✔ a hook file (39.841338ms)
|
||||||
|
✔ include.path (39.688277ms)
|
||||||
|
✔ includeIf (41.060017ms)
|
||||||
|
✔ a filter driver (43.863858ms)
|
||||||
|
✔ origin moved (40.279486ms)
|
||||||
|
✔ a second origin url (46.014574ms)
|
||||||
|
✔ the origin url twice, both the root (44.852984ms)
|
||||||
|
✔ an ext:: origin (43.746661ms)
|
||||||
|
✔ a branch tracking another remote (40.782323ms)
|
||||||
|
✔ a branch merging a tag (41.313221ms)
|
||||||
|
✔ a fetch line onto local branches (39.734197ms)
|
||||||
|
✔ no origin (47.13466ms)
|
||||||
|
✔ a config file over the size cap (44.94032ms)
|
||||||
|
✔ config a symlink to /dev/zero (40.11926ms)
|
||||||
|
✔ the clone a symlink to the bait (35.988231ms)
|
||||||
|
✔ the clone a file (37.305001ms)
|
||||||
|
✔ the clone a plain directory (38.024591ms)
|
||||||
|
✔ .git a gitdir: file (40.458365ms)
|
||||||
|
✔ .git a symlink (39.570204ms)
|
||||||
|
✔ .git/logs a symlink (35.692048ms)
|
||||||
|
✔ .git/refs/heads a symlink (33.256906ms)
|
||||||
|
✔ .git/objects a symlink (34.281105ms)
|
||||||
|
✔ a reflog hard-linked to a file outside (34.49633ms)
|
||||||
|
✔ HEAD a fifo (31.388304ms)
|
||||||
|
✔ a commondir file (32.843239ms)
|
||||||
|
✔ an alternates file (36.465546ms)
|
||||||
|
✔ a gitlink staged, no .gitmodules (56.037117ms)
|
||||||
|
✔ a gitlink and .gitmodules staged (54.361984ms)
|
||||||
|
✔ a gitlink to a repository with its own gitlink (61.271925ms)
|
||||||
|
✔ a gitlink and .gitmodules committed (56.694202ms)
|
||||||
|
✔ a gitlink and submodule.active in config (50.804746ms)
|
||||||
|
✔ a .git/modules with no gitlink (40.017018ms)
|
||||||
|
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1439.951004ms)
|
||||||
|
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||||
|
✔ missing (14.746425ms)
|
||||||
|
✔ not a repository (12.240775ms)
|
||||||
|
✔ a plain directory inside another repository (18.803976ms)
|
||||||
|
✔ unreadable (12.060169ms)
|
||||||
|
✔ on no branch (14.246498ms)
|
||||||
|
✔ missing an object (18.355719ms)
|
||||||
|
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (91.468955ms)
|
||||||
|
✔ a clone whose root is on no branch, or gone, is kept and named (40.067794ms)
|
||||||
|
✔ no credential or forge remote of the root reaches a clone (57.255958ms)
|
||||||
|
✔ every project in the business file gets its own clone at its own branch (40.233547ms)
|
||||||
|
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.548254ms)
|
||||||
|
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1018.575299ms)
|
||||||
|
✔ a timeout signals git's process group, so a process git started dies with it (516.707264ms)
|
||||||
|
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (514.031957ms)
|
||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (2.170958ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.213873ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (35.647758ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (2.705074ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (179.273278ms)
|
||||||
|
✔ runGate: the first failing step stops the gate and names its log (278.122256ms)
|
||||||
|
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (186.038628ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (658.02138ms)
|
||||||
|
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.604687ms)
|
||||||
|
✔ sandboxProblem names a missing bwrap and a bwrap that fails (11.623192ms)
|
||||||
|
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.6431ms)
|
||||||
|
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.126229ms)
|
||||||
|
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.850786ms)
|
||||||
|
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.464721ms)
|
||||||
|
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1976.834349ms)
|
||||||
|
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2860.245503ms)
|
||||||
|
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (271.852007ms)
|
||||||
|
✔ resolveSeat: by name under --repo resolves the repo layout (1.647412ms)
|
||||||
|
✔ resolveSeat: by path resolves the fleet layout (0.411608ms)
|
||||||
|
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.835922ms)
|
||||||
|
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.748716ms)
|
||||||
|
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.950241ms)
|
||||||
|
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.659253ms)
|
||||||
|
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.436842ms)
|
||||||
|
✔ CLI launch: registers, execs the fake launch script, and passes args through (37.869189ms)
|
||||||
|
✔ CLI launch: --harness lands in the record (35.114285ms)
|
||||||
|
✔ CLI launch: the launch script's own exit code passes through (32.754743ms)
|
||||||
|
✔ CLI launch: relaunching a seat rewrites the one registration record (79.66047ms)
|
||||||
|
✔ CLI launch: omitting --task records an empty string, not null (37.37462ms)
|
||||||
|
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (104.242365ms)
|
||||||
|
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (159.438731ms)
|
||||||
|
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.475664ms)
|
||||||
|
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.663758ms)
|
||||||
|
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.831332ms)
|
||||||
|
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.377097ms)
|
||||||
|
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (314.780322ms)
|
||||||
|
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.954208ms)
|
||||||
|
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (1.042278ms)
|
||||||
|
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.446557ms)
|
||||||
|
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (2.203209ms)
|
||||||
|
✔ session file and launch log: 0600, the session file written once (1.26953ms)
|
||||||
|
✔ endReason maps the runner's exit codes; a signal is killed (0.141418ms)
|
||||||
|
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.487903ms)
|
||||||
|
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (2.974463ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (2.513191ms)
|
||||||
|
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (2.97558ms)
|
||||||
|
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (347.954438ms)
|
||||||
|
✔ workRef and validBranch take only what a ref name can hold (2.221213ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (191.879327ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (161.731648ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (97.090305ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (53.080059ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (251.034199ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (169.986321ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (114.42524ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (64.344337ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (131.903949ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (186.369556ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (445.77811ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (36.514022ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2204.096095ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1035.037248ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (24.020269ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.312266ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (13.542644ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.265113ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (222.404829ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (148.179974ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (215.931602ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (119.736558ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (400.994292ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (160.480046ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (280.827859ms)
|
||||||
|
ℹ tests 150
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 150
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6932.378723
|
||||||
Executable
+62
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Row 137 round 2 (Filbert's comment 28782): seat working.test and cli git-socket.test
|
||||||
|
# on the candidate, each singly, then one kill per new test. A kill edits working.mjs
|
||||||
|
# in place, runs working.test, which must fail on exactly the new test, and restores
|
||||||
|
# the file; the script checks the restored file's sha256 against the one it started with.
|
||||||
|
# Last, the whole seat suite. Not the full gate. Usage: r2-round.sh <worktree> <logdir>
|
||||||
|
set -uo pipefail
|
||||||
|
WT=$(cd "$1" && pwd -P); LOGS=$(mkdir -p "$2" && cd "$2" && pwd -P)
|
||||||
|
export TMPDIR="$HOME/darkwing-scratch/r137/tmp"; mkdir -p "$TMPDIR"
|
||||||
|
SRC="$WT/packages/seat/src/working.mjs"
|
||||||
|
SUM=$(sha256sum "$SRC" | cut -d' ' -f1)
|
||||||
|
restore() {
|
||||||
|
if [ -f "$SRC.orig" ]; then mv -f "$SRC.orig" "$SRC"; fi
|
||||||
|
[ "$(sha256sum "$SRC" | cut -d' ' -f1)" = "$SUM" ] || { echo "RESTORE_MISMATCH $SRC"; return 1; }
|
||||||
|
}
|
||||||
|
trap restore EXIT
|
||||||
|
echo "base $(git -C "$WT" rev-parse --short HEAD) working.mjs $SUM start $(date -u +%H:%M:%S)"
|
||||||
|
|
||||||
|
run() { # name package-dir test-file
|
||||||
|
local log="$LOGS/$1.log" start; start=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$WT/$2" && timeout 600 node --test "tests/$3") > "$log" 2>&1
|
||||||
|
local rc=$?
|
||||||
|
echo "$1 rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$log" | tr '\n' ' ')"
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
# probe name sed-expression changed-line test-name
|
||||||
|
probe() {
|
||||||
|
cp -p "$SRC" "$SRC.orig"
|
||||||
|
sed -i "$2" "$SRC"
|
||||||
|
if [ "$(grep -cF -- "$3" "$SRC")" != 1 ]; then echo "STOP $1: the edit didn't apply"; exit 1; fi
|
||||||
|
echo "$1 edit: $(grep -nF -- "$3" "$SRC" | sed 's/^\([0-9]*\):\s*/line \1: /')"
|
||||||
|
run "$1" packages/seat working.test.mjs
|
||||||
|
local rc=$? log="$LOGS/$1.log"
|
||||||
|
restore || exit 1
|
||||||
|
if [ $rc -ne 0 ] && grep -q '^ℹ fail 1$' "$log" && grep -qF "✖ $4" "$log"; then
|
||||||
|
echo "$1 KILLED: only \"$4\" failed"
|
||||||
|
else
|
||||||
|
echo "STOP $1: expected exactly that test to fail"; exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run seat-working packages/seat working.test.mjs || { echo "STOP seat-working"; exit 1; }
|
||||||
|
run cli-git-socket packages/cli git-socket.test.mjs || { echo "STOP cli-git-socket"; exit 1; }
|
||||||
|
|
||||||
|
probe kill-b1-patch-drift \
|
||||||
|
's/if (appliedId !== patch_id) refuse("patch-drift"/if (false) refuse("patch-drift"/' \
|
||||||
|
'if (false) refuse("patch-drift"' \
|
||||||
|
"a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree"
|
||||||
|
probe kill-b2-against-root \
|
||||||
|
's/"merge-base", commit, "refs\/heads\/main"\])).ok) refuse("unrelated-history"/"merge-base", commit, "refs\/heads\/root"])).ok) refuse("unrelated-history"/' \
|
||||||
|
'"merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history"' \
|
||||||
|
"once the root shares no history with a landed main, a push is checked against main, not the root"
|
||||||
|
|
||||||
|
# The whole seat suite once more, on the restored candidate.
|
||||||
|
start=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$WT/packages/seat" && timeout 900 node --test tests/*.test.mjs) > "$LOGS/seat.log" 2>&1
|
||||||
|
rc=$?
|
||||||
|
echo "seat rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$LOGS/seat.log" | tr '\n' ' ')"
|
||||||
|
[ $rc -eq 0 ] || { echo "STOP seat"; exit 1; }
|
||||||
|
|
||||||
|
echo "ROUND_PASSED $(date -u +%H:%M:%S)"
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,31 @@
|
|||||||
|
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
|
||||||
|
b30b6b597f515ba155306132804aec10acb6ca07ec82aafaf9baf93533874b9c packages/bus/README.md
|
||||||
|
c86afa94c0bc5d941f5af699dadb8439103d16ca52746038036fdd3110c5453a packages/bus/src/broker.mjs
|
||||||
|
a8a92b4a7d44f85a11f6780d88fdc043ddba203ffca6362b9d0e782dc2e1d07f packages/bus/src/landing.mjs
|
||||||
|
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
|
||||||
|
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
|
||||||
|
ca08921e227d3c554b3480a97b2e81bf113f5b11033bb385cb6070bbfd5178e4 packages/bus/tests/land.test.mjs
|
||||||
|
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
|
||||||
|
512af9a1d48a48f798fa6e3279f9ca8206615e2c3ea55a8772d2b3bbd151eb20 packages/cli/README.md
|
||||||
|
1709491fd769462be67845961865aa5239ae7597805bbeb4cf9e890bdc0eb385 packages/cli/src/git-socket.mjs
|
||||||
|
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
|
||||||
|
415b54a0ec8f5b022f8b9bde1b2c9cdde6b8c086ac9f0de01544387f3f58ffb2 packages/cli/tests/git-socket.test.mjs
|
||||||
|
4bc008fd4c3f2dca1e0795884139889ad2d8bb35554bceeb109c7e3129990384 packages/cli/tests/launcher.test.mjs
|
||||||
|
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
|
||||||
|
69c5623e5a7fec9e36ca3877ed0edbb56eceb0e7b5ceea8a8559db8224fecf45 packages/harness/README.md
|
||||||
|
6b877124b42153842c480006ff2f76379e627df44e50e3581d4933553a77f6ca packages/harness/src/bundle.mjs
|
||||||
|
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
|
||||||
|
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
|
||||||
|
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
|
||||||
|
8d930f3ecc67c8d4b37ebede28323d1a9b9954c6297234384b3b1401608de237 packages/harness/tests/bundle.test.mjs
|
||||||
|
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
|
||||||
|
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
|
||||||
|
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
|
||||||
|
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
|
||||||
|
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
|
||||||
|
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
|
||||||
|
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
|
||||||
|
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
|
||||||
|
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
|
||||||
|
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
|
||||||
|
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
base 63c82f1c4 start 19:43:51
|
||||||
|
bus-land rc=0 19:43:51-19:43:53 ℹ pass 10 ℹ fail 0 ℹ skipped 0
|
||||||
|
bus-hard-waits rc=0 19:43:53-19:43:55 ℹ pass 12 ℹ fail 0 ℹ skipped 0
|
||||||
|
bus-project-runtime rc=0 19:43:55-19:43:55 ℹ pass 3 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat-landing rc=0 19:43:55-19:43:56 ℹ pass 8 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat-working rc=0 19:43:56-19:44:03 ℹ pass 26 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-bundle rc=0 19:44:03-19:44:03 ℹ pass 22 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-git-tools rc=0 19:44:03-19:44:05 ℹ pass 5 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-tools rc=0 19:44:05-19:44:05 ℹ pass 19 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-git-socket rc=0 19:44:05-19:44:14 ℹ pass 23 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-launcher rc=0 19:44:14-19:44:29 ℹ pass 19 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-thread-launch rc=0 19:44:29-19:44:43 ℹ pass 8 ℹ fail 0 ℹ skipped 0
|
||||||
|
test-land-work rc=0 19:44:43-19:44:56 land-work selftests: 86 passed, 0 failed
|
||||||
|
kill-b1-patch-drift edit: packages/seat/src/working.mjs line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
|
||||||
|
kill-b1-patch-drift rc=1 19:44:56-19:45:02 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b1-patch-drift KILLED: "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed, 1 failing
|
||||||
|
kill-b2-against-root edit: packages/seat/src/working.mjs line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
|
||||||
|
kill-b2-against-root rc=1 19:45:02-19:45:08 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b2-against-root KILLED: "once the root shares no history with a landed main, a push is checked against main, not the root" failed, 1 failing
|
||||||
|
kill-a-gated-refusal edit: packages/bus/src/broker.mjs line 815: if (false) fail('not-authorized');
|
||||||
|
kill-a-gated-refusal rc=1 19:45:08-19:45:10 ℹ pass 9 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-a-gated-refusal KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
|
||||||
|
kill-b-arbiter-path edit: packages/bus/src/landing.mjs line 112: const arbitrated = false && d.class === 'cross-role' && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
|
||||||
|
kill-b-arbiter-path rc=1 19:45:10-19:45:11 ℹ pass 4 ℹ fail 6 ℹ skipped 0
|
||||||
|
kill-b-arbiter-path KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 6 failing
|
||||||
|
kill-5-cross-role-only edit: packages/bus/src/landing.mjs line 112: const arbitrated = arbiter && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
|
||||||
|
kill-5-cross-role-only rc=1 19:45:11-19:45:13 ℹ pass 9 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-5-cross-role-only KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
|
||||||
|
kill-arbiter-default edit: packages/bus/src/landing.mjs line 91: export function readLanding(q, business, id, { into, arbiter = true }) {
|
||||||
|
kill-arbiter-default rc=1 19:45:13-19:45:14 ℹ pass 9 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-arbiter-default KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 1 failing
|
||||||
|
kill-held-cross-role edit: packages/bus/src/broker.mjs line 924: if (this.#raisedThread(d) !== record.thread) continue;
|
||||||
|
kill-held-cross-role rc=1 19:45:14-19:45:16 ℹ pass 8 ℹ fail 2 ℹ skipped 0
|
||||||
|
kill-held-cross-role KILLED: "landHeld is true only for an approved, unspent cross-role merge decision" failed, 2 failing
|
||||||
|
bus rc=0 19:45:16-19:45:29 ℹ pass 316 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat rc=0 19:45:29-19:45:35 ℹ pass 150 ℹ fail 0 ℹ skipped 0
|
||||||
|
ROUND_PASSED 19:45:35
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
[exited with code 0]
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.022259ms)
|
||||||
|
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (44.855655ms)
|
||||||
|
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (483.89615ms)
|
||||||
|
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (267.989072ms)
|
||||||
|
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (121.421164ms)
|
||||||
|
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (153.267449ms)
|
||||||
|
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (156.899778ms)
|
||||||
|
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (108.355383ms)
|
||||||
|
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (122.689901ms)
|
||||||
|
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (109.224015ms)
|
||||||
|
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (113.770006ms)
|
||||||
|
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (151.15857ms)
|
||||||
|
ℹ tests 12
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 12
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1890.281641
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (127.395725ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (146.460503ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (239.622452ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (119.431748ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (106.922383ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (272.465401ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (118.404041ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (126.517924ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (131.116898ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (80.804258ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 10
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1523.81645
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.240583ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (93.10966ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (114.154017ms)
|
||||||
|
ℹ tests 3
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 3
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 284.331313
|
||||||
@@ -0,0 +1,324 @@
|
|||||||
|
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (171.928445ms)
|
||||||
|
✔ agents: working counts what the holder received and has not read; routed alone is not working (302.476332ms)
|
||||||
|
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (438.137379ms)
|
||||||
|
✔ agents: working wins over waiting, and Input needed still shows (248.737384ms)
|
||||||
|
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (272.820064ms)
|
||||||
|
✔ agents: state reads only its own business, even for a run name both use (227.210627ms)
|
||||||
|
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (255.584006ms)
|
||||||
|
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (255.826375ms)
|
||||||
|
✔ agents: stranded is oldest first and capped at 50 for a role (995.41125ms)
|
||||||
|
✔ agents: stranded is per role and per business (410.64899ms)
|
||||||
|
✔ agents: a message routed to a held role and not yet received is not stranded (145.87404ms)
|
||||||
|
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (390.232108ms)
|
||||||
|
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (257.046041ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (359.792425ms)
|
||||||
|
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (330.431747ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (309.244921ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (400.671381ms)
|
||||||
|
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (207.165488ms)
|
||||||
|
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (364.356707ms)
|
||||||
|
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (364.049408ms)
|
||||||
|
✔ launch events require a human CLI capability; generic emit cannot forge authority events (255.229576ms)
|
||||||
|
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (247.489352ms)
|
||||||
|
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (308.869757ms)
|
||||||
|
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (207.707781ms)
|
||||||
|
✔ task action subjects and linked decision trail are complete and ordered (245.922601ms)
|
||||||
|
✔ launch binding is durable and reconnecting requires the identical trusted record (141.861486ms)
|
||||||
|
✔ business isolation includes inherited object names and cross-business message references (226.881695ms)
|
||||||
|
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (324.696176ms)
|
||||||
|
✔ task projection uses schema current view, skipping earlier and equal-start polls (186.101398ms)
|
||||||
|
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (262.420433ms)
|
||||||
|
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (176.837718ms)
|
||||||
|
✔ both arbiters require human resolution when their cross-role route is themselves (284.315564ms)
|
||||||
|
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (206.822574ms)
|
||||||
|
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (1.841406ms)
|
||||||
|
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (322.692982ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (465.648404ms)
|
||||||
|
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (324.43572ms)
|
||||||
|
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (311.265858ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (298.64493ms)
|
||||||
|
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (365.431861ms)
|
||||||
|
✔ REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant gets past the protection (319.506328ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (248.628012ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (367.020648ms)
|
||||||
|
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (366.656538ms)
|
||||||
|
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (450.961059ms)
|
||||||
|
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (630.992811ms)
|
||||||
|
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1112.432875ms)
|
||||||
|
✔ comment cursors isolate businesses, move only forward and remain append-only (172.164354ms)
|
||||||
|
✔ only trusted sync writes validated cursors; events and cursor share rollback (175.857198ms)
|
||||||
|
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (1170.350851ms)
|
||||||
|
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1788.636838ms)
|
||||||
|
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (961.452395ms)
|
||||||
|
✔ migration refuses mismatched source metadata without changing schema or evidence (951.681589ms)
|
||||||
|
✔ offline command migrates only the supplied fixture root and reports usage errors (1059.031001ms)
|
||||||
|
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (161.465835ms)
|
||||||
|
✔ credentials refuses a role session and any argument (254.52564ms)
|
||||||
|
✔ credentials reads the status on each request, and a broker without one lists none (313.696752ms)
|
||||||
|
✔ the broker process answers credentials without a token, path or variable in its output, log or store (277.024036ms)
|
||||||
|
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.645249ms)
|
||||||
|
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (3.939576ms)
|
||||||
|
✔ expiry refuses use and env references never become client data (0.87009ms)
|
||||||
|
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.839741ms)
|
||||||
|
✔ opaque tokens shorter than 16 characters refuse before use (0.41739ms)
|
||||||
|
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (1.614415ms)
|
||||||
|
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (663.681958ms)
|
||||||
|
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (626.209842ms)
|
||||||
|
✔ chief-executive-officer: another C-suite role isn't on the lists either (470.234317ms)
|
||||||
|
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (575.011533ms)
|
||||||
|
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (491.511477ms)
|
||||||
|
✔ chief-financial-officer: another C-suite role isn't on the lists either (468.81539ms)
|
||||||
|
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (557.904775ms)
|
||||||
|
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (554.743394ms)
|
||||||
|
✔ chief-information-officer: another C-suite role isn't on the lists either (490.657953ms)
|
||||||
|
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (590.101599ms)
|
||||||
|
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (581.947481ms)
|
||||||
|
✔ chief-information-security-officer: another C-suite role isn't on the lists either (460.43192ms)
|
||||||
|
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (496.149988ms)
|
||||||
|
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (433.610485ms)
|
||||||
|
✔ chief-marketing-officer: another C-suite role isn't on the lists either (378.495278ms)
|
||||||
|
✔ a human resolve sends the raising role one message from the human, and its request is the answer (296.92264ms)
|
||||||
|
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (348.609279ms)
|
||||||
|
✔ a human withdraw sends one message with the note (325.336653ms)
|
||||||
|
✔ a human seen before the close leaves the request on the close's answer, not the seen (394.390744ms)
|
||||||
|
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (331.859125ms)
|
||||||
|
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (327.357146ms)
|
||||||
|
✔ a raising role nobody holds at the close gets the message on the next claim (319.111822ms)
|
||||||
|
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (273.425886ms)
|
||||||
|
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (406.213889ms)
|
||||||
|
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (402.215664ms)
|
||||||
|
✔ a route the raiser hears from is allowed, checked from the route to the raiser (479.598822ms)
|
||||||
|
✔ a refused supersede withdraws nothing (355.575292ms)
|
||||||
|
✔ the assistant's within-role and gated raises still work (346.636797ms)
|
||||||
|
✔ roles lists open decisions routed to a role, and never the human inbox (282.86945ms)
|
||||||
|
✔ recent lists closed decisions of every route, newest close first, with how each closed (406.060459ms)
|
||||||
|
✔ recent gives the closing event as closed when the decision was seen first (407.072351ms)
|
||||||
|
✔ recent stops at RECENT rows (991.855104ms)
|
||||||
|
✔ every row is what trail already gives the same session for that id (308.147866ms)
|
||||||
|
✔ a role session can't list decisions, so it can't read another role's open decisions (436.298637ms)
|
||||||
|
✔ decisions is a read: one business, strict arguments, nothing written (466.563579ms)
|
||||||
|
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (176.536093ms)
|
||||||
|
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (186.229095ms)
|
||||||
|
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (217.584643ms)
|
||||||
|
✔ endLaunch leaves a claim another run took alone (250.856166ms)
|
||||||
|
✔ refuse records action.refused against the caller with the code only (177.399362ms)
|
||||||
|
✔ launches off refuses role.launch with launch-revoked until launches on (259.44956ms)
|
||||||
|
✔ broker process: launch ops authorize role.launch, record refusals and end runs (388.042926ms)
|
||||||
|
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.23688ms)
|
||||||
|
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (127.722422ms)
|
||||||
|
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (877.904146ms)
|
||||||
|
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (526.207831ms)
|
||||||
|
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (283.268578ms)
|
||||||
|
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (346.582856ms)
|
||||||
|
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (305.828921ms)
|
||||||
|
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (258.084421ms)
|
||||||
|
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (256.677097ms)
|
||||||
|
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (261.108474ms)
|
||||||
|
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (284.066626ms)
|
||||||
|
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (324.028335ms)
|
||||||
|
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.48898ms)
|
||||||
|
✔ process reader gets own kernel identity without exposing environment values (0.43473ms)
|
||||||
|
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.581143ms)
|
||||||
|
✔ real pid 1 remains inspectable when its environment is protected (0.221499ms)
|
||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (407.135363ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (464.802601ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (684.560394ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (339.814739ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (330.980011ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (725.152073ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (332.627849ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (341.82618ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (353.28469ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (240.687032ms)
|
||||||
|
✔ a message to a stopped role sends launch.by one notice, and the result says so (303.909ms)
|
||||||
|
✔ a message to a role outside launch.instances says so in its result and in the notice (243.669634ms)
|
||||||
|
✔ a message to a running role sends no notice and its result is unchanged (197.924896ms)
|
||||||
|
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (361.977155ms)
|
||||||
|
✔ a run launched but not yet claimed counts as no holder (182.013799ms)
|
||||||
|
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (325.159482ms)
|
||||||
|
✔ a business with no launch block tells nobody and says there is no launcher (151.470069ms)
|
||||||
|
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (414.526933ms)
|
||||||
|
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (290.864634ms)
|
||||||
|
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (356.209209ms)
|
||||||
|
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (547.570861ms)
|
||||||
|
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (276.812584ms)
|
||||||
|
✔ missing and foreign-business citations refuse and roll back message and grant (224.459833ms)
|
||||||
|
✔ cross-role sends still need a matching resolved decision and consume it once (295.475046ms)
|
||||||
|
✔ messages pages all human messages newest first without writes; read state is history (3006.229017ms)
|
||||||
|
✔ messages refuses role callers, invalid paging and cursors outside this human feed (341.344472ms)
|
||||||
|
✔ views messages passes only its paging arguments through (0.290829ms)
|
||||||
|
✔ messages isolates businesses even with a valid foreign cursor (208.447006ms)
|
||||||
|
✔ the assistant sends to the user and to the chief of staff only (375.782493ms)
|
||||||
|
✔ an assistant send to any other role, or to the tester, is refused and logged (418.528438ms)
|
||||||
|
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (416.417269ms)
|
||||||
|
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (352.270663ms)
|
||||||
|
✔ a sender-side list alone refuses a send to a role that has no list (387.715939ms)
|
||||||
|
✔ a target-side list alone refuses a send from a role that has no list (407.476588ms)
|
||||||
|
✔ the sender list is checked before the target list (368.7465ms)
|
||||||
|
✔ roles without the field behave exactly as before (539.770059ms)
|
||||||
|
✔ a business with no role definitions at all is unlimited (403.637602ms)
|
||||||
|
✔ a malformed messaging field refuses at boot (139.125209ms)
|
||||||
|
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (446.969194ms)
|
||||||
|
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (477.170094ms)
|
||||||
|
✔ review requests and verdicts between roles without the field are unchanged (362.044146ms)
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (250.306052ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (537.317949ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (501.670825ms)
|
||||||
|
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (235.456325ms)
|
||||||
|
✔ startup token refusal returns safe code without value or partial listening broker (67.70906ms)
|
||||||
|
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (215.1427ms)
|
||||||
|
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (241.664372ms)
|
||||||
|
✔ trusted host registers later launches; socket clients never have a registration verb (238.144625ms)
|
||||||
|
✔ runtime excludes declared project roots even when host supplies no repoRoots (65.684451ms)
|
||||||
|
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (205.248481ms)
|
||||||
|
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (196.578125ms)
|
||||||
|
✔ D2: spec.read refuses without content if its role is released during the read (170.553201ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged content without content (148.66085ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged subject without content (163.121269ms)
|
||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.291845ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (220.351179ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (227.905845ms)
|
||||||
|
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (271.761333ms)
|
||||||
|
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (233.615431ms)
|
||||||
|
✔ a message with no reply gives an empty list (189.406387ms)
|
||||||
|
✔ replies come oldest first and stop at REPLIES (892.36566ms)
|
||||||
|
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (358.546831ms)
|
||||||
|
✔ strict arguments; a role session gets human-required (458.87671ms)
|
||||||
|
✔ views passes replies through as one call with the id (0.243115ms)
|
||||||
|
✔ requirements returns the committed list to a holding role session, and no one else (235.003514ms)
|
||||||
|
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (177.342663ms)
|
||||||
|
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (216.333371ms)
|
||||||
|
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (277.986175ms)
|
||||||
|
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (299.301571ms)
|
||||||
|
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (336.08262ms)
|
||||||
|
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (450.596551ms)
|
||||||
|
✔ reviewFetch answers only the addressed reviewer, for the request it cites (302.801602ms)
|
||||||
|
✔ review.verdict answers one request once, to the role that asked (383.174253ms)
|
||||||
|
✔ task.close on a pushed task needs an approve verdict for the latest push (436.21033ms)
|
||||||
|
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (320.203296ms)
|
||||||
|
✔ v3b prototype refusals, views and append-only mutations (1780.765467ms)
|
||||||
|
✔ gated approval authorizes once, survives store reopen, and fresh approval works (296.131129ms)
|
||||||
|
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (256.650091ms)
|
||||||
|
✔ two scheduled callers have exactly one grant and one consumed refusal (197.11119ms)
|
||||||
|
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (388.021803ms)
|
||||||
|
✔ class drift gated to cross-role refuses before consumption (282.00587ms)
|
||||||
|
✔ class drift cross-role to gated refuses before consumption (312.09861ms)
|
||||||
|
✔ class drift gated to within-role refuses before consumption (290.902243ms)
|
||||||
|
✔ class drift cross-role to within-role refuses before consumption (321.619306ms)
|
||||||
|
✔ class drift within-role to gated refuses before consumption (273.944447ms)
|
||||||
|
✔ class drift within-role to cross-role refuses before consumption (303.911252ms)
|
||||||
|
✔ message.send consumes approval and prevents a later send or authorize (247.967274ms)
|
||||||
|
✔ role.revoke consumes approval and prevents a later revoke or authorize (303.960696ms)
|
||||||
|
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1648.610821ms)
|
||||||
|
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (308.912818ms)
|
||||||
|
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (226.333763ms)
|
||||||
|
✔ two real socket writes to one repository yield one commit and one project-busy refusal (232.44763ms)
|
||||||
|
✔ client disconnect during await tolerates late reply (201.977466ms)
|
||||||
|
✔ client disconnect during await tolerates late refusal (212.181097ms)
|
||||||
|
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (403.323234ms)
|
||||||
|
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (360.373444ms)
|
||||||
|
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (357.644268ms)
|
||||||
|
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (273.118853ms)
|
||||||
|
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (297.447776ms)
|
||||||
|
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (291.858813ms)
|
||||||
|
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (371.819934ms)
|
||||||
|
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (211.701485ms)
|
||||||
|
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (514.848751ms)
|
||||||
|
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (508.51339ms)
|
||||||
|
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (502.566718ms)
|
||||||
|
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (249.154504ms)
|
||||||
|
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (649.144478ms)
|
||||||
|
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (433.134447ms)
|
||||||
|
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (228.536738ms)
|
||||||
|
✔ a business that never switched launches reads allowed with no time and no event (143.589144ms)
|
||||||
|
✔ launches revoked and then restored read allowed, with the restore time and event id (189.879713ms)
|
||||||
|
✔ a task closed on the tracker leaves the open list, and total counts the open ones (175.67893ms)
|
||||||
|
✔ a tombstone is not open (176.802855ms)
|
||||||
|
✔ the open list stops at the cap and says so; total still counts every open task (185.483883ms)
|
||||||
|
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (184.371176ms)
|
||||||
|
✔ a human session reads the same state, with the same cap (165.490487ms)
|
||||||
|
✔ reading state writes nothing: every table keeps its row count (202.131666ms)
|
||||||
|
✔ creates private WAL store and excludes a second writer until explicit close (171.892204ms)
|
||||||
|
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (196.258983ms)
|
||||||
|
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (238.82219ms)
|
||||||
|
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (220.157937ms)
|
||||||
|
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (130.594407ms)
|
||||||
|
✔ async transactions refuse before invoking their function (135.618308ms)
|
||||||
|
✔ the session default fits under the reply cap and pages to the end with next (339.900097ms)
|
||||||
|
✔ the short form: no description, assignees by role, every listed key (279.651369ms)
|
||||||
|
✔ each filter, alone and together, and total counts every match (374.236856ms)
|
||||||
|
✔ task_ref reads one task in full, as the whole board has it (347.912138ms)
|
||||||
|
✔ no arguments is the read the Console and mosaic make, unchanged (270.76151ms)
|
||||||
|
✔ an unknown argument or a bad value refuses invalid-request (920.184935ms)
|
||||||
|
✔ tasks rows carry priority and requirement for every session that reads tasks (389.41788ms)
|
||||||
|
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (409.601921ms)
|
||||||
|
✔ an empty business and one with snapshots but no task.created read cleanly (137.858422ms)
|
||||||
|
✔ recordTask keeps sync reads and a role write apart (214.871678ms)
|
||||||
|
✔ read_at must be one canonical UTC format, so the projection compares strings safely (147.160724ms)
|
||||||
|
✔ a bad entry refuses the whole record (125.426606ms)
|
||||||
|
✔ taskView reads the projection for one business (169.828099ms)
|
||||||
|
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (336.242075ms)
|
||||||
|
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (448.042766ms)
|
||||||
|
✔ without an adapter the server refuses every task verb (246.906752ms)
|
||||||
|
✔ the runtime refuses an invalid adapter and closes a valid one (217.540769ms)
|
||||||
|
✔ the process loads the S3 adapter from plain-data trackers (345.88603ms)
|
||||||
|
✔ the tester binds only when the business sets bus.tester to exactly true (987.764193ms)
|
||||||
|
✔ a business may not name a role tester, so the tester address is never a role (297.837078ms)
|
||||||
|
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (601.106074ms)
|
||||||
|
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (227.593082ms)
|
||||||
|
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (255.094013ms)
|
||||||
|
✔ the tester reads the human views a reader reads (181.145046ms)
|
||||||
|
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.170037ms)
|
||||||
|
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.333917ms)
|
||||||
|
✔ testerNonce reads only the tester's variable and gives null on any read error (0.216009ms)
|
||||||
|
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (119.749415ms)
|
||||||
|
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (889.858434ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1237.92929ms)
|
||||||
|
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (872.122649ms)
|
||||||
|
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (814.390502ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (414.287516ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1357.225901ms)
|
||||||
|
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (345.409348ms)
|
||||||
|
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3554.065349ms)
|
||||||
|
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (101.615362ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (142.784589ms)
|
||||||
|
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (163.110116ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (182.947777ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (159.177897ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (144.15201ms)
|
||||||
|
✔ REQ-USER-2: the human verbs refuse another owner's thread (154.850034ms)
|
||||||
|
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.583824ms)
|
||||||
|
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (190.644219ms)
|
||||||
|
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (457.229662ms)
|
||||||
|
✔ socket capability stamps launch identity; shared views use wire, no SQL client (178.171213ms)
|
||||||
|
✔ two wire claims serialize; a lost reply never automatically retries (234.869893ms)
|
||||||
|
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (129.442319ms)
|
||||||
|
✔ client preserves UTF-8 when a response divides a multibyte character (11.716952ms)
|
||||||
|
✔ committed mutation followed by dropped reply reports unknown and is never retried (202.36388ms)
|
||||||
|
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (193.189832ms)
|
||||||
|
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (179.861372ms)
|
||||||
|
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (277.346307ms)
|
||||||
|
✔ a broker with no web service refuses a granted role (182.741544ms)
|
||||||
|
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (218.877595ms)
|
||||||
|
✔ a session that is not the role holder is refused (145.553234ms)
|
||||||
|
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (396.353628ms)
|
||||||
|
✔ web.search with no search source configured is a refused result, not an error (161.146943ms)
|
||||||
|
✔ a search source that fails with its own refusal, or that throws, is handled (173.317477ms)
|
||||||
|
✔ a slow search source ends in a refusal at the deadline (207.576222ms)
|
||||||
|
✔ a secret in the arguments is refused before anything is trailed or fetched (143.776175ms)
|
||||||
|
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (239.93454ms)
|
||||||
|
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.263194ms)
|
||||||
|
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (183.586421ms)
|
||||||
|
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (160.594315ms)
|
||||||
|
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (467.653895ms)
|
||||||
|
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (176.480697ms)
|
||||||
|
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (196.819445ms)
|
||||||
|
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (161.17917ms)
|
||||||
|
ℹ tests 316
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 316
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 12815.533014
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (551.251665ms)
|
||||||
|
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (528.579604ms)
|
||||||
|
✔ the size cap refuses a push before any byte (269.30183ms)
|
||||||
|
✔ a fetch over the cap refuses before any byte reaches the reviewer (452.58736ms)
|
||||||
|
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (267.739357ms)
|
||||||
|
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (396.051646ms)
|
||||||
|
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (306.811539ms)
|
||||||
|
✔ a review of a project the business no longer has refuses unknown-project (302.870279ms)
|
||||||
|
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (211.64561ms)
|
||||||
|
✔ close() answers host-closing to a connection still sending its request line (216.241139ms)
|
||||||
|
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (648.364247ms)
|
||||||
|
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (538.709921ms)
|
||||||
|
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (575.18493ms)
|
||||||
|
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.410207ms)
|
||||||
|
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (535.518462ms)
|
||||||
|
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.233662ms)
|
||||||
|
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (300.727339ms)
|
||||||
|
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (444.928604ms)
|
||||||
|
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (366.039215ms)
|
||||||
|
✔ land: refusals before the gate answer the role at once and leave main and no worktree (410.934589ms)
|
||||||
|
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (452.404951ms)
|
||||||
|
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (369.150802ms)
|
||||||
|
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (351.538449ms)
|
||||||
|
ℹ tests 23
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 23
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 8639.362185
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1206.200713ms)
|
||||||
|
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (437.519741ms)
|
||||||
|
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (871.328835ms)
|
||||||
|
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3585.555977ms)
|
||||||
|
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (359.545401ms)
|
||||||
|
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (138.892363ms)
|
||||||
|
✔ a runner that stops at once ends its launch with the runner's reason (211.615468ms)
|
||||||
|
✔ a Claude Code launch with no session credential refuses before it starts (112.353104ms)
|
||||||
|
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (197.462465ms)
|
||||||
|
✔ a runner killed from the host ends its launch as killed, not failed (263.269273ms)
|
||||||
|
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (120.866648ms)
|
||||||
|
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1015.241638ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (674.148094ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3642.220555ms)
|
||||||
|
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (113.285047ms)
|
||||||
|
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (120.130438ms)
|
||||||
|
✔ a launch client that never closes its side doesn't hold the host's close (121.813745ms)
|
||||||
|
✔ a runner that ignores SIGTERM is killed when the host closes (1232.17579ms)
|
||||||
|
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.531215ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14515.480258
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (5246.82668ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1486.268898ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4312.216573ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2651.316649ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (53.207589ms)
|
||||||
|
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (144.473872ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (177.300702ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (47.009699ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14207.208132
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
✔ sessionModel: agent vars win, then the system's execution settings (7.854925ms)
|
||||||
|
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.029381ms)
|
||||||
|
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.774208ms)
|
||||||
|
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.975372ms)
|
||||||
|
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.11884ms)
|
||||||
|
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.346022ms)
|
||||||
|
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.155196ms)
|
||||||
|
✔ the prompt names the project clones in the workspace, and none when there are none (4.197445ms)
|
||||||
|
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.261762ms)
|
||||||
|
✔ the prompt explains landing to a role with land_work, and to no other (2.560705ms)
|
||||||
|
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (4.846701ms)
|
||||||
|
✔ a bundle is written once: an existing file refuses (0.909896ms)
|
||||||
|
✔ a path with a single quote can't go into the hook command (1.019942ms)
|
||||||
|
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (1.352449ms)
|
||||||
|
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.205918ms)
|
||||||
|
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.177993ms)
|
||||||
|
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.097005ms)
|
||||||
|
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.137309ms)
|
||||||
|
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (2.986828ms)
|
||||||
|
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.291657ms)
|
||||||
|
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (4.350039ms)
|
||||||
|
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.248896ms)
|
||||||
|
ℹ tests 22
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 22
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 128.748577
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (156.1405ms)
|
||||||
|
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (115.093375ms)
|
||||||
|
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1809.272779ms)
|
||||||
|
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.833301ms)
|
||||||
|
✔ land_work sends one land line and resolves the host's started answer (3.393511ms)
|
||||||
|
ℹ tests 5
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 5
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 2450.637148
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
✔ the PM gets its task verbs and the reads, and no launch (7.262191ms)
|
||||||
|
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.666322ms)
|
||||||
|
✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (8.79721ms)
|
||||||
|
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.590752ms)
|
||||||
|
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.095285ms)
|
||||||
|
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.35237ms)
|
||||||
|
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (1.141343ms)
|
||||||
|
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.851001ms)
|
||||||
|
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.869919ms)
|
||||||
|
✔ a coder with a tracker gets its own task tools and no task_reassign (0.964246ms)
|
||||||
|
✔ launch only when the business's launch block names the instance as launcher (1.743816ms)
|
||||||
|
✔ an action outside the instance's authority has no tool (0.980557ms)
|
||||||
|
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.087357ms)
|
||||||
|
✔ land_work is there only with land, after push_working, with the task and the decision (2.331761ms)
|
||||||
|
✔ callTool: one JSON line out, the result back, a refusal rejects (8.506717ms)
|
||||||
|
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.384691ms)
|
||||||
|
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.371751ms)
|
||||||
|
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.622881ms)
|
||||||
|
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.417013ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 133.755195
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (120.80608ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (147.424537ms)
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (134.777989ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (119.129379ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (110.964726ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (273.613354ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (122.300434ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (127.5339ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (130.596847ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (81.903168ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 9
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1424.902514
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:178:1
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (134.777989ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:190:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: { reason: 'not-human' },
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (142.605734ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (146.696348ms)
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (142.943011ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (111.950354ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (110.027874ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (271.711264ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (121.489725ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (126.571426ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (129.967256ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (79.001039ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 9
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1453.690671
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:178:1
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (142.943011ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /not-authorized/. Input:
|
||||||
|
|
||||||
|
'Error: not-human'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:32
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:188:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5),
|
||||||
|
expected: /not-authorized/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (118.546734ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (159.767448ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (246.094953ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (121.392831ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (112.411767ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (274.137409ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (124.673661ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (133.96026ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (137.979957ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (83.382547ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 9
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1568.000852
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:90:1
|
||||||
|
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (118.546734ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:96:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.start (node:internal/test_runner/test:1262:17)
|
||||||
|
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: { reason: 'not-human' },
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (115.323299ms)
|
||||||
|
✖ checkLand refuses on the decision and the review (124.688192ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (235.863051ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (120.082292ms)
|
||||||
|
✖ a merge option with no first line refuses no-subject, as land-work does (100.925418ms)
|
||||||
|
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (102.907846ms)
|
||||||
|
✖ a ticket outlives the run that asked, and recordLand checks the task again (101.693903ms)
|
||||||
|
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (105.374223ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (125.360746ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (75.139067ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 4
|
||||||
|
ℹ fail 6
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1271.9205
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:90:1
|
||||||
|
✖ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (115.323299ms)
|
||||||
|
Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:97:15)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.start (node:internal/test_runner/test:1262:17) {
|
||||||
|
code: 'not-human'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:144:1
|
||||||
|
✖ checkLand refuses on the decision and the review (124.688192ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-verdict/. Input:
|
||||||
|
|
||||||
|
'Error: not-human'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:23
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:168:10),
|
||||||
|
expected: /no-verdict/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:217:1
|
||||||
|
✖ a merge option with no first line refuses no-subject, as land-work does (100.925418ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /no-subject/. Input:
|
||||||
|
|
||||||
|
'Error: not-human'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:25
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:228:10),
|
||||||
|
expected: /no-subject/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:236:1
|
||||||
|
✖ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (102.907846ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /work-ref/. Input:
|
||||||
|
|
||||||
|
'Error: not-human'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:246:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:238:32
|
||||||
|
at getActual (node:assert:580:5)
|
||||||
|
at strict.throws (node:assert:728:24)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:246:10),
|
||||||
|
expected: /work-ref/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:269:1
|
||||||
|
✖ a ticket outlives the run that asked, and recordLand checks the task again (101.693903ms)
|
||||||
|
Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:272:24)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18) {
|
||||||
|
code: 'not-human'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:286:1
|
||||||
|
✖ landRefused files the code on the task, tells the role only with notify, and ends the ticket (105.374223ms)
|
||||||
|
Error: not-human
|
||||||
|
at fail (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:105:9)
|
||||||
|
at #landFacts (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:821:40)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:803:36
|
||||||
|
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/store.mjs:242:22)
|
||||||
|
at Broker.checkLand (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/src/broker.mjs:798:24)
|
||||||
|
at Object.check (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:85:29)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:289:19)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18) {
|
||||||
|
code: 'not-human'
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.025278ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (141.052883ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (117.954527ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (62.670621ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (41.774755ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (126.833196ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (81.885998ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (79.791027ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (51.055726ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (92.897923ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (137.057372ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (394.35892ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (35.606434ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2182.142372ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.284625ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (31.144948ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (127.085506ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (12.970621ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.163523ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (214.433459ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (144.787362ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (356.12664ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (119.329738ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (369.951973ms)
|
||||||
|
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (110.749918ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (233.737943ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 25
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6344.143424
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/working.test.mjs:531:1
|
||||||
|
✖ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (110.749918ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected rejection.
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/tests/working.test.mjs:544:3)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
operator: 'rejects',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.140781ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (133.394699ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (115.512679ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (61.952765ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (40.274776ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (125.962434ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (87.852579ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (78.523472ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (50.654154ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (91.88841ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (134.840919ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (416.263815ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (35.703221ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2171.659005ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.235732ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (30.781986ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (124.222944ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (13.63881ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.264832ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (238.777549ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (172.773927ms)
|
||||||
|
✖ once the root shares no history with a landed main, a push is checked against main, not the root (169.471647ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (133.50926ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (402.001833ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (149.282325ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (246.573137ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 25
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6311.39345
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/working.test.mjs:454:1
|
||||||
|
✖ once the root shares no history with a landed main, a push is checked against main, not the root (169.471647ms)
|
||||||
|
Error: the commit shares no history with main
|
||||||
|
at refuse (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/src/working.mjs:88:9)
|
||||||
|
at file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/seat/src/working.mjs:224:76
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
|
||||||
|
code: 'unrelated-history'
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (130.956476ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (164.466337ms)
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (133.836036ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (128.181922ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (118.866105ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (299.698592ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (138.207625ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (135.09024ms)
|
||||||
|
✖ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (128.680107ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (89.072919ms)
|
||||||
|
ℹ tests 10
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 2
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1523.479432
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:178:1
|
||||||
|
✖ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (133.836036ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:191:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at tests/land.test.mjs:314:1
|
||||||
|
✖ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (128.680107ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: gated
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r137/wt3/packages/bus/tests/land.test.mjs:327:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.364571ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.158392ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.959689ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.279505ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (143.107369ms)
|
||||||
|
✔ runGate: the first failing step stops the gate and names its log (213.065877ms)
|
||||||
|
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (144.374376ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (525.908042ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1101.275227
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.121354ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (132.185308ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (117.277679ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (90.784958ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (109.246449ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (137.822707ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (85.989085ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (82.155384ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (50.875648ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (94.942265ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (154.859904ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (368.791806ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (30.1109ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2176.625106ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.292378ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (23.870723ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (125.128692ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (13.53362ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.202824ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (219.874528ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (151.703528ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (210.71631ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.994858ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (361.510945ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (139.182786ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (236.978251ms)
|
||||||
|
ℹ tests 26
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 26
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6313.92304
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
✔ a first launch clones the root at its branch, with the root's path as origin (38.396027ms)
|
||||||
|
✔ the clone is not at its place until git clone has finished (31.966362ms)
|
||||||
|
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (79.034332ms)
|
||||||
|
✔ a clone ahead of the root keeps its commits and counts as current (52.745395ms)
|
||||||
|
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||||
|
✔ a modified file (59.276598ms)
|
||||||
|
✔ an untracked file (53.696794ms)
|
||||||
|
✔ a staged file (47.526912ms)
|
||||||
|
✔ another branch (54.629158ms)
|
||||||
|
✔ a detached HEAD (51.478948ms)
|
||||||
|
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (267.898375ms)
|
||||||
|
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (47.390555ms)
|
||||||
|
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||||
|
✔ not-a-clone (30.082175ms)
|
||||||
|
✔ hooks-present (30.112196ms)
|
||||||
|
✔ submodule (35.713041ms)
|
||||||
|
✔ config-changed (31.99445ms)
|
||||||
|
✔ root-unreadable (40.761536ms)
|
||||||
|
✔ root-detached (39.983584ms)
|
||||||
|
✔ status-failed, on the root's branch and clean (44.43347ms)
|
||||||
|
✔ status-failed, dirty (40.952778ms)
|
||||||
|
✔ a clone kept before the branch check, or for a failed status, gets no fetch (295.422509ms)
|
||||||
|
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (40.556496ms)
|
||||||
|
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (47.829236ms)
|
||||||
|
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (75.57472ms)
|
||||||
|
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||||
|
✔ user.name (26.584885ms)
|
||||||
|
✔ user.email (30.180988ms)
|
||||||
|
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (57.257909ms)
|
||||||
|
✔ a commit git can't read after the fast-forward is null (54.919116ms)
|
||||||
|
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (22.56489ms)
|
||||||
|
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||||
|
✔ core.fsmonitor (34.588591ms)
|
||||||
|
✔ core.hooksPath (37.390685ms)
|
||||||
|
✔ a hook file (36.690374ms)
|
||||||
|
✔ include.path (39.415405ms)
|
||||||
|
✔ includeIf (35.284633ms)
|
||||||
|
✔ a filter driver (32.628642ms)
|
||||||
|
✔ origin moved (34.334316ms)
|
||||||
|
✔ a second origin url (35.14025ms)
|
||||||
|
✔ the origin url twice, both the root (38.740824ms)
|
||||||
|
✔ an ext:: origin (35.027173ms)
|
||||||
|
✔ a branch tracking another remote (33.436749ms)
|
||||||
|
✔ a branch merging a tag (33.768148ms)
|
||||||
|
✔ a fetch line onto local branches (35.295265ms)
|
||||||
|
✔ no origin (34.914304ms)
|
||||||
|
✔ a config file over the size cap (33.307638ms)
|
||||||
|
✔ config a symlink to /dev/zero (31.150995ms)
|
||||||
|
✔ the clone a symlink to the bait (33.849472ms)
|
||||||
|
✔ the clone a file (31.446481ms)
|
||||||
|
✔ the clone a plain directory (32.720717ms)
|
||||||
|
✔ .git a gitdir: file (32.905961ms)
|
||||||
|
✔ .git a symlink (30.437268ms)
|
||||||
|
✔ .git/logs a symlink (30.400786ms)
|
||||||
|
✔ .git/refs/heads a symlink (32.707297ms)
|
||||||
|
✔ .git/objects a symlink (167.668586ms)
|
||||||
|
✔ a reflog hard-linked to a file outside (33.386686ms)
|
||||||
|
✔ HEAD a fifo (36.008917ms)
|
||||||
|
✔ a commondir file (36.0624ms)
|
||||||
|
✔ an alternates file (34.548355ms)
|
||||||
|
✔ a gitlink staged, no .gitmodules (45.172275ms)
|
||||||
|
✔ a gitlink and .gitmodules staged (48.916053ms)
|
||||||
|
✔ a gitlink to a repository with its own gitlink (56.995656ms)
|
||||||
|
✔ a gitlink and .gitmodules committed (52.030078ms)
|
||||||
|
✔ a gitlink and submodule.active in config (55.916219ms)
|
||||||
|
✔ a .git/modules with no gitlink (34.345046ms)
|
||||||
|
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1391.100862ms)
|
||||||
|
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||||
|
✔ missing (10.226307ms)
|
||||||
|
✔ not a repository (9.80267ms)
|
||||||
|
✔ a plain directory inside another repository (15.114648ms)
|
||||||
|
✔ unreadable (10.465119ms)
|
||||||
|
✔ on no branch (12.622618ms)
|
||||||
|
✔ missing an object (17.314534ms)
|
||||||
|
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (76.413679ms)
|
||||||
|
✔ a clone whose root is on no branch, or gone, is kept and named (30.190409ms)
|
||||||
|
✔ no credential or forge remote of the root reaches a clone (52.301224ms)
|
||||||
|
✔ every project in the business file gets its own clone at its own branch (39.80658ms)
|
||||||
|
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (512.592934ms)
|
||||||
|
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.549717ms)
|
||||||
|
✔ a timeout signals git's process group, so a process git started dies with it (514.290656ms)
|
||||||
|
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (516.154103ms)
|
||||||
|
✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (0.968349ms)
|
||||||
|
✔ gateEnv keeps the named variables that are strings and drops everything else (0.180544ms)
|
||||||
|
✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (27.746269ms)
|
||||||
|
✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.425099ms)
|
||||||
|
✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (180.387107ms)
|
||||||
|
✔ runGate: the first failing step stops the gate and names its log (259.361384ms)
|
||||||
|
✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (166.060336ms)
|
||||||
|
✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (563.988603ms)
|
||||||
|
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.414975ms)
|
||||||
|
✔ sandboxProblem names a missing bwrap and a bwrap that fails (12.058482ms)
|
||||||
|
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.479411ms)
|
||||||
|
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.633668ms)
|
||||||
|
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.742467ms)
|
||||||
|
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.207269ms)
|
||||||
|
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1838.37211ms)
|
||||||
|
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2642.418644ms)
|
||||||
|
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (304.226263ms)
|
||||||
|
✔ resolveSeat: by name under --repo resolves the repo layout (1.260678ms)
|
||||||
|
✔ resolveSeat: by path resolves the fleet layout (0.328242ms)
|
||||||
|
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.719367ms)
|
||||||
|
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.666302ms)
|
||||||
|
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.843026ms)
|
||||||
|
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.508627ms)
|
||||||
|
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.201711ms)
|
||||||
|
✔ CLI launch: registers, execs the fake launch script, and passes args through (28.747273ms)
|
||||||
|
✔ CLI launch: --harness lands in the record (29.069945ms)
|
||||||
|
✔ CLI launch: the launch script's own exit code passes through (30.696396ms)
|
||||||
|
✔ CLI launch: relaunching a seat rewrites the one registration record (70.446282ms)
|
||||||
|
✔ CLI launch: omitting --task records an empty string, not null (36.139265ms)
|
||||||
|
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (102.814407ms)
|
||||||
|
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (142.167777ms)
|
||||||
|
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.439242ms)
|
||||||
|
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.571408ms)
|
||||||
|
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.720868ms)
|
||||||
|
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.880235ms)
|
||||||
|
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (290.929114ms)
|
||||||
|
✔ REQ-LIMIT-1: family substring matching is no longer exported (1.039464ms)
|
||||||
|
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.716378ms)
|
||||||
|
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.262949ms)
|
||||||
|
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.901509ms)
|
||||||
|
✔ session file and launch log: 0600, the session file written once (1.484993ms)
|
||||||
|
✔ endReason maps the runner's exit codes; a signal is killed (0.196679ms)
|
||||||
|
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.783502ms)
|
||||||
|
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.256027ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.526874ms)
|
||||||
|
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.054953ms)
|
||||||
|
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (362.279094ms)
|
||||||
|
✔ workRef and validBranch take only what a ref name can hold (1.171391ms)
|
||||||
|
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (193.505593ms)
|
||||||
|
✔ a rewritten branch refuses non-fast-forward and the work ref stays (175.037048ms)
|
||||||
|
✔ a branch with no history in common with main refuses unrelated-history (89.200338ms)
|
||||||
|
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (45.214098ms)
|
||||||
|
✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (173.211953ms)
|
||||||
|
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (97.47318ms)
|
||||||
|
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (85.980843ms)
|
||||||
|
✔ only a v2 bundle with the named branch is read (55.072636ms)
|
||||||
|
✔ a branch named main, or named for another task, moves only this task's work ref (101.123869ms)
|
||||||
|
✔ a record that throws moves the work ref back, or removes a new one (160.480709ms)
|
||||||
|
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (430.013707ms)
|
||||||
|
✔ a root that can't be read refuses root-unreadable (29.860331ms)
|
||||||
|
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2189.967591ms)
|
||||||
|
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.520349ms)
|
||||||
|
✔ a working repository path that isn't a directory refuses (23.627636ms)
|
||||||
|
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (123.838135ms)
|
||||||
|
✔ review of a project with no working repository refuses unknown-commit (12.898766ms)
|
||||||
|
✔ the runner's git tools hold the host's limits and branch rule (1.19075ms)
|
||||||
|
✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (224.098858ms)
|
||||||
|
✔ after a landing, a push built on the root still lands and main stays where the landing put it (149.212448ms)
|
||||||
|
✔ once the root shares no history with a landed main, a push is checked against main, not the root (213.155109ms)
|
||||||
|
✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (118.653034ms)
|
||||||
|
✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (362.043326ms)
|
||||||
|
✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (136.476845ms)
|
||||||
|
✔ finish refuses base-moved when main moved, and a record that throws moves main back (240.955404ms)
|
||||||
|
ℹ tests 150
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 150
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 6525.218086
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
OK args: exit 2, target-branch
|
||||||
|
OK args: exit 2, target-branch
|
||||||
|
OK args: exit 4
|
||||||
|
OK args: exit 4
|
||||||
|
OK args: exit 4
|
||||||
|
OK --base next refuses before the config is read (got 2)
|
||||||
|
OK a missing system config exits 3 (got 3)
|
||||||
|
OK nobus: exit 3
|
||||||
|
OK schema-table: exit 2, bus-schema
|
||||||
|
OK schema-meta: exit 2, bus-schema
|
||||||
|
OK openBus opens the database read-only
|
||||||
|
OK other-business: exit 2, decision-not-found
|
||||||
|
OK no-raise: exit 2, decision-not-found
|
||||||
|
OK not-a-merge: exit 2, not-a-merge
|
||||||
|
OK open: exit 2, not-resolved
|
||||||
|
OK withdrawn: exit 2, not-resolved
|
||||||
|
OK by-agent: exit 2, not-human
|
||||||
|
OK via-webui: exit 2, not-human
|
||||||
|
OK no-answer: exit 2, not-human
|
||||||
|
OK answer-role: exit 2, not-human
|
||||||
|
OK answer-run: exit 2, not-human
|
||||||
|
OK answer-choice: exit 2, not-human
|
||||||
|
OK two-answers: exit 2, not-human
|
||||||
|
OK arbiter-cross: exit 2, not-human
|
||||||
|
OK arbiter-cited: exit 2, not-human
|
||||||
|
OK chose-no: exit 2, not-merge-option
|
||||||
|
OK two-refs: exit 2, work-ref
|
||||||
|
OK bad-ref: exit 2, work-ref
|
||||||
|
OK task-ref-disagrees: exit 2, work-ref
|
||||||
|
OK raise-task-disagrees: exit 2, work-ref
|
||||||
|
OK target-main: exit 2, target-branch
|
||||||
|
OK superseded-question: exit 2, superseded
|
||||||
|
OK superseded-task: exit 2, superseded
|
||||||
|
OK superseded-by: exit 2, superseded
|
||||||
|
OK no-verdict: exit 2, no-verdict
|
||||||
|
OK changes-later: exit 2, not-approved
|
||||||
|
OK short-commit: exit 2, not-approved
|
||||||
|
OK wrong-task-body: exit 2, not-approved
|
||||||
|
OK args: exit 2, decision-not-found
|
||||||
|
OK earlier-merge: exit 0
|
||||||
|
OK ref-moved: exit 2, ref-moved
|
||||||
|
OK root-top: exit 2, root-file
|
||||||
|
OK root-newdir: exit 2, root-file
|
||||||
|
OK root-src: exit 2, root-file
|
||||||
|
OK unrelated: exit 2, base-conflict
|
||||||
|
OK empty: exit 2, base-conflict
|
||||||
|
OK an empty reviewed diff says so
|
||||||
|
OK dirty-changed: exit 2, checkout-dirty
|
||||||
|
OK dirty-staged: exit 2, checkout-dirty
|
||||||
|
OK dirty-untracked: exit 2, checkout-dirty
|
||||||
|
OK conflict: exit 2, base-conflict
|
||||||
|
OK a refusal after the worktree is added leaves no worktree or scratch
|
||||||
|
OK cleanup looks for the worktree's Docker network
|
||||||
|
OK dirty-during: exit 2, checkout-dirty
|
||||||
|
OK a reviewed path dirtied during the gate moves no ref
|
||||||
|
OK drift: exit 2, patch-drift
|
||||||
|
OK patch-drift leaves no worktree or scratch
|
||||||
|
OK gate-pkg: exit 2, gate-failed
|
||||||
|
OK gate-failed names the failing step's log, and it exists
|
||||||
|
OK gate-failed leaves no worktree or scratch
|
||||||
|
OK gate-script: exit 2, gate-failed
|
||||||
|
OK a failing scripts/test-*.sh fails the gate
|
||||||
|
OK a failed gate moves no ref
|
||||||
|
OK nomods: exit 4
|
||||||
|
OK a target without node_modules leaves no worktree or scratch
|
||||||
|
OK moved: exit 2, base-moved
|
||||||
|
OK base-moved keeps the base where it moved to
|
||||||
|
OK dry: exit 0
|
||||||
|
OK --dry-run writes no ref
|
||||||
|
OK --dry-run prints the commit with --subject and --attribution
|
||||||
|
OK --dry-run runs the gate
|
||||||
|
OK --dry-run leaves no worktree or scratch
|
||||||
|
OK land: exit 0
|
||||||
|
OK the landing is one commit on the old base
|
||||||
|
OK its diff is the reviewed diff by patch-id
|
||||||
|
OK its tree is the dry run's
|
||||||
|
OK the message has the option's subject, the citations and the attribution last
|
||||||
|
OK it prints the line for the PM
|
||||||
|
OK the checked-out base has the reviewed paths and keeps the unrelated edit
|
||||||
|
OK only refs/heads/refactor exists in the target
|
||||||
|
OK the work ref is unchanged
|
||||||
|
OK the bus database is unchanged
|
||||||
|
OK the gate ran each package suite but queue, and each scripts/test-*.sh
|
||||||
|
OK the landing leaves no worktree or scratch
|
||||||
|
OK the target's node_modules is still there, with its contents
|
||||||
|
OK the worktree's Docker network is removed
|
||||||
|
---
|
||||||
|
land-work selftests: 86 passed, 0 failed
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Row 137 round 3 (sage-0565): the candidate rebased onto 63c82f1c4 with the REQ-LAND-1 refusal
|
||||||
|
# and the arbiter path. Every test file the candidate touches, plus row 139's hard-waits test, each
|
||||||
|
# singly; scripts/test-land-work.sh; then one kill per new check. A kill edits one source file in
|
||||||
|
# place, runs one test file, which must fail on the named test (and on exactly N tests when N is
|
||||||
|
# given), and restores the file; the script checks every restored file's sha256 against the one it
|
||||||
|
# started with. Last, the whole bus and seat suites. Not the full gate.
|
||||||
|
# Usage: r3-round.sh <worktree> <logdir>
|
||||||
|
set -uo pipefail
|
||||||
|
WT=$(cd "$1" && pwd -P); LOGS=$(mkdir -p "$2" && cd "$2" && pwd -P)
|
||||||
|
INHERITED_TMPDIR=/mnt/storage/scratch/tmp
|
||||||
|
export TMPDIR="$HOME/darkwing-scratch/r137/tmp"; mkdir -p "$TMPDIR"
|
||||||
|
SRCS=(packages/seat/src/working.mjs packages/bus/src/broker.mjs packages/bus/src/landing.mjs)
|
||||||
|
declare -A SUM
|
||||||
|
for f in "${SRCS[@]}"; do SUM[$f]=$(sha256sum "$WT/$f" | cut -d' ' -f1); done
|
||||||
|
restore() {
|
||||||
|
local f bad=0
|
||||||
|
for f in "${SRCS[@]}"; do
|
||||||
|
if [ -f "$WT/$f.orig" ]; then mv -f "$WT/$f.orig" "$WT/$f"; fi
|
||||||
|
[ "$(sha256sum "$WT/$f" | cut -d' ' -f1)" = "${SUM[$f]}" ] || { echo "RESTORE_MISMATCH $f"; bad=1; }
|
||||||
|
done
|
||||||
|
return $bad
|
||||||
|
}
|
||||||
|
trap restore EXIT
|
||||||
|
echo "base $(git -C "$WT" rev-parse --short HEAD) start $(date -u +%H:%M:%S)"
|
||||||
|
|
||||||
|
# run name package-dir test-file [tmpdir]
|
||||||
|
run() {
|
||||||
|
local log="$LOGS/$1.log" start; start=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$WT/$2" && TMPDIR="${4:-$TMPDIR}" timeout 600 node --test "tests/$3") > "$log" 2>&1
|
||||||
|
local rc=$?
|
||||||
|
echo "$1 rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$log" | tr '\n' ' ')"
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
# probe name source sed-expression changed-line package-dir test-file fails test-name
|
||||||
|
# fails is the exact number of failing tests, or "any" for one or more.
|
||||||
|
probe() {
|
||||||
|
local src="$WT/$2"
|
||||||
|
cp -p "$src" "$src.orig"
|
||||||
|
sed -i "$3" "$src"
|
||||||
|
if [ "$(grep -cF -- "$4" "$src")" != 1 ]; then echo "STOP $1: the edit didn't apply"; exit 1; fi
|
||||||
|
echo "$1 edit: $2 $(grep -nF -- "$4" "$src" | sed 's/^\([0-9]*\):\s*/line \1: /')"
|
||||||
|
run "$1" "$5" "$6"
|
||||||
|
local rc=$? log="$LOGS/$1.log" n
|
||||||
|
restore || exit 1
|
||||||
|
n=$(grep -E '^ℹ fail [0-9]+$' "$log" | awk '{print $3}')
|
||||||
|
if [ $rc -ne 0 ] && grep -qF "✖ $8" "$log" && { [ "$7" = any ] && [ "${n:-0}" -ge 1 ] || [ "${n:-}" = "$7" ]; }; then
|
||||||
|
echo "$1 KILLED: \"$8\" failed, $n failing"
|
||||||
|
else
|
||||||
|
echo "STOP $1: expected \"$8\" to fail ($7 failing), got ${n:-none}"; exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run bus-land packages/bus land.test.mjs || { echo "STOP bus-land"; exit 1; }
|
||||||
|
run bus-hard-waits packages/bus hard-waits.test.mjs || { echo "STOP bus-hard-waits"; exit 1; }
|
||||||
|
run bus-project-runtime packages/bus project-runtime.test.mjs || { echo "STOP bus-project-runtime"; exit 1; }
|
||||||
|
run seat-landing packages/seat landing.test.mjs || { echo "STOP seat-landing"; exit 1; }
|
||||||
|
run seat-working packages/seat working.test.mjs || { echo "STOP seat-working"; exit 1; }
|
||||||
|
run harness-bundle packages/harness bundle.test.mjs || { echo "STOP harness-bundle"; exit 1; }
|
||||||
|
run harness-git-tools packages/harness git-tools.test.mjs || { echo "STOP harness-git-tools"; exit 1; }
|
||||||
|
run harness-tools packages/harness tools.test.mjs || { echo "STOP harness-tools"; exit 1; }
|
||||||
|
run cli-git-socket packages/cli git-socket.test.mjs || { echo "STOP cli-git-socket"; exit 1; }
|
||||||
|
# The real-sandbox tests take the inherited TMPDIR (the bwrap runner fails under an override).
|
||||||
|
run cli-launcher packages/cli launcher.test.mjs "$INHERITED_TMPDIR" || { echo "STOP cli-launcher"; exit 1; }
|
||||||
|
run cli-thread-launch packages/cli thread-launch.test.mjs "$INHERITED_TMPDIR" || { echo "STOP cli-thread-launch"; exit 1; }
|
||||||
|
|
||||||
|
start=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$WT" && timeout 600 bash scripts/test-land-work.sh) > "$LOGS/test-land-work.log" 2>&1
|
||||||
|
rc=$?
|
||||||
|
echo "test-land-work rc=$rc $start-$(date -u +%H:%M:%S) $(tail -1 "$LOGS/test-land-work.log")"
|
||||||
|
[ $rc -eq 0 ] || { echo "STOP test-land-work"; exit 1; }
|
||||||
|
|
||||||
|
FIRST="REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op"
|
||||||
|
LAND1="REQ-LAND-1: a gated merge decision refuses not-authorized"
|
||||||
|
HELD="landHeld is true only for an approved, unspent cross-role merge decision"
|
||||||
|
|
||||||
|
probe kill-b1-patch-drift packages/seat/src/working.mjs \
|
||||||
|
's/if (appliedId !== patch_id) refuse("patch-drift"/if (false) refuse("patch-drift"/' \
|
||||||
|
'if (false) refuse("patch-drift"' packages/seat working.test.mjs 1 \
|
||||||
|
"a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree"
|
||||||
|
probe kill-b2-against-root packages/seat/src/working.mjs \
|
||||||
|
's/"merge-base", commit, "refs\/heads\/main"\])).ok) refuse("unrelated-history"/"merge-base", commit, "refs\/heads\/root"])).ok) refuse("unrelated-history"/' \
|
||||||
|
'"merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history"' packages/seat working.test.mjs 1 \
|
||||||
|
"once the root shares no history with a landed main, a push is checked against main, not the root"
|
||||||
|
# (a) REQ-LAND-1: without the refusal, the human-approved gated decision lands.
|
||||||
|
probe kill-a-gated-refusal packages/bus/src/broker.mjs \
|
||||||
|
"s/if (cls === 'gated') fail('not-authorized');/if (false) fail('not-authorized');/" \
|
||||||
|
"if (false) fail('not-authorized');" packages/bus land.test.mjs 1 "$LAND1"
|
||||||
|
# (b) without the arbiter path, every arbiter-resolved landing refuses not-human.
|
||||||
|
probe kill-b-arbiter-path packages/bus/src/landing.mjs \
|
||||||
|
"s/const arbitrated = arbiter && d.class/const arbitrated = false \&\& d.class/" \
|
||||||
|
"const arbitrated = false && d.class" packages/bus land.test.mjs any "$FIRST"
|
||||||
|
# Item 5: the arbiter path takes only a cross-role decision, so a gated one an arbiter resolved fails it.
|
||||||
|
probe kill-5-cross-role-only packages/bus/src/landing.mjs \
|
||||||
|
"s/const arbitrated = arbiter && d.class === 'cross-role' && /const arbitrated = arbiter \&\& /" \
|
||||||
|
"const arbitrated = arbiter && d.route_to" packages/bus land.test.mjs 1 "$LAND1"
|
||||||
|
# land-work's call passes no `arbiter`, so it stays human-only.
|
||||||
|
probe kill-arbiter-default packages/bus/src/landing.mjs \
|
||||||
|
"s/{ into, arbiter = false })/{ into, arbiter = true })/" \
|
||||||
|
"{ into, arbiter = true })" packages/bus land.test.mjs 1 "$FIRST"
|
||||||
|
# landHeld offers the land op only for a cross-role decision.
|
||||||
|
probe kill-held-cross-role packages/bus/src/broker.mjs \
|
||||||
|
"s/if (d.class !== 'cross-role' || this.#raisedThread(d) !== record.thread) continue;/if (this.#raisedThread(d) !== record.thread) continue;/" \
|
||||||
|
"if (this.#raisedThread(d) !== record.thread) continue;" packages/bus land.test.mjs any "$HELD"
|
||||||
|
|
||||||
|
# The whole bus and seat suites once more, on the restored candidate.
|
||||||
|
for pkg in bus seat; do
|
||||||
|
start=$(date -u +%H:%M:%S)
|
||||||
|
(cd "$WT/packages/$pkg" && timeout 900 node --test tests/*.test.mjs) > "$LOGS/$pkg.log" 2>&1
|
||||||
|
rc=$?
|
||||||
|
echo "$pkg rc=$rc $start-$(date -u +%H:%M:%S) $(grep -E 'ℹ (pass|fail|skipped) ' "$LOGS/$pkg.log" | tr '\n' ' ')"
|
||||||
|
[ $rc -eq 0 ] || { echo "STOP $pkg"; exit 1; }
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "ROUND_PASSED $(date -u +%H:%M:%S)"
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,31 @@
|
|||||||
|
0f664971bd3e4e57fa4c53c5ded0c1e01dee9fb1a9ff3b0c459964372a56cc6e docs/TOOLS.md
|
||||||
|
4c6bcbcfa07ae36887aa25d2cedee3d080aefe75fefa4e939ec274e8e3b0ae8e packages/bus/README.md
|
||||||
|
be3559db5337f8720f0813c2e4158cc2b0423fc7b57afa955d80e6736416a8a5 packages/bus/src/broker.mjs
|
||||||
|
9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b packages/bus/src/landing.mjs
|
||||||
|
7f8a0fd2d8084632f2c1d7fdc914a89b1f902bd4c8e91ecfe68c1fa226a83171 packages/bus/src/process.mjs
|
||||||
|
38ec7a59a12cab72ed4a58ff784e384ad135d0fd5c496b78275592a9b85d9d04 packages/bus/src/runtime.mjs
|
||||||
|
23d93c7ec180c3ce0b1fa764cda5deb8150943e4b8f8a2fbcb78a7124dc0ab66 packages/bus/tests/land.test.mjs
|
||||||
|
693cb5a19162a5e7c05802a355d8fddc7d1ea325adf58ad50ca3cb451dcd0a56 packages/bus/tests/project-runtime.test.mjs
|
||||||
|
6eb0ebb8b49b1916bd3254a9c2424d5e54a2bef863eec268ce5ad4b98e6b15a8 packages/cli/README.md
|
||||||
|
8b629a5c18b0c45752e9206ebbd7118b78246abfbe4024584bd167e96e7b34ca packages/cli/src/git-socket.mjs
|
||||||
|
c764b070ceea3145bcff4d0a3cc97a88bc750c347b62645738e215313bc22829 packages/cli/src/launcher.mjs
|
||||||
|
3138cdac761bf1167fc2c6b539e96b5f8059c2f015d9d0ea8462ae2be6703765 packages/cli/tests/git-socket.test.mjs
|
||||||
|
4bc008fd4c3f2dca1e0795884139889ad2d8bb35554bceeb109c7e3129990384 packages/cli/tests/launcher.test.mjs
|
||||||
|
2fef7b7e7f7943448ad041653c5e055faa319c06ff62e248b65cd9be8f1f6360 packages/cli/tests/thread-launch.test.mjs
|
||||||
|
69c5623e5a7fec9e36ca3877ed0edbb56eceb0e7b5ceea8a8559db8224fecf45 packages/harness/README.md
|
||||||
|
6b877124b42153842c480006ff2f76379e627df44e50e3581d4933553a77f6ca packages/harness/src/bundle.mjs
|
||||||
|
58ee910f904a976ee76a4086432fd477b7f70fdf1793fe893b8bb7beb96d7bc6 packages/harness/src/git-tools.mjs
|
||||||
|
9db75a1688bb628f94d7d3b7a567b8376f13226222b55b9621fd2e0cbb61c5ab packages/harness/src/runner.mjs
|
||||||
|
c1b9ec00eaa43450dc385c3374f47f0fe78f53a20999fa8e1315d517c6444be2 packages/harness/src/tools.mjs
|
||||||
|
8d930f3ecc67c8d4b37ebede28323d1a9b9954c6297234384b3b1401608de237 packages/harness/tests/bundle.test.mjs
|
||||||
|
c0ae1baf603b1e7f4161de2021666ae7be28325436a5ebfb3dfd0e681ce4b872 packages/harness/tests/git-tools.test.mjs
|
||||||
|
a242e6e51903362fc8ce6ff4c29ac3703db9926a080b82e4a4605133a589d670 packages/harness/tests/tools.test.mjs
|
||||||
|
46b31ac7d9bf2fafb548b117fe783c82a65058303284e7021d27610f45339a79 packages/seat/README.md
|
||||||
|
4936266221de342673dbee9af2162328c59bcf4d2eff0c4b6bf63c5e08575bc2 packages/seat/src/checkout.mjs
|
||||||
|
a3a5f3e58b92b8bf57d4bd7e9246f7ce10492e308ddfd254c5e059197c2d9c14 packages/seat/src/landing.mjs
|
||||||
|
a78268ddbed7bc955dcdee0522278744216b4562e3a699e9409532eed319d336 packages/seat/src/sandbox.mjs
|
||||||
|
0d332d73596e94d2114751c1924c4f8463c387aba9ffdb0924d61f6228e1c463 packages/seat/src/working.mjs
|
||||||
|
bf7ef39b57023b498216303543b959fc387b0eeaca475cdf02eb5848b3b5de72 packages/seat/tests/landing.test.mjs
|
||||||
|
eb13b67c252dc097893e821b89fb49253f19e3e4c206ecf6a67429fd22f6c677 packages/seat/tests/working.test.mjs
|
||||||
|
5dfcc779614378fc504191aac48dab0bc5bec608f097d799c013236e79a43379 scripts/land-work/read.mjs
|
||||||
|
91ef00876a0a3719452ae464a6b2f7c69a8aa65af8fb93515308a0cb85161772 scripts/land-work.sh
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
base 63c82f1c4 start 20:38:29
|
||||||
|
bus-land rc=0 20:38:29-20:38:31 ℹ pass 11 ℹ fail 0 ℹ skipped 0
|
||||||
|
bus-hard-waits rc=0 20:38:31-20:38:33 ℹ pass 12 ℹ fail 0 ℹ skipped 0
|
||||||
|
bus-project-runtime rc=0 20:38:33-20:38:33 ℹ pass 3 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat-landing rc=0 20:38:33-20:38:34 ℹ pass 8 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat-working rc=0 20:38:34-20:38:40 ℹ pass 26 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-bundle rc=0 20:38:41-20:38:41 ℹ pass 22 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-git-tools rc=0 20:38:41-20:38:43 ℹ pass 5 ℹ fail 0 ℹ skipped 0
|
||||||
|
harness-tools rc=0 20:38:43-20:38:43 ℹ pass 19 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-git-socket rc=0 20:38:43-20:38:52 ℹ pass 24 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-launcher rc=0 20:38:52-20:39:07 ℹ pass 19 ℹ fail 0 ℹ skipped 0
|
||||||
|
cli-thread-launch rc=0 20:39:07-20:39:21 ℹ pass 8 ℹ fail 0 ℹ skipped 0
|
||||||
|
test-land-work rc=0 20:39:21-20:39:34 land-work selftests: 86 passed, 0 failed
|
||||||
|
kill-b1-patch-drift edit: packages/seat/src/working.mjs line 348: if (false) refuse("patch-drift", `applied ${appliedId ?? "none"}, reviewed ${patch_id}`);
|
||||||
|
kill-b1-patch-drift rc=1 20:39:34-20:39:41 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b1-patch-drift KILLED: "a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree" failed, 1 failing
|
||||||
|
kill-b2-against-root edit: packages/seat/src/working.mjs line 224: if (!(await g([...at, "merge-base", commit, "refs/heads/root"])).ok) refuse("unrelated-history", "the commit shares no history with main");
|
||||||
|
kill-b2-against-root rc=1 20:39:41-20:39:47 ℹ pass 25 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b2-against-root KILLED: "once the root shares no history with a landed main, a push is checked against main, not the root" failed, 1 failing
|
||||||
|
kill-a-gated-refusal edit: packages/bus/src/broker.mjs line 815: if (false) fail('not-authorized');
|
||||||
|
kill-a-gated-refusal rc=1 20:39:47-20:39:49 ℹ pass 9 ℹ fail 2 ℹ skipped 0
|
||||||
|
kill-a-gated-refusal KILLED: "REQ-LAND-1: a within-role merge grant refuses not-authorized at the land" failed, 2 failing
|
||||||
|
kill-2-gated-only edit: packages/bus/src/broker.mjs line 815: if (cls === 'gated') fail('not-authorized');
|
||||||
|
kill-2-gated-only rc=1 20:39:49-20:39:50 ℹ pass 10 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-2-gated-only KILLED: "REQ-LAND-1: a within-role merge grant refuses not-authorized at the land" failed, 1 failing
|
||||||
|
kill-b1-cli-text edit: packages/cli/src/git-socket.mjs line 259: the reviewed diff ${base}..${f.commit}. Resolved ${f.choice} by ${f.by} via the CLI at ${f.resolved_at}.
|
||||||
|
kill-b1-cli-text rc=1 20:39:50-20:39:59 ℹ pass 23 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-b1-cli-text KILLED: "land: an arbiter-resolved landing's squash says the arbiter resolved it through the broker" failed, 1 failing
|
||||||
|
kill-b-arbiter-path edit: packages/bus/src/landing.mjs line 114: const arbitrated = false && d.class === 'cross-role' && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
|
||||||
|
kill-b-arbiter-path rc=1 20:39:59-20:40:01 ℹ pass 5 ℹ fail 6 ℹ skipped 0
|
||||||
|
kill-b-arbiter-path KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 6 failing
|
||||||
|
kill-5-cross-role-only edit: packages/bus/src/landing.mjs line 114: const arbitrated = arbiter && d.route_to !== 'human' && res.via === 'broker' && !answers.length;
|
||||||
|
kill-5-cross-role-only rc=1 20:40:01-20:40:03 ℹ pass 10 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-5-cross-role-only KILLED: "REQ-LAND-1: a gated merge decision refuses not-authorized" failed, 1 failing
|
||||||
|
kill-arbiter-default edit: packages/bus/src/landing.mjs line 91: export function readLanding(q, business, id, { into, arbiter = true }) {
|
||||||
|
kill-arbiter-default rc=1 20:40:03-20:40:05 ℹ pass 10 ℹ fail 1 ℹ skipped 0
|
||||||
|
kill-arbiter-default KILLED: "REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op" failed, 1 failing
|
||||||
|
kill-held-cross-role edit: packages/bus/src/broker.mjs line 925: if (this.#raisedThread(d) !== record.thread) continue;
|
||||||
|
kill-held-cross-role rc=1 20:40:05-20:40:06 ℹ pass 8 ℹ fail 3 ℹ skipped 0
|
||||||
|
kill-held-cross-role KILLED: "landHeld is true only for an approved, unspent cross-role merge decision" failed, 3 failing
|
||||||
|
bus rc=0 20:40:06-20:40:19 ℹ pass 317 ℹ fail 0 ℹ skipped 0
|
||||||
|
seat rc=0 20:40:19-20:40:26 ℹ pass 150 ℹ fail 0 ℹ skipped 0
|
||||||
|
ROUND_PASSED 20:40:26
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.015798ms)
|
||||||
|
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (41.839958ms)
|
||||||
|
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (505.134436ms)
|
||||||
|
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (271.314022ms)
|
||||||
|
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (121.950521ms)
|
||||||
|
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (159.257982ms)
|
||||||
|
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (160.15131ms)
|
||||||
|
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (109.758505ms)
|
||||||
|
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (124.486226ms)
|
||||||
|
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (112.755751ms)
|
||||||
|
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (112.876897ms)
|
||||||
|
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (157.719081ms)
|
||||||
|
ℹ tests 12
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 12
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1937.920951
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (129.1728ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (142.47603ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (221.493623ms)
|
||||||
|
✔ REQ-LAND-1: a within-role merge grant refuses not-authorized at the land (89.537177ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (126.633282ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (106.881674ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (277.158806ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (118.38417ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (130.408537ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (126.518588ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (77.111162ms)
|
||||||
|
ℹ tests 11
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 11
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1605.27556
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.451709ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (109.468669ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (124.832042ms)
|
||||||
|
ℹ tests 3
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 3
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 328.088602
|
||||||
@@ -0,0 +1,325 @@
|
|||||||
|
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (163.148076ms)
|
||||||
|
✔ agents: working counts what the holder received and has not read; routed alone is not working (237.904388ms)
|
||||||
|
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (366.140846ms)
|
||||||
|
✔ agents: working wins over waiting, and Input needed still shows (200.144038ms)
|
||||||
|
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (209.908404ms)
|
||||||
|
✔ agents: state reads only its own business, even for a run name both use (205.781705ms)
|
||||||
|
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (233.242421ms)
|
||||||
|
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (260.678731ms)
|
||||||
|
✔ agents: stranded is oldest first and capped at 50 for a role (961.69181ms)
|
||||||
|
✔ agents: stranded is per role and per business (611.249164ms)
|
||||||
|
✔ agents: a message routed to a held role and not yet received is not stranded (164.063026ms)
|
||||||
|
✔ REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once (320.827023ms)
|
||||||
|
✔ REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing (205.739997ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread (294.967115ms)
|
||||||
|
✔ REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot (274.702701ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread (284.260979ms)
|
||||||
|
✔ REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run (423.921854ms)
|
||||||
|
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (208.937222ms)
|
||||||
|
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (301.07892ms)
|
||||||
|
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (313.266719ms)
|
||||||
|
✔ launch events require a human CLI capability; generic emit cannot forge authority events (183.748752ms)
|
||||||
|
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (204.949301ms)
|
||||||
|
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (299.94165ms)
|
||||||
|
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (212.435173ms)
|
||||||
|
✔ task action subjects and linked decision trail are complete and ordered (225.27596ms)
|
||||||
|
✔ launch binding is durable and reconnecting requires the identical trusted record (147.522365ms)
|
||||||
|
✔ business isolation includes inherited object names and cross-business message references (226.041341ms)
|
||||||
|
✔ authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it (322.317386ms)
|
||||||
|
✔ task projection uses schema current view, skipping earlier and equal-start polls (167.998965ms)
|
||||||
|
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (361.725884ms)
|
||||||
|
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (300.519893ms)
|
||||||
|
✔ both arbiters require human resolution when their cross-role route is themselves (269.987526ms)
|
||||||
|
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (202.060228ms)
|
||||||
|
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.190224ms)
|
||||||
|
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (293.827506ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (374.957988ms)
|
||||||
|
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (257.442071ms)
|
||||||
|
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (259.038535ms)
|
||||||
|
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (280.10122ms)
|
||||||
|
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (360.436195ms)
|
||||||
|
✔ REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant gets past the protection (304.104477ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (270.918167ms)
|
||||||
|
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (335.120645ms)
|
||||||
|
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (568.418542ms)
|
||||||
|
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (424.991945ms)
|
||||||
|
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (640.518965ms)
|
||||||
|
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (1059.972237ms)
|
||||||
|
✔ comment cursors isolate businesses, move only forward and remain append-only (156.520816ms)
|
||||||
|
✔ only trusted sync writes validated cursors; events and cursor share rollback (141.675484ms)
|
||||||
|
✔ explicit 3b copy migration preserves evidence and opens as 3f; normal startup never migrates (960.896528ms)
|
||||||
|
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1717.975958ms)
|
||||||
|
✔ named migration registry chains 3b through 3f to a fixture-only future version in order (1133.300671ms)
|
||||||
|
✔ migration refuses mismatched source metadata without changing schema or evidence (913.393225ms)
|
||||||
|
✔ offline command migrates only the supplied fixture root and reports usage errors (1059.064858ms)
|
||||||
|
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (147.922318ms)
|
||||||
|
✔ credentials refuses a role session and any argument (207.753435ms)
|
||||||
|
✔ credentials reads the status on each request, and a broker without one lists none (247.714756ms)
|
||||||
|
✔ the broker process answers credentials without a token, path or variable in its output, log or store (241.562219ms)
|
||||||
|
✔ only validated broker references load; returned data and exceptions cannot expose a known token (2.920226ms)
|
||||||
|
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (2.439552ms)
|
||||||
|
✔ expiry refuses use and env references never become client data (0.821163ms)
|
||||||
|
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.77615ms)
|
||||||
|
✔ opaque tokens shorter than 16 characters refuse before use (0.387374ms)
|
||||||
|
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (1.706956ms)
|
||||||
|
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (548.622486ms)
|
||||||
|
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (496.3199ms)
|
||||||
|
✔ chief-executive-officer: another C-suite role isn't on the lists either (443.1721ms)
|
||||||
|
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (561.588601ms)
|
||||||
|
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (493.363263ms)
|
||||||
|
✔ chief-financial-officer: another C-suite role isn't on the lists either (430.992323ms)
|
||||||
|
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (740.943562ms)
|
||||||
|
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (543.308742ms)
|
||||||
|
✔ chief-information-officer: another C-suite role isn't on the lists either (461.94522ms)
|
||||||
|
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (574.336077ms)
|
||||||
|
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (547.199774ms)
|
||||||
|
✔ chief-information-security-officer: another C-suite role isn't on the lists either (453.081652ms)
|
||||||
|
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (515.63442ms)
|
||||||
|
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (472.99622ms)
|
||||||
|
✔ chief-marketing-officer: another C-suite role isn't on the lists either (406.703655ms)
|
||||||
|
✔ a human resolve sends the raising role one message from the human, and its request is the answer (278.227635ms)
|
||||||
|
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (263.802282ms)
|
||||||
|
✔ a human withdraw sends one message with the note (275.487664ms)
|
||||||
|
✔ a human seen before the close leaves the request on the close's answer, not the seen (321.819233ms)
|
||||||
|
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (310.353901ms)
|
||||||
|
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (332.423423ms)
|
||||||
|
✔ a raising role nobody holds at the close gets the message on the next claim (309.538947ms)
|
||||||
|
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (270.791253ms)
|
||||||
|
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (351.049846ms)
|
||||||
|
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (328.876224ms)
|
||||||
|
✔ a route the raiser hears from is allowed, checked from the route to the raiser (375.167935ms)
|
||||||
|
✔ a refused supersede withdraws nothing (326.805401ms)
|
||||||
|
✔ the assistant's within-role and gated raises still work (355.814125ms)
|
||||||
|
✔ roles lists open decisions routed to a role, and never the human inbox (256.103153ms)
|
||||||
|
✔ recent lists closed decisions of every route, newest close first, with how each closed (333.931181ms)
|
||||||
|
✔ recent gives the closing event as closed when the decision was seen first (332.180355ms)
|
||||||
|
✔ recent stops at RECENT rows (915.102875ms)
|
||||||
|
✔ every row is what trail already gives the same session for that id (309.56547ms)
|
||||||
|
✔ a role session can't list decisions, so it can't read another role's open decisions (457.129828ms)
|
||||||
|
✔ decisions is a read: one business, strict arguments, nothing written (487.809005ms)
|
||||||
|
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (167.544327ms)
|
||||||
|
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (144.815452ms)
|
||||||
|
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (182.957452ms)
|
||||||
|
✔ endLaunch leaves a claim another run took alone (208.96425ms)
|
||||||
|
✔ refuse records action.refused against the caller with the code only (150.727619ms)
|
||||||
|
✔ launches off refuses role.launch with launch-revoked until launches on (208.4134ms)
|
||||||
|
✔ broker process: launch ops authorize role.launch, record refusals and end runs (349.093113ms)
|
||||||
|
✔ REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary (1.237128ms)
|
||||||
|
✔ REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable (120.774517ms)
|
||||||
|
✔ REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it (805.462423ms)
|
||||||
|
✔ REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human (454.965751ms)
|
||||||
|
✔ REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it (286.721471ms)
|
||||||
|
✔ REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation (357.745165ms)
|
||||||
|
✔ REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human (291.035324ms)
|
||||||
|
✔ Q169: the chief of staff's end of the assistant is not refused role-end-refused; its own run and another ender's are (256.861693ms)
|
||||||
|
✔ Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused (252.591822ms)
|
||||||
|
✔ Q169: a revoke of the assistant citing a decision the human resolved is not refused by the protection (469.999248ms)
|
||||||
|
✔ Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes (250.476104ms)
|
||||||
|
✔ Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human (328.798856ms)
|
||||||
|
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (1.516149ms)
|
||||||
|
✔ process reader gets own kernel identity without exposing environment values (0.411471ms)
|
||||||
|
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.581397ms)
|
||||||
|
✔ real pid 1 remains inspectable when its environment is protected (0.240794ms)
|
||||||
|
✔ REQ-DEC-2: a merge-gate raise its arbiter resolved lands through the host op: checkLand answers the facts and a ticket, records nothing, and recordLand spends the decision once (318.948964ms)
|
||||||
|
✔ checkLand refuses on the decision and the review (378.213707ms)
|
||||||
|
✔ REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human (570.741352ms)
|
||||||
|
✔ REQ-LAND-1: a within-role merge grant refuses not-authorized at the land (292.67665ms)
|
||||||
|
✔ a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer (314.608769ms)
|
||||||
|
✔ a merge option with no first line refuses no-subject, as land-work does (286.198945ms)
|
||||||
|
✔ checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands (727.031741ms)
|
||||||
|
✔ a ticket outlives the run that asked, and recordLand checks the task again (526.458567ms)
|
||||||
|
✔ landRefused files the code on the task, tells the role only with notify, and ends the ticket (334.57817ms)
|
||||||
|
✔ landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread (328.365556ms)
|
||||||
|
✔ no run may write the action.allowed for git.merge.protected itself (268.083886ms)
|
||||||
|
✔ a message to a stopped role sends launch.by one notice, and the result says so (253.505277ms)
|
||||||
|
✔ a message to a role outside launch.instances says so in its result and in the notice (187.892963ms)
|
||||||
|
✔ a message to a running role sends no notice and its result is unchanged (165.768161ms)
|
||||||
|
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (281.511981ms)
|
||||||
|
✔ a run launched but not yet claimed counts as no holder (147.166425ms)
|
||||||
|
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (305.803966ms)
|
||||||
|
✔ a business with no launch block tells nobody and says there is no launcher (141.275169ms)
|
||||||
|
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (412.128473ms)
|
||||||
|
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (242.101973ms)
|
||||||
|
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (329.598156ms)
|
||||||
|
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (443.33223ms)
|
||||||
|
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (229.148577ms)
|
||||||
|
✔ missing and foreign-business citations refuse and roll back message and grant (203.937679ms)
|
||||||
|
✔ cross-role sends still need a matching resolved decision and consume it once (292.718323ms)
|
||||||
|
✔ messages pages all human messages newest first without writes; read state is history (3165.78247ms)
|
||||||
|
✔ messages refuses role callers, invalid paging and cursors outside this human feed (327.529403ms)
|
||||||
|
✔ views messages passes only its paging arguments through (0.309737ms)
|
||||||
|
✔ messages isolates businesses even with a valid foreign cursor (199.057646ms)
|
||||||
|
✔ the assistant sends to the user and to the chief of staff only (377.224398ms)
|
||||||
|
✔ an assistant send to any other role, or to the tester, is refused and logged (396.260606ms)
|
||||||
|
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (405.977601ms)
|
||||||
|
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (341.300358ms)
|
||||||
|
✔ a sender-side list alone refuses a send to a role that has no list (573.864792ms)
|
||||||
|
✔ a target-side list alone refuses a send from a role that has no list (396.523645ms)
|
||||||
|
✔ the sender list is checked before the target list (357.640301ms)
|
||||||
|
✔ roles without the field behave exactly as before (532.580106ms)
|
||||||
|
✔ a business with no role definitions at all is unlimited (373.169576ms)
|
||||||
|
✔ a malformed messaging field refuses at boot (128.314711ms)
|
||||||
|
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (433.762247ms)
|
||||||
|
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (443.603413ms)
|
||||||
|
✔ review requests and verdicts between roles without the field are unchanged (355.589515ms)
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (230.220442ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (567.694849ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (435.272226ms)
|
||||||
|
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (245.485961ms)
|
||||||
|
✔ startup token refusal returns safe code without value or partial listening broker (85.615537ms)
|
||||||
|
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (249.331932ms)
|
||||||
|
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (258.806099ms)
|
||||||
|
✔ trusted host registers later launches; socket clients never have a registration verb (226.907808ms)
|
||||||
|
✔ runtime excludes declared project roots even when host supplies no repoRoots (80.730391ms)
|
||||||
|
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (446.674267ms)
|
||||||
|
✔ D1: committed write with a failed receipt refuses outcome-unknown without action.allowed (172.59972ms)
|
||||||
|
✔ D2: spec.read refuses without content if its role is released during the read (171.71074ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged content without content (172.064549ms)
|
||||||
|
✔ D3: spec.read secret check refuses flagged subject without content (148.160003ms)
|
||||||
|
✔ Broker keeps the existing sandbox client import closure: no new imports or lazy project import (1.920558ms)
|
||||||
|
✔ without a trusted project adapter all three async paths refuse project-not-configured (229.774038ms)
|
||||||
|
✔ real startBroker injects the project adapter for socket reads and bound-author record writes (239.006477ms)
|
||||||
|
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (238.142385ms)
|
||||||
|
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (215.463945ms)
|
||||||
|
✔ a message with no reply gives an empty list (239.787901ms)
|
||||||
|
✔ replies come oldest first and stop at REPLIES (992.702235ms)
|
||||||
|
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (400.298674ms)
|
||||||
|
✔ strict arguments; a role session gets human-required (444.388995ms)
|
||||||
|
✔ views passes replies through as one call with the id (0.265001ms)
|
||||||
|
✔ requirements returns the committed list to a holding role session, and no one else (217.097033ms)
|
||||||
|
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (182.72472ms)
|
||||||
|
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (411.682477ms)
|
||||||
|
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (254.392918ms)
|
||||||
|
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (500.999304ms)
|
||||||
|
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (316.048307ms)
|
||||||
|
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (413.744172ms)
|
||||||
|
✔ reviewFetch answers only the addressed reviewer, for the request it cites (315.631978ms)
|
||||||
|
✔ review.verdict answers one request once, to the role that asked (367.317892ms)
|
||||||
|
✔ task.close on a pushed task needs an approve verdict for the latest push (442.505584ms)
|
||||||
|
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (302.177749ms)
|
||||||
|
✔ v3b prototype refusals, views and append-only mutations (1937.741967ms)
|
||||||
|
✔ gated approval authorizes once, survives store reopen, and fresh approval works (404.728662ms)
|
||||||
|
✔ another run of the same instance consumes an approval once; a failed check leaves it usable (247.899418ms)
|
||||||
|
✔ two scheduled callers have exactly one grant and one consumed refusal (182.293296ms)
|
||||||
|
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (380.341005ms)
|
||||||
|
✔ class drift gated to cross-role refuses before consumption (292.098134ms)
|
||||||
|
✔ class drift cross-role to gated refuses before consumption (321.409862ms)
|
||||||
|
✔ class drift gated to within-role refuses before consumption (258.164702ms)
|
||||||
|
✔ class drift cross-role to within-role refuses before consumption (293.195396ms)
|
||||||
|
✔ class drift within-role to gated refuses before consumption (272.188929ms)
|
||||||
|
✔ class drift within-role to cross-role refuses before consumption (263.9268ms)
|
||||||
|
✔ message.send consumes approval and prevents a later send or authorize (262.141997ms)
|
||||||
|
✔ role.revoke consumes approval and prevents a later revoke or authorize (292.476662ms)
|
||||||
|
✔ 3e copy migrates to 3f preserving every old column/row and adding null spec citations (1624.059564ms)
|
||||||
|
✔ real socket awaits spec reads, record writes and cited raises; other requests still return normally (290.716934ms)
|
||||||
|
✔ real socket preserves asynchronous refusal codes and disconnects its transient proof (222.130844ms)
|
||||||
|
✔ two real socket writes to one repository yield one commit and one project-busy refusal (269.533819ms)
|
||||||
|
✔ client disconnect during await tolerates late reply (218.822322ms)
|
||||||
|
✔ client disconnect during await tolerates late refusal (225.813042ms)
|
||||||
|
✔ N-a: slow admitted record.write returns its committed result after the idle deadline (401.483325ms)
|
||||||
|
✔ current citation is recorded; docs commits do not stale it and a new spec never reopens settlement (339.280093ms)
|
||||||
|
✔ stale, unconfirmed, missing and partial spec citations refuse without inserting a decision (356.050995ms)
|
||||||
|
✔ uncited raises retain their synchronous path and spec read is available to any held role in its business (279.667657ms)
|
||||||
|
✔ record writes bind the session author, require authority and refuse spec and impersonation paths (285.573262ms)
|
||||||
|
✔ REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it (295.472839ms)
|
||||||
|
✔ REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing (374.292431ms)
|
||||||
|
✔ REQ-COS-1: a pm without message.send is refused like any other gated action (210.385711ms)
|
||||||
|
✔ REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff (479.653617ms)
|
||||||
|
✔ REQ-COS-1: the sender is judged by definition: an instance `lead` of the pm definition can ask, an instance `pm` of the coder definition can't (482.927536ms)
|
||||||
|
✔ REQ-COS-1: the launcher is judged by definition: an instance `boss` of the chief-of-staff definition receives, a `chief` of the coder definition gives no-chief-of-staff (450.42297ms)
|
||||||
|
✔ REQ-COS-1: a refused staff request leaves no staff.request action.allowed event (254.595048ms)
|
||||||
|
✔ REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient (647.518839ms)
|
||||||
|
✔ a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted (477.865241ms)
|
||||||
|
✔ REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before (268.894233ms)
|
||||||
|
✔ a business that never switched launches reads allowed with no time and no event (132.876196ms)
|
||||||
|
✔ launches revoked and then restored read allowed, with the restore time and event id (195.945942ms)
|
||||||
|
✔ a task closed on the tracker leaves the open list, and total counts the open ones (198.688975ms)
|
||||||
|
✔ a tombstone is not open (172.947387ms)
|
||||||
|
✔ the open list stops at the cap and says so; total still counts every open task (186.274275ms)
|
||||||
|
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (172.727737ms)
|
||||||
|
✔ a human session reads the same state, with the same cap (169.855179ms)
|
||||||
|
✔ reading state writes nothing: every table keeps its row count (189.504254ms)
|
||||||
|
✔ creates private WAL store and excludes a second writer until explicit close (161.411148ms)
|
||||||
|
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (226.846163ms)
|
||||||
|
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (206.813294ms)
|
||||||
|
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (192.041346ms)
|
||||||
|
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (137.891264ms)
|
||||||
|
✔ async transactions refuse before invoking their function (116.065752ms)
|
||||||
|
✔ the session default fits under the reply cap and pages to the end with next (376.404569ms)
|
||||||
|
✔ the short form: no description, assignees by role, every listed key (289.421831ms)
|
||||||
|
✔ each filter, alone and together, and total counts every match (394.213353ms)
|
||||||
|
✔ task_ref reads one task in full, as the whole board has it (318.948724ms)
|
||||||
|
✔ no arguments is the read the Console and mosaic make, unchanged (272.515029ms)
|
||||||
|
✔ an unknown argument or a bad value refuses invalid-request (957.157426ms)
|
||||||
|
✔ tasks rows carry priority and requirement for every session that reads tasks (352.078205ms)
|
||||||
|
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (379.935404ms)
|
||||||
|
✔ an empty business and one with snapshots but no task.created read cleanly (160.046072ms)
|
||||||
|
✔ recordTask keeps sync reads and a role write apart (205.095036ms)
|
||||||
|
✔ read_at must be one canonical UTC format, so the projection compares strings safely (123.53803ms)
|
||||||
|
✔ a bad entry refuses the whole record (133.874077ms)
|
||||||
|
✔ taskView reads the projection for one business (150.411466ms)
|
||||||
|
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (299.551166ms)
|
||||||
|
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (449.652036ms)
|
||||||
|
✔ without an adapter the server refuses every task verb (242.9348ms)
|
||||||
|
✔ the runtime refuses an invalid adapter and closes a valid one (249.116516ms)
|
||||||
|
✔ the process loads the S3 adapter from plain-data trackers (348.541987ms)
|
||||||
|
✔ the tester binds only when the business sets bus.tester to exactly true (964.29863ms)
|
||||||
|
✔ a business may not name a role tester, so the tester address is never a role (291.772573ms)
|
||||||
|
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (588.520152ms)
|
||||||
|
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (234.278026ms)
|
||||||
|
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (270.049444ms)
|
||||||
|
✔ the tester reads the human views a reader reads (203.121857ms)
|
||||||
|
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.236184ms)
|
||||||
|
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.372197ms)
|
||||||
|
✔ testerNonce reads only the tester's variable and gives null on any read error (0.21276ms)
|
||||||
|
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (123.82079ms)
|
||||||
|
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (943.547509ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1153.450465ms)
|
||||||
|
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (882.258139ms)
|
||||||
|
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (911.948599ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (382.17206ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1307.769388ms)
|
||||||
|
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (359.960618ms)
|
||||||
|
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3729.535273ms)
|
||||||
|
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (104.244874ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (168.788333ms)
|
||||||
|
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (165.660497ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (187.101128ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (226.645654ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (148.438178ms)
|
||||||
|
✔ REQ-USER-2: the human verbs refuse another owner's thread (156.660224ms)
|
||||||
|
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (104.914884ms)
|
||||||
|
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (160.083176ms)
|
||||||
|
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (471.541829ms)
|
||||||
|
✔ socket capability stamps launch identity; shared views use wire, no SQL client (189.90918ms)
|
||||||
|
✔ two wire claims serialize; a lost reply never automatically retries (212.518821ms)
|
||||||
|
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (145.029231ms)
|
||||||
|
✔ client preserves UTF-8 when a response divides a multibyte character (11.785606ms)
|
||||||
|
✔ committed mutation followed by dropped reply reports unknown and is never retried (162.190362ms)
|
||||||
|
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (188.086132ms)
|
||||||
|
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (201.04147ms)
|
||||||
|
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (250.268316ms)
|
||||||
|
✔ a broker with no web service refuses a granted role (166.481396ms)
|
||||||
|
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (224.937869ms)
|
||||||
|
✔ a session that is not the role holder is refused (140.410663ms)
|
||||||
|
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (422.56814ms)
|
||||||
|
✔ web.search with no search source configured is a refused result, not an error (167.173528ms)
|
||||||
|
✔ a search source that fails with its own refusal, or that throws, is handled (185.216794ms)
|
||||||
|
✔ a slow search source ends in a refusal at the deadline (222.828173ms)
|
||||||
|
✔ a secret in the arguments is refused before anything is trailed or fetched (142.058012ms)
|
||||||
|
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (265.284914ms)
|
||||||
|
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.265644ms)
|
||||||
|
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (205.398734ms)
|
||||||
|
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (171.257668ms)
|
||||||
|
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (465.66613ms)
|
||||||
|
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (177.629978ms)
|
||||||
|
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (200.391696ms)
|
||||||
|
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (171.338629ms)
|
||||||
|
ℹ tests 317
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 317
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 12956.803442
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (471.522207ms)
|
||||||
|
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (468.407737ms)
|
||||||
|
✔ the size cap refuses a push before any byte (234.304174ms)
|
||||||
|
✔ a fetch over the cap refuses before any byte reaches the reviewer (418.613822ms)
|
||||||
|
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (278.915332ms)
|
||||||
|
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (385.31584ms)
|
||||||
|
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (311.771628ms)
|
||||||
|
✔ a review of a project the business no longer has refuses unknown-project (300.581069ms)
|
||||||
|
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (220.56398ms)
|
||||||
|
✔ close() answers host-closing to a connection still sending its request line (263.301643ms)
|
||||||
|
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (657.746649ms)
|
||||||
|
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (563.723136ms)
|
||||||
|
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (603.389953ms)
|
||||||
|
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (41.271585ms)
|
||||||
|
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (548.565693ms)
|
||||||
|
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.571511ms)
|
||||||
|
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.44554ms)
|
||||||
|
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (458.496818ms)
|
||||||
|
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (395.725127ms)
|
||||||
|
✔ land: an arbiter-resolved landing's squash says the arbiter resolved it through the broker (374.613997ms)
|
||||||
|
✔ land: refusals before the gate answer the role at once and leave main and no worktree (385.512246ms)
|
||||||
|
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (354.474371ms)
|
||||||
|
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (354.936085ms)
|
||||||
|
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (355.265593ms)
|
||||||
|
ℹ tests 24
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 24
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 8841.265183
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1223.608048ms)
|
||||||
|
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (441.703173ms)
|
||||||
|
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (876.215355ms)
|
||||||
|
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3581.810518ms)
|
||||||
|
✔ a role the broker says holds a merge decision gets land_work, its prompt line and the git socket; without it, none (358.114296ms)
|
||||||
|
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (140.568931ms)
|
||||||
|
✔ a runner that stops at once ends its launch with the runner's reason (212.194641ms)
|
||||||
|
✔ a Claude Code launch with no session credential refuses before it starts (113.289691ms)
|
||||||
|
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (198.502793ms)
|
||||||
|
✔ a runner killed from the host ends its launch as killed, not failed (258.620009ms)
|
||||||
|
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (119.387455ms)
|
||||||
|
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1019.259183ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (679.220064ms)
|
||||||
|
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3628.823248ms)
|
||||||
|
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (116.098638ms)
|
||||||
|
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (110.264535ms)
|
||||||
|
✔ a launch client that never closes its side doesn't hold the host's close (117.117108ms)
|
||||||
|
✔ a runner that ignores SIGTERM is killed when the host closes (1229.351578ms)
|
||||||
|
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.152564ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14518.527374
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (5353.35591ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1592.360203ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4257.378976ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2806.766472ms)
|
||||||
|
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (50.179648ms)
|
||||||
|
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (145.530318ms)
|
||||||
|
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (177.805567ms)
|
||||||
|
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (45.3103ms)
|
||||||
|
ℹ tests 8
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 8
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 14517.987276
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
✔ sessionModel: agent vars win, then the system's execution settings (7.773791ms)
|
||||||
|
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.289075ms)
|
||||||
|
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.868116ms)
|
||||||
|
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.931942ms)
|
||||||
|
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.17696ms)
|
||||||
|
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.388808ms)
|
||||||
|
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.04359ms)
|
||||||
|
✔ the prompt names the project clones in the workspace, and none when there are none (4.15437ms)
|
||||||
|
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.125247ms)
|
||||||
|
✔ the prompt explains landing to a role with land_work, and to no other (2.459215ms)
|
||||||
|
✔ the prompt tells the pm to ask the chief of staff for sessions, and no other role (4.506136ms)
|
||||||
|
✔ a bundle is written once: an existing file refuses (0.925215ms)
|
||||||
|
✔ a path with a single quote can't go into the hook command (1.013132ms)
|
||||||
|
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (1.384804ms)
|
||||||
|
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.141717ms)
|
||||||
|
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (1.176188ms)
|
||||||
|
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.085067ms)
|
||||||
|
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (1.092107ms)
|
||||||
|
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (2.855812ms)
|
||||||
|
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.038448ms)
|
||||||
|
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (4.078183ms)
|
||||||
|
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.182927ms)
|
||||||
|
ℹ tests 22
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 22
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 130.530535
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (172.286056ms)
|
||||||
|
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (113.05041ms)
|
||||||
|
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1809.122314ms)
|
||||||
|
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (302.690861ms)
|
||||||
|
✔ land_work sends one land line and resolves the host's started answer (3.101522ms)
|
||||||
|
ℹ tests 5
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 5
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 2460.5604
|
||||||
Loaded 100 of 7703 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user