From b8b26ae4d2b440cd14959c4e792baa4b068964e4 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sat, 24 Oct 2026 11:54:51 -0500 Subject: [PATCH] Row 266: add Console room timeline and member completion --- BUILD-LOG.md | 4 + agents/fethry/work/queue-266/BUILD.md | 114 + agents/fethry/work/queue-266/MANIFEST.md | 32 + .../work/queue-266/evidence/bus-full.tap | 6088 +++++++++++++++++ .../work/queue-266/evidence/bus-rerun.tap | 6058 ++++++++++++++++ .../work/queue-266/evidence/editor-build.tap | 16 + .../work/queue-266/evidence/gate-summary.json | 63 + .../work/queue-266/evidence/plugin-green.tap | 16 + .../work/queue-266/evidence/plugin-red.tap | 28 + .../work/queue-266/evidence/plugins-full.tap | 730 ++ .../evidence/raw-log-provenance.json | 200 + .../queue-266/evidence/rerun-summary.json | 66 + .../queue-266/evidence/room-browser-final.tap | 74 + .../evidence/room-browser-final2.tap | 64 + .../queue-266/evidence/room-browser-green.tap | 72 + .../evidence/room-browser-green2.tap | 52 + .../queue-266/evidence/room-browser-red.tap | 131 + .../queue-266/evidence/room-check-green.tap | 22 + .../queue-266/evidence/room-check-red.tap | 55 + .../queue-266/evidence/room-http-final.tap | 52 + .../queue-266/evidence/room-http-green.tap | 40 + .../work/queue-266/evidence/room-http-red.tap | 127 + .../evidence/room-http-validation-red.tap | 69 + .../queue-266/evidence/scripts-summary.json | 146 + .../work/queue-266/evidence/t9-rerun-1.tap | 46 + .../work/queue-266/evidence/t9-rerun-2.tap | 46 + .../work/queue-266/evidence/t9-rerun-3.tap | 46 + .../work/queue-266/evidence/test-auth.tap | 17 + .../queue-266/evidence/test-conductor.tap | 23 + .../work/queue-266/evidence/test-config.tap | 57 + .../work/queue-266/evidence/test-discord.tap | 86 + .../evidence/test-extension-package.tap | 21 + .../evidence/test-federation-acceptance.tap | 10 + .../queue-266/evidence/test-foundation.tap | 53 + .../queue-266/evidence/test-land-work.tap | 88 + .../queue-266/evidence/test-push-check.tap | 7 + .../work/queue-266/evidence/test-queue.tap | 36 + .../work/queue-266/evidence/test-release.tap | 17 + .../work/queue-266/evidence/test-task.tap | 97 + .../work/queue-266/evidence/webui-full.tap | 2779 ++++++++ .../fethry/work/queue-266/manifest.r1.sha256 | 10 + agents/fethry/work/queue-266/mutants.py | 78 + .../fethry/work/queue-266/pin-audit-after.txt | 19 + .../work/queue-266/pin-audit-before.txt | 3 + agents/fethry/work/queue-266/run-gate.py | 41 + docs/SESSIONS.md | 1 + packages/bus/src/broker.mjs | 14 +- packages/bus/tests/room-check.test.mjs | 43 + packages/plugins/channel/webui/index.mjs | 3 + packages/plugins/tests/room-channel.test.mjs | 18 + packages/webui/src/chat-http.mjs | 51 +- packages/webui/src/chat.mjs | 3 + packages/webui/src/public/chat.css | 10 + packages/webui/src/public/chat.js | 176 +- packages/webui/tests/room-browser.test.mjs | 198 + packages/webui/tests/room-http.test.mjs | 114 + 56 files changed, 18516 insertions(+), 14 deletions(-) create mode 100644 agents/fethry/work/queue-266/BUILD.md create mode 100644 agents/fethry/work/queue-266/MANIFEST.md create mode 100644 agents/fethry/work/queue-266/evidence/bus-full.tap create mode 100644 agents/fethry/work/queue-266/evidence/bus-rerun.tap create mode 100644 agents/fethry/work/queue-266/evidence/editor-build.tap create mode 100644 agents/fethry/work/queue-266/evidence/gate-summary.json create mode 100644 agents/fethry/work/queue-266/evidence/plugin-green.tap create mode 100644 agents/fethry/work/queue-266/evidence/plugin-red.tap create mode 100644 agents/fethry/work/queue-266/evidence/plugins-full.tap create mode 100644 agents/fethry/work/queue-266/evidence/raw-log-provenance.json create mode 100644 agents/fethry/work/queue-266/evidence/rerun-summary.json create mode 100644 agents/fethry/work/queue-266/evidence/room-browser-final.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-browser-final2.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-browser-green.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-browser-green2.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-browser-red.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-check-green.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-check-red.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-http-final.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-http-green.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-http-red.tap create mode 100644 agents/fethry/work/queue-266/evidence/room-http-validation-red.tap create mode 100644 agents/fethry/work/queue-266/evidence/scripts-summary.json create mode 100644 agents/fethry/work/queue-266/evidence/t9-rerun-1.tap create mode 100644 agents/fethry/work/queue-266/evidence/t9-rerun-2.tap create mode 100644 agents/fethry/work/queue-266/evidence/t9-rerun-3.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-auth.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-conductor.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-config.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-discord.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-extension-package.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-federation-acceptance.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-foundation.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-land-work.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-push-check.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-queue.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-release.tap create mode 100644 agents/fethry/work/queue-266/evidence/test-task.tap create mode 100644 agents/fethry/work/queue-266/evidence/webui-full.tap create mode 100644 agents/fethry/work/queue-266/manifest.r1.sha256 create mode 100644 agents/fethry/work/queue-266/mutants.py create mode 100644 agents/fethry/work/queue-266/pin-audit-after.txt create mode 100644 agents/fethry/work/queue-266/pin-audit-before.txt create mode 100644 agents/fethry/work/queue-266/run-gate.py create mode 100644 packages/bus/tests/room-check.test.mjs create mode 100644 packages/plugins/tests/room-channel.test.mjs create mode 100644 packages/webui/tests/room-browser.test.mjs create mode 100644 packages/webui/tests/room-http.test.mjs diff --git a/BUILD-LOG.md b/BUILD-LOG.md index 2d261a286..f0e56795d 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -5554,3 +5554,7 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r 2026-10-24T15:55:22Z | Sage | Row 225 (#1726, C2-10b, Fethry on Codex, Dewey) LANDED 9b6345466. Before: refactor at c63801959. After: Fethry's r2 candidate c1f9dfd3c (11 commits on 963303403) cherry-picked onto c63801959. 8 commits are equal by range-diff; the other 3 differ only in the append-only log hunks, kept both sides with 0 lines removed against either parent. All 13 manifest paths match manifest.r2.sha256 (517af41b). Dewey APPROVE c31599 rev 3960; request c31600 revs 3961-3962, posted by Sage because Fethry has no token. Sage gate GREEN 15:54:58Z with its own npm ci and MOSAIC_REQUIRE_EDITOR_BUILD=1: every package suite except queue 0 fail (webui 442, library 149, bus 981, cli 988 plus the allow-listed FED R7 skip, whose runner passed 1/1), all 12 scripts rc 0. The excluded M3 timeout attempt was not counted; the unchanged retry killed cleanly. Dewey N1-N3 non-blocking: the Discord relay must pass check once it calls renderReply; the M3 hang was in the new status test's after-hook teardown; the pre-217 residual stands under sage-3669. #1726 closed c31604. Not re-pinned. 2026-10-24T16:12:35Z | Sage | Row 287 (#1792, C2-21, Steelbeak on Codex, Boyd and Dewey) LANDED 0e935776e. Before: refactor at 9b6345466. After: Steelbeak's c2338ed58 and doc follow-up a5370b198 cherry-picked onto 9b6345466. One commit equal by range-diff, the other differs only in log hunks, kept both sides. 56 manifest paths match 3683b40a. Boyd APPROVE c31602 rev 3967, Dewey APPROVE c31603 rev 3968; request c31601 revs 3965-3966 posted by Sage. Sage gate GREEN 16:11:38Z: bus 998 (Gitea Docker F-A/F-B and X-G3, minted 4, hits 0), business 283, webui 442, cli 989 plus the allowed FED R7 skip, every other suite 0 fail, all 12 scripts rc 0; fixture credential values in 0 of 29 run files with a positive control. Rulings applied: sage-4125 (library grants mint declared scopes, chief read), mos-1590 (new-test fixture fixes are the lead's call when no production code or old test changes and every fail-closed refusal keeps its own test), sage-4139 (fixture fixes) and sage-4141 (test-land-work.sh is mode 100644, run via bash). Follow-up: F-C negative, a protected Story/** rule refuses the owner too; binds the first row that needs owner pushes to a protected branch. Dewey N1-N3 non-blocking: the block's last line "can write every repository this user can write" contradicts the chief's read grant; a collaborator entry outlives a failed step 5, which still fails closed; #publishFacts would accept a library project, unreachable today. Closes Dewey's 286 r2 N2 (T7/T9 real mint). #1792 closed c31606. Not re-pinned. + +2026-10-24 | Fethry | Row266 C2-10c start (#1771), sage4154/4156. Before: Console seam/plugin only expose thread verbs; room.read omits check/last needed by225. New isolated worktree on487500a16, amended pin85e6fe2ecfc5. Plan: three fixed room calls, strict room HTTP, merged room UI and leading-@ completion, shared broker check hydration/last only under amendment1. No old tests or out-of-scope production edits; local installs/no canonical links; RED-first and serialized full webui/plugins/bus/scripts plus mutants under CLEAR. Detailed design/acceptance in agent BUILD.md. + +2026-10-24 | Fethry | Row266 implementation verified before candidate commit. Six owned production paths plus four new tests, no old tests edited. RED history and fixture corrections recorded before action. Editor build, webui458/0, plugins120/0, bus1000/0 and all12 scripts exit0. Initial bus999/1 hit old T9 50ms timer race; sage4158 authorized three unchanged credential-file6/0 reruns and whole bus1000/0 rerun, all green. Raw/normalized TAP provenance retained. Candidate/mutants/review next; no landing claim. diff --git a/agents/fethry/work/queue-266/BUILD.md b/agents/fethry/work/queue-266/BUILD.md new file mode 100644 index 000000000..5cac6b6e4 --- /dev/null +++ b/agents/fethry/work/queue-266/BUILD.md @@ -0,0 +1,114 @@ +# Row266 C2-10c — Console rooms (#1771) + +Fethry14f80e3c, branch fethry/row266, NEW worktree /home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266. +Original base962046aaa; fast-forwarded to doc-only487500a16 per sage4156. Both225 branches untouched. +Pinned amended brief85e6fe2ecfc5, C2-10c; prior3a5ed91a had identical section but stale whole-file pin. +Review order Boyd48a3ae38 then Dewey84fb346c; Sage owns landing. No token/other-seat credential access. +Slot CLEAR sage4154 lasts until returned. Local root/webui npm ci, no dependency links. +TMPDIR=/mnt/storage/scratch/tmp/KV9rHb, MOSAIC_REQUIRE_EDITOR_BUILD=1. Implementation and targeted checks complete; full gate in progress. + +## Current code and resolved seam + +- chat.mjs is the channel-gated fixed-verb seam. Add roomOpen({project}), roomRead({project,after,limit}), + roomSend({project,body}), exactly one matching room verb each. Never fetch thread.messages to hydrate rooms. +- chat-http.mjs already provides signed-in/send/Origin/Fetch Metadata, bounded JSON, strict keys, safe + error text, audit and outcome-unknown handling. Extend it with POST rooms/PROJECT/open {}, + GET rooms/PROJECT/messages ?after&limit, POST same messages {body}. Four room codes map409 and fixed lines. + Open returns {project,threads}; send returns {ids,to}; read returns {rows,after,hasMore,at}. + Room cursor is the LAST id in the final entry.ids, not the first entry.id; the broker groups human sends. +- webui plugin needs exactly room.open/read/send in its allowlist, still rejecting arbitrary verbs. +- /api/chat/instances already returns threaded instance keys and persona.name labels. No serve.mjs edit. +- room.open returns canonical member threads; room.read returns one merged human entry with ids/to. + Read-only GET must never open/create a room or wake an agent. No implicit retry of any write. +- Amendment1 (sage4156): broker.mjs is owned only for shared check-event hydration and routing room.read + through #withLast under the same condition as thread.messages. The missing check would otherwise + hide badges AND reopen225's forged-notice defect. No other broker verb/refusal/field changes. + +## Design and implementation plan + +1. New plugin, HTTP/seam, bus metadata and browser files first; run whole new files RED, report + first-run results per mos1272/1590, correct only demonstrably wrong NEW fixtures. No old test edits. +2. Add the three plugin/seam calls and strict HTTP room routes/receipt validation. Reuse existing + principal/write fences. Owner room verbs stay human-only; hide controls from granted users/testers, + and never route a call through an owner transport for them. +3. In broker, extract #withCheck(row), call it for thread messages and each final merged room entry; + extend the existing last-routing condition to room.read. Test real checked reply parity, unchecked + absence and unchanged merged human entry across two members. No broker room.open/send changes. +4. Add /chat/rooms/PROJECT route inside chat.js, sharing its current state, generation/abort handling, + capture/paint/scroll preservation and225 message renderer. Project view gets explicit Open room; + direct room GET only reads and offers Open on room-not-open. Names come from instances catalog, + membership from canonical room threads, with server room.read authoritative. Quiet members stay + available for completion. Human entries display once, with all broker addressees; no client regrouping. +5. Completion parses leading @ tokens with the exact broker grammar and its existing case vectors. + Display typed tags in a preview; use that production tag reader for completion and browser parity. + Suggest members by instance/name, insert the stable instance token, preserve unrelated text/caret. + Arrow keys/Enter/Tab/Escape and click work; labels/text remain escaped and bidi/control inert. + Browser sends original typed body, never a client-selected addressee list. Broker409 lines are fixed. +6. Whole webui/plugins/bus (touched) suites, all12 scripts/test-*.sh under timeout -k10, then isolated + mutants. No live-provider calls (MOSAIC_LIVE_PROVIDER unset). New worker/temp process groups get + killpg cleanup and cwd/Chromium sweep; never touch another seat's processes. Record every red. +7. Hash-pin audit by source path AND old64-hex digest for chat.js/chat-http.mjs/channel module before + in-review. Freeze manifest, push fethry/* only, owner queue move in-review, handoff Boyd+Sage with + candidate/digest; Sage posts because this seat has no Gitea token. No force push, merge or deploy. + +Acceptance focus: grouped paging cursor, one entry for a broadcast even across two threads, quiet +member completion and parser parity, checked reply badges/notice safety, malformed receipts/unknown +outcomes,4 refusal codes, no read-side mutation, late reads/sign-out and project draft isolation. + +Boundary rules: old-test red, any production path beyond the owned set/amendment, or weakened +assertion goes to Sage BEFORE action. New-file first red is reported then fixture corrected. + +## Targeted RED/GREEN receipts (2026-10-24) + +Start op fethry-266-start succeeded rev3978 after sage4156's re-pin; old-pin refusal wrote nothing. +First whole NEW files RED: plugin0/1,HTTP0/5,bus1/1,browser0/7, all intended missing-feature paths; +reported fethry0028 before production. Component GREEN plugin1/0,HTTP5/0,bus2/0. Browser5/2 exposed a +missing submit branch in our new room event dispatcher; reported fethry0029, fixed only that branch, +then browser7/0. No fixture/assertion changed to fix production behavior. + +Boundary coverage added before full gate: malformed numeric member key was accepted by regex +coercion (new HTTP6/1, fethry0030); required string and unique group ids/addressees, now HTTP7/0. +New browser assertions use fresh send ids and read back exactly one broadcast entry. Expanded run8/1 +exposed a nested quote in our new runtime CSS selector; reported fethry0031 BEFORE fixing fixture +with JSON.stringify, same exact count=1 assertion retained. Final browser9/0,4864.326ms, with quiet +member Arrow/Tab/Escape, raw body preservation, no duplicate pending send, uncertain draft, parser +vectors, all4 refusal lines, checked reply/cite/notice safety and late-read/sign-out coverage. +No pre-existing test/helper edit and no assertion loosened. Production set is precisely six brief- +owned paths including the narrow broker amendment. All red/green raw logs under unique TMPDIR. + +Full gate now runs run-gate.py: local editor build, whole webui/plugins/bus then all12 test scripts, +serial timeout -k10, per-test30s, MOSAIC_REQUIRE_EDITOR_BUILD=1; live-provider env removed. Each step +has its own process group and killpg cleanup, with signals recorded. Any failure stops for report. + +## Full gate first pass + +Editor build exit0; whole webui458/0 (270.066s), plugins120/0 (.866s), no skips/cancels. +Bus999/1 (132.9s): OLD library-credential.test.mjs T9 at317 expected library-fetch-no-grant, +received library-sync-busy. Reported fethry0032 before changes. No old test/source change. +Read-only diagnosis: fixture starts a50ms periodic sync; waiting for a completed log does not +prevent the next tick from acquiring running(mirror) before the manual sync. Existing sync.mjs140 +checks running before credential refusal. Row266 touches neither timer nor sync implementation. +All12 scripts continue independently; rerun/ruling requested from Sage. Raw bus-full.tap and +gate-summary.json remain in the scratch directory, preserving the red evidence. + +Sage4158 confirms the pre-existing50ms T9 timer race and authorizes three unchanged whole-file +credential runs followed by one unchanged whole bus run. Any recurring T9 red stops for Sage; +no fixture or production patch is authorized. The12-script runner proceeds serially first. + +All12 scripts/test-*.sh exited0 (scripts-summary.json). Queue's156 tests pass; wrapper28/0 +and explicitly skips canonical queue verify/render checks in an isolated worktree. Task92/0 +uses existing row244 live-provider exclusions, with MOSAIC_LIVE_PROVIDER unset. No script edited. +Three unchanged whole credential-file reruns under sage4158 each pass6/0 without skips/cancels, +1.367s each wall clock. Full unchanged bus rerun is next/running. + +Pin audit before in-review: source paths/basenames and old/current64hex values for chat.js, +chat-http.mjs and channel/webui/index.mjs searched across package/script tests. No literal old +or current digest pin. The10 frozen package hashes include all six production paths and four +new test files; no existing test diff. sha256sum -c passes on all10. + +Unchanged full bus rerun GREEN1000/0, no skips/cancels,142.919s. T9 passes. This completes +sage4158's four unchanged green reruns (credential6/0 three times, bus1000/0 once) after the +initial999/1. Preserve all five TAPs. Pre-existing T9 timer race is Sage's follow-up, no source +or old test changed for it. Full applicable suites and12 scripts are green; mutants next. +Evidence display copies strip trailing whitespace only; raw-log-provenance.json records original +paths and both digests. All10 package hashes remain unchanged from full-suite verification. diff --git a/agents/fethry/work/queue-266/MANIFEST.md b/agents/fethry/work/queue-266/MANIFEST.md new file mode 100644 index 000000000..0103a7e27 --- /dev/null +++ b/agents/fethry/work/queue-266/MANIFEST.md @@ -0,0 +1,32 @@ +# Row266 review packet — Console rooms (#1771) + +Owner Fethry14f80e3c; first reviewer Boyd48a3ae38, second Dewey84fb346c. +Base487500a16, pinned amended brief85e6fe2ecfc5. Sage owns gate and landing. + +The owner Console has an explicit Open room action and a merged project timeline. Human broadcasts +show once with the broker's addressees; agent rows use the shared225 reply renderer including stored +check metadata, badges, changed-file labels and safe notices. Completion suggests quiet and active room +members and follows the broker's leading-tag grammar. The original body goes to room.send. + +The seam has exactly three room calls, and no thread.messages fanout. Four room refusals map to409 +with fixed lines. Read-only routes never open rooms. Writes retain existing authority/Origin fences, +strict arguments, receipt validation, draft preservation and no automatic retry after uncertainty. + +manifest.r1.sha256 freezes exactly10 package paths: six production files and four NEW test files. +No pre-existing test is edited. Check with sha256sum -c from the repository root. The only brief +amendment is sage4156's narrow broker helper/check/last hydration for room.read; room.open/send and +other broker fields/refusals remain unchanged. Other changes are append-only session/build records +and this tracking packet. No queue JSON, role, policy, secret or generated editor asset changes. + +Evidence and RED/GREEN history are in BUILD.md. Full suites and scripts are green; isolated mutants are next. The initial +full bus999/1 is the pre-existing T9 timer race, reported before action; unchanged reruns authorized +by sage4158 all pass: credential6/0 three times, bus1000/0 once. Webui458/0, plugins120/0, +all12 scripts exit0. Queue wrapper skips canonical-only verify/render, and task retains the +row244 live-provider exclusions. No test-runner skips/cancellations in package suites. Review must consider every run, including the red. + +Pin audit: pin-audit-before.txt and pin-audit-after.txt search source paths/basenames and64-hex old +and new digests across tests. No literal digest pin needs updating for any of the three named files. + +Review focus: grouped paging cursor, no body-based client regrouping, quiet membership/completion, +raw body preservation, checked/unchecked renderer trust, grant/tester refusal, pending/uncertain writes, +late reads/sign-out and strictly scoped broker hydration. diff --git a/agents/fethry/work/queue-266/evidence/bus-full.tap b/agents/fethry/work/queue-266/evidence/bus-full.tap new file mode 100644 index 000000000..1cf5e7f61 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/bus-full.tap @@ -0,0 +1,6088 @@ +TAP version 13 +# Subtest: R4: the timer sweep after a hand edit ends only the lost user's run; its next call refuses thread-revoked +ok 1 - R4: the timer sweep after a hand edit ends only the lost user's run; its next call refuses thread-revoked + --- + duration_ms: 32.925075 + type: 'test' + ... +# Subtest: R4: an expiry with no write and no request ends the run at the next timer sweep +ok 2 - R4: an expiry with no write and no request ends the run at the next timer sweep + --- + duration_ms: 24.211594 + type: 'test' + ... +# Subtest: R4: a downgrade to viewer is a loss +ok 3 - R4: a downgrade to viewer is a loss + --- + duration_ms: 22.290856 + type: 'test' + ... +# Subtest: R4: another user's request after a hand edit ends the lost user's run, and its own run stays +ok 4 - R4: another user's request after a hand edit ends the lost user's run, and its own run stays + --- + duration_ms: 24.426887 + type: 'test' + ... +# Subtest: R4: a request reads the access file only when its stamp changed, once per change +ok 5 - R4: a request reads the access file only when its stamp changed, once per change + --- + duration_ms: 21.371476 + type: 'test' + ... +# Subtest: R4: access.reload ends the lost runs at once for the human; the tester, a reader, an agent and a user are refused +ok 6 - R4: access.reload ends the lost runs at once for the human; the tester, a reader, an agent and a user are refused + --- + duration_ms: 26.000921 + type: 'test' + ... +# Subtest: R4: threadsState marks revoked: true on the lost user's thread only, a pending message included +ok 7 - R4: threadsState marks revoked: true on the lost user's thread only, a pending message included + --- + duration_ms: 17.362727 + type: 'test' + ... +# Subtest: R4: threadsState after an expiry with no write and no sweep ends the claim before it marks the row revoked +ok 8 - R4: threadsState after an expiry with no write and no sweep ends the claim before it marks the row revoked + --- + duration_ms: 22.89471 + type: 'test' + ... +# Subtest: R4: a new run of a revoked thread refuses thread-revoked at bind and at claim; a rebind is allowed +ok 9 - R4: a new run of a revoked thread refuses thread-revoked at bind and at claim; a rebind is allowed + --- + duration_ms: 19.574612 + type: 'test' + ... +# Subtest: R4 runtime: a hand edit ends the run at the first timer period, intervalMs is checked, and close stops the timer +ok 10 - R4 runtime: a hand edit ends the run at the first timer period, intervalMs is checked, and close stops the timer + --- + duration_ms: 52.965856 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes +ok 11 - REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes + --- + duration_ms: 85.878109 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact +ok 12 - REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact + --- + duration_ms: 107.455209 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was +ok 13 - REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 87.737408 + type: 'test' + ... +# Subtest: parseAddress: one +ok 14 - parseAddress: one + --- + duration_ms: 1.166351 + type: 'test' + ... +# Subtest: parseAddress: many +ok 15 - parseAddress: many + --- + duration_ms: 0.11521 + type: 'test' + ... +# Subtest: parseAddress: repeat +ok 16 - parseAddress: repeat + --- + duration_ms: 0.094787 + type: 'test' + ... +# Subtest: parseAddress: plain +ok 17 - parseAddress: plain + --- + duration_ms: 0.087336 + type: 'test' + ... +# Subtest: parseAddress: stop +ok 18 - parseAddress: stop + --- + duration_ms: 0.09396 + type: 'test' + ... +# Subtest: parseAddress: EOF tag +ok 19 - parseAddress: EOF tag + --- + duration_ms: 0.087217 + type: 'test' + ... +# Subtest: parseAddress: EOF last tag +ok 20 - parseAddress: EOF last tag + --- + duration_ms: 0.085734 + type: 'test' + ... +# Subtest: parseAddress: leading whitespace +ok 21 - parseAddress: leading whitespace + --- + duration_ms: 0.076031 + type: 'test' + ... +# Subtest: parseAddress: tags only +ok 22 - parseAddress: tags only + --- + duration_ms: 0.098139 + type: 'test' + ... +# Subtest: parseAddress: empty +ok 23 - parseAddress: empty + --- + duration_ms: 0.182573 + type: 'test' + ... +# Subtest: parseAddress: whitespace +ok 24 - parseAddress: whitespace + --- + duration_ms: 0.083703 + type: 'test' + ... +# Subtest: parseAddress: bare at +ok 25 - parseAddress: bare at + --- + duration_ms: 0.062182 + type: 'test' + ... +# Subtest: parseAddress: punctuation is a name +ok 26 - parseAddress: punctuation is a name + --- + duration_ms: 0.047429 + type: 'test' + ... +# Subtest: parseAddress rejects non-text without coercion +ok 27 - parseAddress rejects non-text without coercion + --- + duration_ms: 0.295263 + type: 'test' + ... +# Subtest: the mounted address parser has no import dependency +ok 28 - the mounted address parser has no import dependency + --- + duration_ms: 0.228106 + type: 'test' + ... +# Subtest: agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged +ok 29 - agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged + --- + duration_ms: 31.976348 + type: 'test' + ... +# Subtest: agents: working counts what the holder received and has not read; routed alone is not working +ok 30 - agents: working counts what the holder received and has not read; routed alone is not working + --- + duration_ms: 21.380946 + type: 'test' + ... +# Subtest: agents: input needed is the role's open decisions routed to the human, gated first, then oldest +ok 31 - agents: input needed is the role's open decisions routed to the human, gated first, then oldest + --- + duration_ms: 34.825295 + type: 'test' + ... +# Subtest: agents: working wins over waiting, and Input needed still shows +ok 32 - agents: working wins over waiting, and Input needed still shows + --- + duration_ms: 17.078861 + type: 'test' + ... +# Subtest: agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role +ok 33 - agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role + --- + duration_ms: 17.888872 + type: 'test' + ... +# Subtest: agents: state reads only its own business, even for a run name both use +ok 34 - agents: state reads only its own business, even for a run name both use + --- + duration_ms: 16.691526 + type: 'test' + ... +# Subtest: agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it +ok 35 - agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it + --- + duration_ms: 19.654642 + type: 'test' + ... +# Subtest: agents: a message the holder read is not stranded; one the current holder has not read is not listed +ok 36 - agents: a message the holder read is not stranded; one the current holder has not read is not listed + --- + duration_ms: 18.096326 + type: 'test' + ... +# Subtest: agents: stranded is oldest first and capped at 50 for a role +ok 37 - agents: stranded is oldest first and capped at 50 for a role + --- + duration_ms: 78.939463 + type: 'test' + ... +# Subtest: agents: stranded is per role and per business +ok 38 - agents: stranded is per role and per business + --- + duration_ms: 31.207314 + type: 'test' + ... +# Subtest: agents: a message routed to a held role and not yet received is not stranded +ok 39 - agents: a message routed to a held role and not yet received is not stranded + --- + duration_ms: 12.676817 + type: 'test' + ... +# Subtest: REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once +ok 40 - REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once + --- + duration_ms: 34.171947 + type: 'test' + ... +# Subtest: REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing +ok 41 - REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing + --- + duration_ms: 20.738776 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread +ok 42 - REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread + --- + duration_ms: 24.418512 + type: 'test' + ... +# Subtest: REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot +ok 43 - REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot + --- + duration_ms: 21.593743 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread +ok 44 - REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread + --- + duration_ms: 22.524725 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run +ok 45 - REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run + --- + duration_ms: 29.641213 + type: 'test' + ... +# Subtest: launch identity is stamped, payload identity is refused and stale holder cannot send +ok 46 - launch identity is stamped, payload identity is refused and stale holder cannot send + --- + duration_ms: 22.887411 + type: 'test' + ... +# Subtest: decision classes route from policy; gated resolution is human-only, choice and target must match +ok 47 - decision classes route from policy; gated resolution is human-only, choice and target must match + --- + duration_ms: 22.491737 + type: 'test' + ... +# Subtest: claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic +ok 48 - claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic + --- + duration_ms: 25.49036 + type: 'test' + ... +# Subtest: launch events require a human CLI capability; generic emit cannot forge authority events +ok 49 - launch events require a human CLI capability; generic emit cannot forge authority events + --- + duration_ms: 15.439423 + type: 'test' + ... +# Subtest: within-role decisions close atomically and invalid options or blocking omissions refuse +ok 50 - within-role decisions close atomically and invalid options or blocking omissions refuse + --- + duration_ms: 16.021073 + type: 'test' + ... +# Subtest: a recommendation that is not exactly one option key refuses invalid-recommendation after the options +ok 51 - a recommendation that is not exactly one option key refuses invalid-recommendation after the options + --- + duration_ms: 23.924179 + type: 'test' + ... +# Subtest: observer capabilities read human inbox but cannot mutate or forge launch identity +ok 52 - observer capabilities read human inbox but cannot mutate or forge launch identity + --- + duration_ms: 16.003241 + type: 'test' + ... +# Subtest: task action subjects and linked decision trail are complete and ordered +ok 53 - task action subjects and linked decision trail are complete and ordered + --- + duration_ms: 22.896834 + type: 'test' + ... +# Subtest: launch binding is durable and reconnecting requires the identical trusted record +ok 54 - launch binding is durable and reconnecting requires the identical trusted record + --- + duration_ms: 12.212354 + type: 'test' + ... +# Subtest: business isolation includes inherited object names and cross-business message references +ok 55 - business isolation includes inherited object names and cross-business message references + --- + duration_ms: 18.837054 + type: 'test' + ... +# Subtest: authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it +ok 56 - authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it + --- + duration_ms: 24.967449 + type: 'test' + ... +# Subtest: task projection uses schema current view, skipping earlier and equal-start polls +ok 57 - task projection uses schema current view, skipping earlier and equal-start polls + --- + duration_ms: 14.029375 + type: 'test' + ... +# Subtest: revocation permanently bars the old run from reclaiming first, including after broker restart +ok 58 - revocation permanently bars the old run from reclaiming first, including after broker restart + --- + duration_ms: 20.188915 + type: 'test' + ... +# Subtest: empty message references refuse before storage; refusal-evidence failure stays a typed error +ok 59 - empty message references refuse before storage; refusal-evidence failure stays a typed error + --- + duration_ms: 13.557538 + type: 'test' + ... +# Subtest: both arbiters require human resolution when their cross-role route is themselves +ok 60 - both arbiters require human resolution when their cross-role route is themselves + --- + duration_ms: 24.712024 + type: 'test' + ... +# Subtest: the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role +ok 61 - the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role + --- + duration_ms: 20.420921 + type: 'test' + ... +# Subtest: S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input +ok 62 - S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input + --- + duration_ms: 1.311548 + type: 'test' + ... +# Subtest: channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller +ok 63 - channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller + --- + duration_ms: 0.918328 + type: 'test' + ... +# Subtest: channel recovery still requires the same shim path and rejects an absent or forged proof +ok 64 - channel recovery still requires the same shim path and rejects an absent or forged proof + --- + duration_ms: 402.225428 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged +ok 65 - REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged + --- + duration_ms: 45.880926 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke +ok 66 - REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke + --- + duration_ms: 27.518936 + type: 'test' + ... +# Subtest: REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither +ok 67 - REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither + --- + duration_ms: 20.565138 + type: 'test' + ... +# Subtest: REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path +ok 68 - REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path + --- + duration_ms: 19.827103 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason +ok 69 - REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason + --- + duration_ms: 24.160497 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a reason is required, bounded, and never sent with a decision +ok 70 - REQ-ROLE-2: a reason is required, bounded, and never sent with a decision + --- + duration_ms: 24.397036 + type: 'test' + ... +# Subtest: REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run +ok 71 - REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run + --- + duration_ms: 26.521044 + type: 'test' + ... +# Subtest: REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor +ok 72 - REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor + --- + duration_ms: 20.083199 + type: 'test' + ... +# Subtest: REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set +ok 73 - REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set + --- + duration_ms: 27.59168 + type: 'test' + ... +# Subtest: REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change +ok 74 - REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change + --- + duration_ms: 29.837135 + type: 'test' + ... +# Subtest: REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys +ok 75 - REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys + --- + duration_ms: 32.033219 + type: 'test' + ... +# Subtest: REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing +ok 76 - REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing + --- + duration_ms: 26.255403 + type: 'test' + ... +# Subtest: REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change +ok 77 - REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change + --- + duration_ms: 28.77161 + type: 'test' + ... +# Subtest: REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused +ok 78 - REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused + --- + duration_ms: 86.563499 + type: 'test' + ... +# Subtest: REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused +ok 79 - REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused + --- + duration_ms: 76.13557 + type: 'test' + ... +# Subtest: Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused +ok 80 - Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused + --- + duration_ms: 76.114062 + type: 'test' + ... +# Subtest: row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief +ok 81 - row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief + --- + duration_ms: 55.23098 + type: 'test' + ... +# Subtest: REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused +ok 82 - REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused + --- + duration_ms: 72.756997 + type: 'test' + ... +# Subtest: row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing +ok 83 - row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing + --- + duration_ms: 20.742541 + type: 'test' + ... +# Subtest: row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run +ok 84 - row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run + --- + duration_ms: 21.842035 + type: 'test' + ... +# Subtest: row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not +ok 85 - row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not + --- + duration_ms: 21.612424 + type: 'test' + ... +# Subtest: row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer +ok 86 - row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer + --- + duration_ms: 27.15835 + type: 'test' + ... +# Subtest: row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer +ok 87 - row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer + --- + duration_ms: 24.909681 + type: 'test' + ... +# Subtest: row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it +ok 88 - row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it + --- + duration_ms: 22.154063 + type: 'test' + ... +# Subtest: row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own +ok 89 - row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own + --- + duration_ms: 19.785109 + type: 'test' + ... +# Subtest: row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key +ok 90 - row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key + --- + duration_ms: 31.839114 + type: 'test' + ... +# Subtest: row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions +ok 91 - row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions + --- + duration_ms: 29.702504 + type: 'test' + ... +# Subtest: row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer +ok 92 - row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer + --- + duration_ms: 42.459729 + type: 'test' + ... +# Subtest: row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name +ok 93 - row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name + --- + duration_ms: 24.586444 + type: 'test' + ... +# Subtest: row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't +ok 94 - row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't + --- + duration_ms: 740.96676 + type: 'test' + ... +# Subtest: row 194 T8b: a hire without the role files configured refuses not-configured +ok 95 - row 194 T8b: a hire without the role files configured refuses not-configured + --- + duration_ms: 21.146816 + type: 'test' + ... +# Subtest: row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs +ok 96 - row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs + --- + duration_ms: 22.95559 + type: 'test' + ... +# Subtest: row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses +ok 97 - row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses + --- + duration_ms: 26.520786 + type: 'test' + ... +# Subtest: row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone +ok 98 - row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone + --- + duration_ms: 25.992062 + type: 'test' + ... +# Subtest: row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once +ok 99 - row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once + --- + duration_ms: 25.327913 + type: 'test' + ... +# Subtest: row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it +ok 100 - row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it + --- + duration_ms: 25.868602 + type: 'test' + ... +# Subtest: row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it +ok 101 - row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it + --- + duration_ms: 23.134827 + type: 'test' + ... +# Subtest: row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer +ok 102 - row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer + --- + duration_ms: 19.327491 + type: 'test' + ... +# Subtest: row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable +ok 103 - row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable + --- + duration_ms: 19.103054 + type: 'test' + ... +# Subtest: row 194 T18: hire and fire take only their own keys, and a refused call writes nothing +ok 104 - row 194 T18: hire and fire take only their own keys, and a refused call writes nothing + --- + duration_ms: 26.348777 + type: 'test' + ... +# Subtest: row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone +ok 105 - row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone + --- + duration_ms: 67.891285 + type: 'test' + ... +# Subtest: row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing +ok 106 - row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing + --- + duration_ms: 24.081036 + type: 'test' + ... +# Subtest: C2-06 held library lock gives the agent citation-unavailable and its retry reason +ok 107 - C2-06 held library lock gives the agent citation-unavailable and its retry reason + --- + duration_ms: 5141.410558 + type: 'test' + ... +# Subtest: C2-06 malformed sync state is availability failure, never a fabricated invalid cite +ok 108 - C2-06 malformed sync state is availability failure, never a fabricated invalid cite + --- + duration_ms: 31.758138 + type: 'test' + ... +# Subtest: C2-06 no mirror or freshly initialized empty mirror still means no served citation +ok 109 - C2-06 no mirror or freshly initialized empty mirror still means no served citation + --- + duration_ms: 31.412882 + type: 'test' + ... +# Subtest: C2-06 coder send_message guard covers every table refusal; inserts nothing +ok 110 - C2-06 coder send_message guard covers every table refusal; inserts nothing + --- + duration_ms: 106.164133 + type: 'test' + ... +# Subtest: C2-06 research send_message guard covers every table refusal; inserts nothing +ok 111 - C2-06 research send_message guard covers every table refusal; inserts nothing + --- + duration_ms: 90.688666 + type: 'test' + ... +# Subtest: C2-06 stored check carries the file author trailer at an unrelated cited tip +ok 112 - C2-06 stored check carries the file author trailer at an unrelated cited tip + --- + duration_ms: 57.316191 + type: 'test' + ... +# Subtest: C2-06 supporting cite cannot state canon, including a folder also marked playground +ok 113 - C2-06 supporting cite cannot state canon, including a folder also marked playground + --- + duration_ms: 41.129171 + type: 'test' + ... +# Subtest: C2-06 supporting file stores supporting scope and its real agent trailer +ok 114 - C2-06 supporting file stores supporting scope and its real agent trailer + --- + duration_ms: 47.808502 + type: 'test' + ... +# Subtest: C2-06 check evidence and insert are atomic when storing evidence fails +ok 115 - C2-06 check evidence and insert are atomic when storing evidence fails + --- + duration_ms: 40.272671 + type: 'test' + ... +# Subtest: C2-06 live limits change both directions; unreadable file keeps checks and exact fixed texts +ok 116 - C2-06 live limits change both directions; unreadable file keeps checks and exact fixed texts + --- + duration_ms: 53.659135 + type: 'test' + ... +# Subtest: C2-06 page store is session-local, caps 20 fetches and 200 KiB, drops at disconnect +ok 117 - C2-06 page store is session-local, caps 20 fetches and 200 KiB, drops at disconnect + --- + duration_ms: 83.503429 + type: 'test' + ... +# Subtest: C2-06 transport passes safe capped guard reason; ordinary refusal envelope is byte-identical +ok 118 - C2-06 transport passes safe capped guard reason; ordinary refusal envelope is byte-identical + --- + duration_ms: 53.17408 + type: 'test' + ... +# Subtest: C2-06 non-library businesses retain role.claim shape and unguarded free sends +ok 119 - C2-06 non-library businesses retain role.claim shape and unguarded free sends + --- + duration_ms: 25.180872 + type: 'test' + ... +# Subtest: C2-06 thread messages carry file/last evidence with one read per distinct path +ok 120 - C2-06 thread messages carry file/last evidence with one read per distinct path + --- + duration_ms: 76.590733 + type: 'test' + ... +# Subtest: C2-06 guarded request snapshot cannot change between check and insert +ok 121 - C2-06 guarded request snapshot cannot change between check and insert + --- + duration_ms: 24.315507 + type: 'test' + ... +# Subtest: C2-06 library.limits.set is human-only and invalid settings leave file and receipts unchanged +ok 122 - C2-06 library.limits.set is human-only and invalid settings leave file and receipts unchanged + --- + duration_ms: 40.535061 + type: 'test' + ... +# Subtest: C2-06 runtime reads changed and unreadable reply limits without restarting +ok 123 - C2-06 runtime reads changed and unreadable reply limits without restarting + --- + duration_ms: 111.95279 + type: 'test' + ... +# Subtest: comment cursors isolate businesses, move only forward and remain append-only +ok 124 - comment cursors isolate businesses, move only forward and remain append-only + --- + duration_ms: 15.712309 + type: 'test' + ... +# Subtest: only trusted sync writes validated cursors; events and cursor share rollback +ok 125 - only trusted sync writes validated cursors; events and cursor share rollback + --- + duration_ms: 12.54346 + type: 'test' + ... +# Subtest: explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates +ok 126 - explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates + --- + duration_ms: 65.418772 + type: 'test' + ... +# Subtest: migration refuses active writers and drifted legacy schemas, with no partial upgrade +ok 127 - migration refuses active writers and drifted legacy schemas, with no partial upgrade + --- + duration_ms: 83.834951 + type: 'test' + ... +# Subtest: named migration registry chains 3b through 3g to a fixture-only future version in order +ok 128 - named migration registry chains 3b through 3g to a fixture-only future version in order + --- + duration_ms: 88.561297 + type: 'test' + ... +# Subtest: migration refuses mismatched source metadata without changing schema or evidence +ok 129 - migration refuses mismatched source metadata without changing schema or evidence + --- + duration_ms: 31.822265 + type: 'test' + ... +# Subtest: offline command migrates only the supplied fixture root and reports usage errors +ok 130 - offline command migrates only the supplied fixture root and reports usage errors + --- + duration_ms: 167.082726 + type: 'test' + ... +# Subtest: N4: the console verbs are exactly the preview and the console resolve, and decision.resolve is not one +ok 131 - N4: the console verbs are exactly the preview and the console resolve, and decision.resolve is not one + --- + duration_ms: 1.142915 + type: 'test' + ... +# Subtest: bindConsole takes only the business human and a three-string owner subject +ok 132 - bindConsole takes only the business human and a three-string owner subject + --- + duration_ms: 38.363956 + type: 'test' + ... +# Subtest: J1, Q188: only a console cap reaches the console verbs, and a console cap reaches nothing else +ok 133 - J1, Q188: only a console cap reaches the console verbs, and a console cap reaches nothing else + --- + duration_ms: 37.233195 + type: 'test' + ... +# Subtest: preview: the two real answers, a grant summary and the digest, for an open grant request only +ok 134 - preview: the two real answers, a grant summary and the digest, for an open grant request only + --- + duration_ms: 26.942683 + type: 'test' + ... +# Subtest: J1, J2: a decision that is not an eligible grant request refuses both console verbs +ok 135 - J1, J2: a decision that is not an eligible grant request refuses both console verbs + --- + duration_ms: 32.526586 + type: 'test' + ... +# Subtest: N2, J13: a Console approve records via console and the owner, before the executor starts, and the grant runs once +ok 136 - N2, J13: a Console approve records via console and the owner, before the executor starts, and the grant runs once + --- + duration_ms: 100.03468 + type: 'test' + ... +# Subtest: J15: a Console deny closes with the other key and starts nothing +ok 137 - J15: a Console deny closes with the other key and starts nothing + --- + duration_ms: 127.310162 + type: 'test' + ... +# Subtest: J2: approve and deny come from approvalChoice and the options, not a fixed yes and no +ok 138 - J2: approve and deny come from approvalChoice and the options, not a fixed yes and no + --- + duration_ms: 152.96647 + type: 'test' + ... +# Subtest: J11: a stale digest or a key outside the two refuses decision-stale and writes nothing +ok 139 - J11: a stale digest or a key outside the two refuses decision-stale and writes nothing + --- + duration_ms: 33.394745 + type: 'test' + ... +# Subtest: J14: a via console close with no matching human.input approves nothing +ok 140 - J14: a via console close with no matching human.input approves nothing + --- + duration_ms: 38.886913 + type: 'test' + ... +# Subtest: recordEvent keeps human.input reserved, so no agent forges a console answer +ok 141 - recordEvent keeps human.input reserved, so no agent forges a console answer + --- + duration_ms: 23.620557 + type: 'test' + ... +# Subtest: J7: a console proof over the socket binds a cap for its one call and the reply releases it +ok 142 - J7: a console proof over the socket binds a cap for its one call and the reply releases it + --- + duration_ms: 78.648427 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: M6: a creative raise refuses decision-not-allowed, cited or not, and no decision row appears; the assistant still raises +ok 143 - M6: a creative raise refuses decision-not-allowed, cited or not, and no decision row appears; the assistant still raises + --- + duration_ms: 36.764965 + type: 'test' + ... +# Subtest: a creative instance sends only to the user and hears only from the user +ok 144 - a creative instance sends only to the user and hears only from the user + --- + duration_ms: 43.517859 + type: 'test' + ... +# Subtest: M10 through the broker: the chief and the tester are refused on bean, the human's limits.set of its models key works +ok 145 - M10 through the broker: the chief and the tester are refused on bean, the human's limits.set of its models key works + --- + duration_ms: 77.902297 + type: 'test' + ... +# Subtest: row 256 T6 the human deletes a creative instance through the broker; the chief and the tester are refused at the verb +ok 146 - row 256 T6 the human deletes a creative instance through the broker; the chief and the tester are refused at the verb + --- + duration_ms: 58.050149 + type: 'test' + ... +# Subtest: X4: register adds a store reference to the running bus, and issue then writes the key +ok 147 - X4: register adds a store reference to the running bus, and issue then writes the key + --- + duration_ms: 12.682165 + type: 'test' + ... +# Subtest: X4: register runs the constructor's reference checks +ok 148 - X4: register runs the constructor's reference checks + --- + duration_ms: 0.652811 + type: 'test' + ... +# Subtest: X4: register reads no file, so a key file left at the path stays unused, and a live token refuses +ok 149 - X4: register reads no file, so a key file left at the path stays unused, and a live token refuses + --- + duration_ms: 8.274522 + type: 'test' + ... +# Subtest: X3, X4: unregister drops an entry with no token and refuses one with a live token +ok 150 - X3, X4: unregister drops an entry with no token and refuses one with a live token + --- + duration_ms: 7.67295 + type: 'test' + ... +# Subtest: X5: a claim holds the slot, so a second claim and a host.run refuse host-busy until release +ok 151 - X5: a claim holds the slot, so a second claim and a host.run refuse host-busy until release + --- + duration_ms: 4.608332 + type: 'test' + ... +# Subtest: X5: a claim made while a host.run is in flight refuses host-busy +ok 152 - X5: a claim made while a host.run is in flight refuses host-busy + --- + duration_ms: 4.400103 + type: 'test' + ... +# Subtest: X5: a stale release leaves a later claim in place +ok 153 - X5: a stale release leaves a later claim in place + --- + duration_ms: 0.374338 + type: 'test' + ... +# Subtest: X5: abortClaim aborts a live claim and says pending, and revoke's abort reaches a claim too +ok 154 - X5: abortClaim aborts a live claim and says pending, and revoke's abort reaches a claim too + --- + duration_ms: 5.100625 + type: 'test' + ... +# Subtest: credentials gives human and reader sessions service, account, role, date and state, and nothing else +ok 155 - credentials gives human and reader sessions service, account, role, date and state, and nothing else + --- + duration_ms: 17.140395 + type: 'test' + ... +# Subtest: credentials refuses a role session and any argument +ok 156 - credentials refuses a role session and any argument + --- + duration_ms: 15.365981 + type: 'test' + ... +# Subtest: credentials reads the status on each request, and a broker without one lists none +ok 157 - credentials reads the status on each request, and a broker without one lists none + --- + duration_ms: 20.841619 + type: 'test' + ... +# Subtest: the broker process answers credentials without a token, path or variable in its output, log or store +ok 158 - the broker process answers credentials without a token, path or variable in its output, log or store + --- + duration_ms: 145.884118 + type: 'test' + ... +# Subtest: T1: a store reference with no file yet starts, and the agent is not-issued until issue +ok 159 - T1: a store reference with no file yet starts, and the agent is not-issued until issue + --- + duration_ms: 4.423844 + type: 'test' + ... +# Subtest: T1: a store path the reference does not own, or no store root, refuses the reference +ok 160 - T1: a store path the reference does not own, or no store root, refuses the reference + --- + duration_ms: 0.532063 + type: 'test' + ... +# Subtest: T1: a wrong mode on the store root, a business dir, an agent dir or the file refuses start +ok 161 - T1: a wrong mode on the store root, a business dir, an agent dir or the file refuses start + --- + duration_ms: 1.742338 + type: 'test' + ... +# Subtest: T1: a missing store root refuses start; a missing {file} reference still refuses start +ok 162 - T1: a missing store root refuses start; a missing {file} reference still refuses start + --- + duration_ms: 0.516924 + type: 'test' + ... +# Subtest: T1: a store file that is a directory or a symlink refuses start +ok 163 - T1: a store file that is a directory or a symlink refuses start + --- + duration_ms: 0.773976 + type: 'test' + ... +# Subtest: T2: useFor keys from the session only +ok 164 - T2: useFor keys from the session only + --- + duration_ms: 1.840271 + type: 'test' + ... +# Subtest: T5: issue, rotate, revoke and delete are live with no restart, and revoke holds across one +ok 165 - T5: issue, rotate, revoke and delete are live with no restart, and revoke holds across one + --- + duration_ms: 3.589698 + type: 'test' + ... +# Subtest: T5: a failed commit leaves the token on disk but not in memory, and a bad token or date writes nothing +ok 166 - T5: a failed commit leaves the token on disk but not in memory, and a bad token or date writes nothing + --- + duration_ms: 1.613241 + type: 'test' + ... +# Subtest: T5: revoke drops the token from memory before the unlink, so a failed unlink still leaves it revoked +ok 167 - T5: revoke drops the token from memory before the unlink, so a failed unlink still leaves it revoked + --- + duration_ms: 1.501058 + type: 'test' + ... +# Subtest: T5: revoke of a {file} reference forgets the token and never unlinks the file +ok 168 - T5: revoke of a {file} reference forgets the token and never unlinks the file + --- + duration_ms: 0.540698 + type: 'test' + ... +# Subtest: T5: delete refuses an agent dir holding anything but tokens +ok 169 - T5: delete refuses an agent dir holding anything but tokens + --- + duration_ms: 2.324399 + type: 'test' + ... +# Subtest: D5: every credentials use( call site is on the allowlist +ok 170 - D5: every credentials use( call site is on the allowlist + --- + duration_ms: 16.164042 + type: 'test' + ... +# Subtest: row 199: the lifecycle verbs refuse every session but the human, and the tester revokes only +ok 171 - row 199: the lifecycle verbs refuse every session but the human, and the tester revokes only + --- + duration_ms: 37.920328 + type: 'test' + ... +# Subtest: T5: issue, rotate, revoke and delete are live, rewrite the business file and leave one receipt each, with no value anywhere +ok 172 - T5: issue, rotate, revoke and delete are live, rewrite the business file and leave one receipt each, with no value anywhere + --- + duration_ms: 84.468354 + type: 'test' + ... +# Subtest: only validated broker references load; returned data and exceptions cannot expose a known token +ok 173 - only validated broker references load; returned data and exceptions cannot expose a known token + --- + duration_ms: 2.205436 + type: 'test' + ... +# Subtest: bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse +ok 174 - bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse + --- + duration_ms: 1.276912 + type: 'test' + ... +# Subtest: expiry refuses use and env references never become client data +ok 175 - expiry refuses use and env references never become client data + --- + duration_ms: 0.425951 + type: 'test' + ... +# Subtest: S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state +ok 176 - S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state + --- + duration_ms: 0.928091 + type: 'test' + ... +# Subtest: opaque tokens shorter than 16 characters refuse before use +ok 177 - opaque tokens shorter than 16 characters refuse before use + --- + duration_ms: 0.230293 + type: 'test' + ... +# Subtest: each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto +ok 178 - each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto + --- + duration_ms: 1.2765 + type: 'test' + ... +# Subtest: chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass +ok 179 - chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 50.975606 + type: 'test' + ... +# Subtest: chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 180 - chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 38.168126 + type: 'test' + ... +# Subtest: chief-executive-officer: another C-suite role isn't on the lists either +ok 181 - chief-executive-officer: another C-suite role isn't on the lists either + --- + duration_ms: 30.8315 + type: 'test' + ... +# Subtest: chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass +ok 182 - chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 37.587102 + type: 'test' + ... +# Subtest: chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 183 - chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 36.09937 + type: 'test' + ... +# Subtest: chief-financial-officer: another C-suite role isn't on the lists either +ok 184 - chief-financial-officer: another C-suite role isn't on the lists either + --- + duration_ms: 30.894197 + type: 'test' + ... +# Subtest: chief-information-officer: messages to and from the user, chief of staff, pm and cto pass +ok 185 - chief-information-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 38.918386 + type: 'test' + ... +# Subtest: chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 186 - chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 36.127033 + type: 'test' + ... +# Subtest: chief-information-officer: another C-suite role isn't on the lists either +ok 187 - chief-information-officer: another C-suite role isn't on the lists either + --- + duration_ms: 30.720641 + type: 'test' + ... +# Subtest: chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass +ok 188 - chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 38.200924 + type: 'test' + ... +# Subtest: chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 189 - chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 36.790681 + type: 'test' + ... +# Subtest: chief-information-security-officer: another C-suite role isn't on the lists either +ok 190 - chief-information-security-officer: another C-suite role isn't on the lists either + --- + duration_ms: 30.433342 + type: 'test' + ... +# Subtest: chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass +ok 191 - chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 38.396797 + type: 'test' + ... +# Subtest: chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 192 - chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 35.599954 + type: 'test' + ... +# Subtest: chief-marketing-officer: another C-suite role isn't on the lists either +ok 193 - chief-marketing-officer: another C-suite role isn't on the lists either + --- + duration_ms: 31.641671 + type: 'test' + ... +# limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"c1d057b9-a9ce-48ff-807a-6b966f05d2ef","source":"@none","code":"baseline-unknown"} +# limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"77307a1f-aae9-450f-9daf-bf7a30f2f917","source":"@none","code":"baseline-unknown"} +# Subtest: REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it +ok 194 - REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it + --- + duration_ms: 106.308829 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota +ok 195 - REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota + --- + duration_ms: 49.481271 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it +ok 196 - REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it + --- + duration_ms: 45.700047 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none +ok 197 - REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none + --- + duration_ms: 12.033811 + type: 'test' + ... +# Subtest: a human resolve sends the raising role one message from the human, and its request is the answer +ok 198 - a human resolve sends the raising role one message from the human, and its request is the answer + --- + duration_ms: 34.3133 + type: 'test' + ... +# Subtest: a cross-role decision resolved by its arbiter comes from that role and run, with no request +ok 199 - a cross-role decision resolved by its arbiter comes from that role and run, with no request + --- + duration_ms: 21.134593 + type: 'test' + ... +# Subtest: a human withdraw sends one message with the note +ok 200 - a human withdraw sends one message with the note + --- + duration_ms: 19.933165 + type: 'test' + ... +# Subtest: a human seen before the close leaves the request on the close's answer, not the seen +ok 201 - a human seen before the close leaves the request on the close's answer, not the seen + --- + duration_ms: 23.383409 + type: 'test' + ... +# Subtest: the raising run's withdraw, a supersede, a within-role raise and seen send nothing +ok 202 - the raising run's withdraw, a supersede, a within-role raise and seen send nothing + --- + duration_ms: 24.014184 + type: 'test' + ... +# Subtest: refused closes send nothing: invalid-choice, decision-closed, not-resolver +ok 203 - refused closes send nothing: invalid-choice, decision-closed, not-resolver + --- + duration_ms: 25.106192 + type: 'test' + ... +# Subtest: a raising role nobody holds at the close gets the message on the next claim +ok 204 - a raising role nobody holds at the close gets the message on the next claim + --- + duration_ms: 21.45223 + type: 'test' + ... +# Subtest: a human DECISION send keeps its own instruction as the request, not a close's answer +ok 205 - a human DECISION send keeps its own instruction as the request, not a close's answer + --- + duration_ms: 20.545726 + type: 'test' + ... +# Subtest: a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing +ok 206 - a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing + --- + duration_ms: 32.472164 + type: 'test' + ... +# Subtest: a gated raise by a role that does not hear from the human is refused and stores nothing +ok 207 - a gated raise by a role that does not hear from the human is refused and stores nothing + --- + duration_ms: 23.766273 + type: 'test' + ... +# Subtest: a route the raiser hears from is allowed, checked from the route to the raiser +ok 208 - a route the raiser hears from is allowed, checked from the route to the raiser + --- + duration_ms: 33.083841 + type: 'test' + ... +# Subtest: a refused supersede withdraws nothing +ok 209 - a refused supersede withdraws nothing + --- + duration_ms: 23.669088 + type: 'test' + ... +# Subtest: the assistant's within-role and gated raises still work +ok 210 - the assistant's within-role and gated raises still work + --- + duration_ms: 24.599373 + type: 'test' + ... +# Subtest: roles lists open decisions routed to a role, and never the human inbox +ok 211 - roles lists open decisions routed to a role, and never the human inbox + --- + duration_ms: 28.92175 + type: 'test' + ... +# Subtest: recent lists closed decisions of every route, newest close first, with how each closed +ok 212 - recent lists closed decisions of every route, newest close first, with how each closed + --- + duration_ms: 27.388092 + type: 'test' + ... +# Subtest: recent gives the closing event as closed when the decision was seen first +ok 213 - recent gives the closing event as closed when the decision was seen first + --- + duration_ms: 27.865949 + type: 'test' + ... +# Subtest: recent stops at RECENT rows +ok 214 - recent stops at RECENT rows + --- + duration_ms: 81.072313 + type: 'test' + ... +# Subtest: every row is what trail already gives the same session for that id +ok 215 - every row is what trail already gives the same session for that id + --- + duration_ms: 35.328168 + type: 'test' + ... +# Subtest: a role session can't list decisions, so it can't read another role's open decisions +ok 216 - a role session can't list decisions, so it can't read another role's open decisions + --- + duration_ms: 34.775065 + type: 'test' + ... +# Subtest: decisions is a read: one business, strict arguments, nothing written +ok 217 - decisions is a read: one business, strict arguments, nothing written + --- + duration_ms: 36.412116 + type: 'test' + ... +# Subtest: endLaunch writes session.ended, releases the run claim and kills its capabilities +ok 218 - endLaunch writes session.ended, releases the run claim and kills its capabilities + --- + duration_ms: 18.98838 + type: 'test' + ... +# Subtest: endLaunch refuses an unknown run, a second end and a rebind of the ended run +ok 219 - endLaunch refuses an unknown run, a second end and a rebind of the ended run + --- + duration_ms: 11.418152 + type: 'test' + ... +# Subtest: a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound +ok 220 - a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound + --- + duration_ms: 13.486425 + type: 'test' + ... +# Subtest: endLaunch leaves a claim another run took alone +ok 221 - endLaunch leaves a claim another run took alone + --- + duration_ms: 14.306424 + type: 'test' + ... +# Subtest: refuse records action.refused against the caller with the code only +ok 222 - refuse records action.refused against the caller with the code only + --- + duration_ms: 11.774368 + type: 'test' + ... +# Subtest: launches off refuses role.launch with launch-revoked until launches on +ok 223 - launches off refuses role.launch with launch-revoked until launches on + --- + duration_ms: 16.652435 + type: 'test' + ... +# Subtest: broker process: launch ops authorize role.launch, record refusals and end runs +ok 224 - broker process: launch ops authorize role.launch, record refusals and end runs + --- + duration_ms: 155.250227 + type: 'test' + ... +# Subtest: row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three +ok 225 - row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three + --- + duration_ms: 235.464055 + type: 'test' + ... +# Subtest: row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes +ok 226 - row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes + --- + duration_ms: 214.953606 + type: 'test' + ... +# Subtest: row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea +ok 227 - row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea + --- + duration_ms: 199.753859 + type: 'test' + ... +# Subtest: row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only +ok 228 - row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only + --- + duration_ms: 197.505935 + type: 'test' + ... +# Subtest: row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request +ok 229 - row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request + --- + duration_ms: 54.060571 + type: 'test' + ... +# Subtest: row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes +ok 230 - row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes + --- + duration_ms: 188.854849 + type: 'test' + ... +# Subtest: row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close +ok 231 - row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close + --- + duration_ms: 81.987643 + type: 'test' + ... +# Subtest: row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft +ok 232 - row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft + --- + duration_ms: 83.581675 + type: 'test' + ... +# Subtest: row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact +ok 233 - row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact + --- + duration_ms: 102.462618 + type: 'test' + ... +# Subtest: row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries +ok 234 - row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries + --- + duration_ms: 274.295898 + type: 'test' + ... +# Subtest: row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied +ok 235 - row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied + --- + duration_ms: 61.068559 + type: 'test' + ... +# Subtest: row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write +ok 236 - row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write + --- + duration_ms: 73.535219 + type: 'test' + ... +# Subtest: row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token +ok 237 - row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token + --- + duration_ms: 234.792007 + type: 'test' + ... +# Subtest: row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked +ok 238 - row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked + --- + duration_ms: 92.29187 + type: 'test' + ... +# Subtest: row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job +ok 239 - row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job + --- + duration_ms: 105.17558 + type: 'test' + ... +# Subtest: row 281 T7: an instance with no grant fires as today, synchronously, with the same events +ok 240 - row 281 T7: an instance with no grant fires as today, synchronously, with the same events + --- + duration_ms: 50.542878 + type: 'test' + ... +# Subtest: row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running +ok 241 - row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running + --- + duration_ms: 204.982957 + type: 'test' + ... +# Subtest: row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs +ok 242 - row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs + --- + duration_ms: 184.314947 + type: 'test' + ... +# Subtest: row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts +ok 243 - row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts + --- + duration_ms: 82.476583 + type: 'test' + ... +# Subtest: row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously +ok 244 - row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously + --- + duration_ms: 73.46506 + type: 'test' + ... +# Subtest: row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none +ok 245 - row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none + --- + duration_ms: 130.151417 + type: 'test' + ... +# Subtest: row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job +ok 246 - row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job + --- + duration_ms: 58.099908 + type: 'test' + ... +# Subtest: row 239 T4: a refusal after the writer's revoke is named -revoked, in the job's fire.failed and notice, a synchronous fire and a delete +ok 247 - row 239 T4: a refusal after the writer's revoke is named -revoked, in the job's fire.failed and notice, a synchronous fire and a delete + --- + duration_ms: 92.145462 + type: 'test' + ... +# Subtest: row 239 T4b: an unmarked step B refusal keeps its code, and the notice says nothing of the tokens +ok 248 - row 239 T4b: an unmarked step B refusal keeps its code, and the notice says nothing of the tokens + --- + duration_ms: 72.513792 + type: 'test' + ... +# Subtest: C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations +ok 249 - C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations + --- + duration_ms: 11606.266727 + type: 'test' + ... +# ✔ C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations (11490.082613ms)\\nℹ F-A creative write: PUT status 204\\nℹ F-B creative: permissions {"admin":false,"push":true,"pull":true}\\nℹ F-A chief read: PUT status 204\\nℹ F-B chief: permissions {"admin":false,"push":false,"pull":true}\\nℹ F-C protected Story/**: seat rc 1, owner rc 1; established false\\nℹ F-D protected branch: normal rc 0, force rc 1; established true\\nℹ minted 4, hits 0\\nℹ tests 1\\nℹ suites 0\\nℹ pass 1\\nℹ fail 0\\nℹ cancelled 0\\nℹ skipped 0\\nℹ todo 0\\nℹ duration_ms 11576.227485\\n +# minted 4, hits 0 (complete TAP stdout/stderr) +# Subtest: X-G3: on scratch 1.27.1, a grant makes the user, mints, forks, checks reach, writes the file, and revoke deletes the token +ok 250 - X-G3: on scratch 1.27.1, a grant makes the user, mints, forks, checks reach, writes the file, and revoke deletes the token + --- + duration_ms: 12807.757659 + type: 'test' + ... +# Subtest: versionAtLeast compares numbers and refuses a prerelease of 1.27.0 +ok 251 - versionAtLeast compares numbers and refuses a prerelease of 1.27.0 + --- + duration_ms: 1.215274 + type: 'test' + ... +# Subtest: X-G1: a raise that fails a check refuses and stores nothing +ok 252 - X-G1: a raise that fails a check refuses and stores nothing + --- + duration_ms: 63.999533 + type: 'test' + ... +# Subtest: X-G1: a creative role, a role without identity and a missing or due slot refuse at raise +ok 253 - X-G1: a creative role, a role without identity and a missing or due slot refuse at raise + --- + duration_ms: 183.870546 + type: 'test' + ... +# Subtest: X-G1: the chief of staff refuses at raise, whatever its definition, identity and publish declare +ok 254 - X-G1: the chief of staff refuses at raise, whatever its definition, identity and publish declare + --- + duration_ms: 38.151416 + type: 'test' + ... +# Subtest: X-G2: admin set refuses each failed check and writes nothing, then writes the slot once +ok 255 - X-G2: admin set refuses each failed check and writes nothing, then writes the slot once + --- + duration_ms: 149.193603 + type: 'test' + ... +# Subtest: X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied +ok 256 - X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied + --- + duration_ms: 104.710829 + type: 'test' + ... +# Subtest: X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse +ok 257 - X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse + --- + duration_ms: 277.828826 + type: 'test' + ... +# Subtest: X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call +ok 258 - X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call + --- + duration_ms: 103.52608 + type: 'test' + ... +# Subtest: X-G4: a fork by the seat user of another repository than the project refuses fork-foreign +ok 259 - X-G4: a fork by the seat user of another repository than the project refuses fork-foreign + --- + duration_ms: 81.121943 + type: 'test' + ... +# Subtest: X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file +ok 260 - X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file + --- + duration_ms: 127.757346 + type: 'test' + ... +# Subtest: X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep +ok 261 - X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep + --- + duration_ms: 124.294523 + type: 'test' + ... +# Subtest: X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent +ok 262 - X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent + --- + duration_ms: 151.633641 + type: 'test' + ... +# Subtest: X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call +ok 263 - X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call + --- + duration_ms: 63.698785 + type: 'test' + ... +# Subtest: X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left +ok 264 - X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left + --- + duration_ms: 169.534674 + type: 'test' + ... +# Subtest: X-G10: in a rotation the store file holds the new token before the old one is deleted +ok 265 - X-G10: in a rotation the store file holds the new token before the old one is deleted + --- + duration_ms: 149.806346 + type: 'test' + ... +# Subtest: X-G6: a rotation cut before the rename settles back at once, and the old token stays live +ok 266 - X-G6: a rotation cut before the rename settles back at once, and the old token stays live + --- + duration_ms: 165.20677 + type: 'test' + ... +# Subtest: X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward +ok 267 - X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward + --- + duration_ms: 180.451384 + type: 'test' + ... +# Subtest: X-G6: a restart settles an open rotation back when the file still holds the old token +ok 268 - X-G6: a restart settles an open rotation back when the file still holds the old token + --- + duration_ms: 137.251315 + type: 'test' + ... +# Subtest: X-G6: a restart settles an open rotation forward when the file holds the new token +ok 269 - X-G6: a restart settles an open rotation forward when the file holds the new token + --- + duration_ms: 136.10973 + type: 'test' + ... +# Subtest: X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads +ok 270 - X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads + --- + duration_ms: 141.402485 + type: 'test' + ... +# Subtest: X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted +ok 271 - X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted + --- + duration_ms: 1052.28787 + type: 'test' + ... +# Subtest: X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids +ok 272 - X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids + --- + duration_ms: 141.289347 + type: 'test' + ... +# Subtest: N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message +ok 273 - N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message + --- + duration_ms: 116.031856 + type: 'test' + ... +# Subtest: N9: a 404 on a delete by id counts as done +ok 274 - N9: a 404 on a delete by id counts as done + --- + duration_ms: 133.5576 + type: 'test' + ... +# Subtest: X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision +ok 275 - X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision + --- + duration_ms: 405.986804 + type: 'test' + ... +# Subtest: X-G6: a restart with no admin slot leaves the user an orphan and the token left +ok 276 - X-G6: a restart with no admin slot leaves the user an orphan and the token left + --- + duration_ms: 54.392255 + type: 'test' + ... +# Subtest: X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch +ok 277 - X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch + --- + duration_ms: 123.011848 + type: 'test' + ... +# Subtest: X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left +ok 278 - X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left + --- + duration_ms: 107.601728 + type: 'test' + ... +# Subtest: X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away +ok 279 - X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away + --- + duration_ms: 66.994714 + type: 'test' + ... +# Subtest: X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent +ok 280 - X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent + --- + duration_ms: 50.394527 + type: 'test' + ... +# Subtest: X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision +ok 281 - X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision + --- + duration_ms: 113.206528 + type: 'test' + ... +# Subtest: kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses +ok 282 - kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses + --- + duration_ms: 109.995783 + type: 'test' + ... +# Subtest: X-G11: a revoke while the executor runs aborts it and the grant ends revoked +ok 283 - X-G11: a revoke while the executor runs aborts it and the grant ends revoked + --- + duration_ms: 105.756361 + type: 'test' + ... +# Subtest: X-G11: a revoke unloads memory and removes the file before its Gitea delete +ok 284 - X-G11: a revoke unloads memory and removes the file before its Gitea delete + --- + duration_ms: 111.903937 + type: 'test' + ... +# Subtest: X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back +ok 285 - X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back + --- + duration_ms: 158.542268 + type: 'test' + ... +# Subtest: X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record +ok 286 - X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record + --- + duration_ms: 332.435254 + type: 'test' + ... +# Subtest: X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held +ok 287 - X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held + --- + duration_ms: 190.850873 + type: 'test' + ... +# Subtest: X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost +ok 288 - X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost + --- + duration_ms: 160.428195 + type: 'test' + ... +# Subtest: X-G12: a token that reaches wider than its forks fails with the repository named +ok 289 - X-G12: a token that reaches wider than its forks fails with the repository named + --- + duration_ms: 399.165871 + type: 'test' + ... +# Subtest: X-G12: reach is paged by X-Total-Count and a count that does not add up refuses +ok 290 - X-G12: reach is paged by X-Total-Count and a count that does not add up refuses + --- + duration_ms: 262.328193 + type: 'test' + ... +# Subtest: X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer +ok 291 - X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer + --- + duration_ms: 41.788847 + type: 'test' + ... +# Subtest: X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it +ok 292 - X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it + --- + duration_ms: 256.259425 + type: 'test' + ... +# Subtest: X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft +ok 293 - X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft + --- + duration_ms: 148.261746 + type: 'test' + ... +# Subtest: X-G14: a fire whose user is gone or remade skips the fire steps and says why +ok 294 - X-G14: a fire whose user is gone or remade skips the fire steps and says why + --- + duration_ms: 257.327156 + type: 'test' + ... +# Subtest: X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named +ok 295 - X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named + --- + duration_ms: 299.752968 + type: 'test' + ... +# Subtest: X-G14: a revoke Gitea cannot reach stays open, and a restart closes it +ok 296 - X-G14: a revoke Gitea cannot reach stays open, and a restart closes it + --- + duration_ms: 133.866837 + type: 'test' + ... +# Subtest: row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job +ok 297 - row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job + --- + duration_ms: 127.458345 + type: 'test' + ... +# Subtest: X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status +ok 298 - X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status + --- + duration_ms: 115.070545 + type: 'test' + ... +# Subtest: X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant +ok 299 - X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant + --- + duration_ms: 42.800561 + type: 'test' + ... +# Subtest: status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea +ok 300 - status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea + --- + duration_ms: 108.822462 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: research gets write on her repository with declared scopes through raise and yes +ok 301 - C2-21 L1/L2/L9: research gets write on her repository with declared scopes through raise and yes + --- + duration_ms: 122.624992 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: chief-of-staff gets read on her repository with declared scopes through raise and yes +ok 302 - C2-21 L1/L2/L9: chief-of-staff gets read on her repository with declared scopes through raise and yes + --- + duration_ms: 106.13928 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: coder gets read on her repository with declared scopes through raise and yes +ok 303 - C2-21 L1/L2/L9: coder gets read on her repository with declared scopes through raise and yes + --- + duration_ms: 106.23829 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: research refuses non-library targets lib +ok 304 - C2-21 L7/L7b: research refuses non-library targets lib + --- + duration_ms: 41.091247 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: research refuses non-library targets app,lib +ok 305 - C2-21 L7/L7b: research refuses non-library targets app,lib + --- + duration_ms: 38.604909 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: chief-of-staff refuses non-library targets lib +ok 306 - C2-21 L7/L7b: chief-of-staff refuses non-library targets lib + --- + duration_ms: 40.387676 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: chief-of-staff refuses non-library targets app,lib +ok 307 - C2-21 L7/L7b: chief-of-staff refuses non-library targets app,lib + --- + duration_ms: 41.69827 + type: 'test' + ... +# Subtest: C2-21 L4: read widened to write refuses gitea-reach-wider and deletes the minted token +ok 308 - C2-21 L4: read widened to write refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 104.166354 + type: 'test' + ... +# Subtest: C2-21 L4: admin privilege refuses gitea-reach-wider and deletes the minted token +ok 309 - C2-21 L4: admin privilege refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 106.489253 + type: 'test' + ... +# Subtest: C2-21 L4: missing pull refuses gitea-reach-wider and deletes the minted token +ok 310 - C2-21 L4: missing pull refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 88.038683 + type: 'test' + ... +# Subtest: C2-21 L4: missing permission object refuses gitea-reach-wider and deletes the minted token +ok 311 - C2-21 L4: missing permission object refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 88.096718 + type: 'test' + ... +# Subtest: C2-21 L4: library fork refuses gitea-reach-wider and deletes the minted token +ok 312 - C2-21 L4: library fork refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 86.200849 + type: 'test' + ... +# Subtest: C2-21 L8: untargeted library collaborator reach is disclosed and accepted publish-wide +ok 313 - C2-21 L8: untargeted library collaborator reach is disclosed and accepted publish-wide + --- + duration_ms: 88.318379 + type: 'test' + ... +# Subtest: C2-21 L10: project kind or library level changing after raise refuses decision-mismatch +ok 314 - C2-21 L10: project kind or library level changing after raise refuses decision-mismatch + --- + duration_ms: 151.358505 + type: 'test' + ... +# Subtest: C2-21 L4: creative write requires push true but ignores unrelated permission keys +ok 315 - C2-21 L4: creative write requires push true but ignores unrelated permission keys + --- + duration_ms: 195.518096 + type: 'test' + ... +# Subtest: C2-21: a library grant with no declared scopes refuses gitea-not-declared at raise +ok 316 - C2-21: a library grant with no declared scopes refuses gitea-not-declared at raise + --- + duration_ms: 44.859316 + type: 'test' + ... +# Subtest: 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys +ok 317 - 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys + --- + duration_ms: 80.929315 + type: 'test' + ... +# Subtest: a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact +ok 318 - a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact + --- + duration_ms: 92.233432 + type: 'test' + ... +# Subtest: the 3j engine refuses a migrated store, migrating or not, and leaves it as it was +ok 319 - the 3j engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 83.864447 + type: 'test' + ... +# Subtest: gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision +ok 320 - gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision + --- + duration_ms: 11.353518 + type: 'test' + ... +# Subtest: gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user +ok 321 - gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user + --- + duration_ms: 12.557465 + type: 'test' + ... +# Subtest: G1, A1: only the chief raises a grant, and a refused raise stores nothing and runs no keyscan +ok 322 - G1, A1: only the chief raises a grant, and a refused raise stores nothing and runs no keyscan + --- + duration_ms: 34.784865 + type: 'test' + ... +# Subtest: G1: grant goes only with credential.mint, row a takes only host-enroll, and E1 refuses each bad field +ok 323 - G1: grant goes only with credential.mint, row a takes only host-enroll, and E1 refuses each bad field + --- + duration_ms: 47.072076 + type: 'test' + ... +# Subtest: G5, A5, A6: the scanned key set must equal the requested set, or host-key-mismatch and nothing stored +ok 324 - G5, A5, A6: the scanned key set must equal the requested set, or host-key-mismatch and nothing stored + --- + duration_ms: 33.188031 + type: 'test' + ... +# Subtest: G4 (host-enroll block, M1): the broker appends the keys, fingerprints and sudo line, and the cap counts the block +ok 325 - G4 (host-enroll block, M1): the broker appends the keys, fingerprints and sudo line, and the cap counts the block + --- + duration_ms: 26.702852 + type: 'test' + ... +# Subtest: G6, X1: the human's cli yes starts enrollment, which writes the record, the key file and the events in order +ok 326 - G6, X1: the human's cli yes starts enrollment, which writes the record, the key file and the events in order + --- + duration_ms: 48.765506 + type: 'test' + ... +# Subtest: A2, A4: a credential.mint without grant, and a no, start nothing +ok 327 - A2, A4: a credential.mint without grant, and a no, start nothing + --- + duration_ms: 240.095639 + type: 'test' + ... +# Subtest: A3, X1: a resolve by the tester or an agent starts nothing +ok 328 - A3, X1: a resolve by the tester or an agent starts nothing + --- + duration_ms: 236.29595 + type: 'test' + ... +# Subtest: G6 (duckworth-0081 B3): a withdraw by the chief or the human, and an arbiter resolve, start nothing +ok 329 - G6 (duckworth-0081 B3): a withdraw by the chief or the human, and an arbiter resolve, start nothing + --- + duration_ms: 244.131753 + type: 'test' + ... +# Subtest: G10 (duckworth-0081 B1): a second start for a spent decision refuses decision-consumed, and an unresolved or agent-resolved one not-authorized +ok 330 - G10 (duckworth-0081 B1): a second start for a spent decision refuses decision-consumed, and an unresolved or agent-resolved one not-authorized + --- + duration_ms: 51.30714 + type: 'test' + ... +# Subtest: A8, S1: two approved enrollments for one host: the second ends host-enrolled and the pin stays +ok 331 - A8, S1: two approved enrollments for one host: the second ends host-enrolled and the pin stays + --- + duration_ms: 69.848964 + type: 'test' + ... +# Subtest: A9: the hosts primary key refuses a second record for (business, host) +ok 332 - A9: the hosts primary key refuses a second record for (business, host) + --- + duration_ms: 22.831994 + type: 'test' + ... +# Subtest: X3: a failure at step 2 deletes the record again and ends grant.failed, with no key file +ok 333 - X3: a failure at step 2 deletes the record again and ends grant.failed, with no key file + --- + duration_ms: 43.925986 + type: 'test' + ... +# Subtest: A10, X3: at start a resolved, unspent enrollment is spent and ends interrupted, and never runs late +ok 334 - A10, X3: at start a resolved, unspent enrollment is spent and ends interrupted, and never runs late + --- + duration_ms: 26.954291 + type: 'test' + ... +# Subtest: X3: at start an enrollment that stopped after its registry step loses its record and key file +ok 335 - X3: at start an enrollment that stopped after its registry step loses its record and key file + --- + duration_ms: 46.921617 + type: 'test' + ... +# Subtest: G24 first sentence, M2, A12: tags are mosaic- and 32 hex, and differ by business, agent and host +ok 336 - G24 first sentence, M2, A12: tags are mosaic- and 32 hex, and differ by business, agent and host + --- + duration_ms: 0.286577 + type: 'test' + ... +# Subtest: E4: hosts.check sets the record ready and records grant.host.checked; a non-zero list leaves it pending +ok 337 - E4: hosts.check sets the record ready and records grant.host.checked; a non-zero list leaves it pending + --- + duration_ms: 50.41738 + type: 'test' + ... +# Subtest: G20 (duckworth-0081 B3): the human's hosts.check marks the host ready, and the reader refuses +ok 338 - G20 (duckworth-0081 B3): the human's hosts.check marks the host ready, and the reader refuses + --- + duration_ms: 46.384033 + type: 'test' + ... +# Subtest: G18 (duckworth-0081 B2), broker half: a check refused host-key-mismatch leaves the host pending-install with no grant.host.checked +ok 339 - G18 (duckworth-0081 B2), broker half: a check refused host-key-mismatch leaves the host pending-install with no grant.host.checked + --- + duration_ms: 45.145001 + type: 'test' + ... +# Subtest: E4: a check whose installer fingerprint differs from the record refuses host-changed +ok 340 - E4: a check whose installer fingerprint differs from the record refuses host-changed + --- + duration_ms: 44.782368 + type: 'test' + ... +# Subtest: E4, G21: hosts.remove is the human's or the tester's, deletes the key and the record, and records grant.host.removed +ok 341 - E4, G21: hosts.remove is the human's or the tester's, deletes the key and the record, and records grant.host.removed + --- + duration_ms: 48.481427 + type: 'test' + ... +# Subtest: G21, F1, F2, M4, A22: hosts.remove refuses host-line-left on a guarded hostLineLeft, and ignores look-alikes +ok 342 - G21, F1, F2, M4, A22: hosts.remove refuses host-line-left on a guarded hostLineLeft, and ignores look-alikes + --- + duration_ms: 50.625543 + type: 'test' + ... +# Subtest: hosts.remove refuses host-in-use while a grant record names the host +ok 343 - hosts.remove refuses host-in-use while a grant record names the host + --- + duration_ms: 47.095644 + type: 'test' + ... +# Subtest: the grant writer refuses a body outside section 7's shape +ok 344 - the grant writer refuses a body outside section 7's shape + --- + duration_ms: 21.542593 + type: 'test' + ... +# Subtest: recordEvent refuses reserved-event for a grant.* action or operation +ok 345 - recordEvent refuses reserved-event for a grant.* action or operation + --- + duration_ms: 21.878435 + type: 'test' + ... +# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd +ok 346 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd + --- + duration_ms: 84.933268 + type: 'test' + ... +# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range +ok 347 - row 280: every injected picker sample is unprivileged and outside the ephemeral range + --- + duration_ms: 0.358104 + type: 'test' + ... +# Subtest: G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied +ok 348 - G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied + --- + duration_ms: 678.579599 + type: 'test' + ... +# Subtest: G7: a commands change on a live grant updates the record in one transaction and keeps the key and line +ok 349 - G7: a commands change on a live grant updates the record in one transaction and keeps the key and line + --- + duration_ms: 532.070632 + type: 'test' + ... +# Subtest: G8: a failure at install or verify removes the line and leaves no record, key file or reference +ok 350 - G8: a failure at install or verify removes the line and leaves no record, key file or reference + --- + duration_ms: 1503.4046 + type: 'test' + ... +# Subtest: G8: a failed remove adds hostLineLeft and tells the human to sweep +ok 351 - G8: a failed remove adds hostLineLeft and tells the human to sweep + --- + duration_ms: 629.325679 + type: 'test' + ... +# Subtest: G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line +ok 352 - G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line + --- + duration_ms: 646.513379 + type: 'test' + ... +# Subtest: G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line +ok 353 - G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line + --- + duration_ms: 631.238259 + type: 'test' + ... +# Subtest: G8: a failed step 1 check spends the decision and runs nothing remote +ok 354 - G8: a failed step 1 check spends the decision and runs nothing remote + --- + duration_ms: 83.371726 + type: 'test' + ... +# Subtest: G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step +ok 355 - G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step + --- + duration_ms: 510.636222 + type: 'test' + ... +# Subtest: G9: an agent no longer a role or no longer declaring host ends with its code, spent +ok 356 - G9: an agent no longer a role or no longer declaring host ends with its code, spent + --- + duration_ms: 70.482141 + type: 'test' + ... +# Subtest: G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing +ok 357 - G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing + --- + duration_ms: 512.143413 + type: 'test' + ... +# Subtest: G15: no event, message or decision holds the private key +ok 358 - G15: no event, message or decision holds the private key + --- + duration_ms: 509.010629 + type: 'test' + ... +# Subtest: G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line +ok 359 - G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line + --- + duration_ms: 526.513462 + type: 'test' + ... +# Subtest: G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep +ok 360 - G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep + --- + duration_ms: 858.012495 + type: 'test' + ... +# Subtest: G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep +ok 361 - G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep + --- + duration_ms: 853.506299 + type: 'test' + ... +# Subtest: G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy +ok 362 - G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy + --- + duration_ms: 511.535366 + type: 'test' + ... +# Subtest: G24: names at 64 characters with . and _ give distinct tags of the fixed length +ok 363 - G24: names at 64 characters with . and _ give distinct tags of the fixed length + --- + duration_ms: 0.389496 + type: 'test' + ... +# Subtest: G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then +ok 364 - G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then + --- + duration_ms: 222.186504 + type: 'test' + ... +# Subtest: G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line +ok 365 - G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line + --- + duration_ms: 221.129628 + type: 'test' + ... +# Subtest: G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host +ok 366 - G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host + --- + duration_ms: 493.546698 + type: 'test' + ... +# Subtest: G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later +ok 367 - G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later + --- + duration_ms: 67.543177 + type: 'test' + ... +# Subtest: G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint +ok 368 - G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint + --- + duration_ms: 285.039677 + type: 'test' + ... +# Subtest: G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it +ok 369 - G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it + --- + duration_ms: 496.314739 + type: 'test' + ... +# Subtest: N1 (G27): the start sweep unlinks host. files with no record in loaded businesses only, and refuses a store dir that is not private +ok 370 - N1 (G27): the start sweep unlinks host. files with no record in loaded businesses only, and refuses a store dir that is not private + --- + duration_ms: 6.509564 + type: 'test' + ... +# Subtest: G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker +ok 371 - G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker + --- + duration_ms: 658.107963 + type: 'test' + ... +# Subtest: G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse +ok 372 - G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse + --- + duration_ms: 215.884462 + type: 'test' + ... +# Subtest: G13: a revoke during install aborts the executor, which ends revoked, and the line goes +ok 373 - G13: a revoke during install aborts the executor, which ends revoked, and the line goes + --- + duration_ms: 560.407609 + type: 'test' + ... +# Subtest: G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's +ok 374 - G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's + --- + duration_ms: 507.933492 + type: 'test' + ... +# Subtest: row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records +ok 375 - row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records + --- + duration_ms: 656.011722 + type: 'test' + ... +# Subtest: G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then +ok 376 - G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then + --- + duration_ms: 662.650213 + type: 'test' + ... +# Subtest: G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened +ok 377 - G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened + --- + duration_ms: 977.187526 + type: 'test' + ... +# Subtest: G27: a key file a revoke could not unlink is reported left and goes at the next start +ok 378 - G27: a key file a revoke could not unlink is reported left and goes at the next start + --- + duration_ms: 654.943087 + type: 'test' + ... +# Subtest: G28: a commands change, then a revoke, then a restart leave no record, key, reference or line +ok 379 - G28: a commands change, then a revoke, then a restart leave no record, key, reference or line + --- + duration_ms: 656.623526 + type: 'test' + ... +# Subtest: G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left +ok 380 - G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left + --- + duration_ms: 964.084778 + type: 'test' + ... +# Subtest: G12: the local steps finish before the host step, so a host that hangs leaves the agent no access +ok 381 - G12: the local steps finish before the host step, so a host that hangs leaves the agent no access + --- + duration_ms: 701.839363 + type: 'test' + ... +# Subtest: G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked +ok 382 - G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked + --- + duration_ms: 211.490102 + type: 'test' + ... +# Subtest: G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line +ok 383 - G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line + --- + duration_ms: 673.03905 + type: 'test' + ... +# Subtest: G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep +ok 384 - G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep + --- + duration_ms: 656.400521 + type: 'test' + ... +# Subtest: G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight +ok 385 - G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight + --- + duration_ms: 1167.526867 + type: 'test' + ... +# Subtest: mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote +ok 386 - mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote + --- + duration_ms: 63.757619 + type: 'test' + ... +# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record +ok 387 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record + --- + duration_ms: 515.022901 + type: 'test' + ... +# Subtest: G1 (host): only the chief raises a host grant, a grant on any other action refuses, and nothing is stored +ok 388 - G1 (host): only the chief raises a host grant, a grant on any other action refuses, and nothing is stored + --- + duration_ms: 30.133659 + type: 'test' + ... +# Subtest: G1, R4: the grant takes exactly method, agent, host, commands and rotateBy, and an unknown method refuses +ok 389 - G1, R4: the grant takes exactly method, agent, host, commands and rotateBy, and an unknown method refuses + --- + duration_ms: 33.200555 + type: 'test' + ... +# Subtest: row 236 (\#1742): a gitea grant on a broker with no Gitea path refuses gitea-not-configured, and nothing is stored +ok 390 - row 236 (\#1742): a gitea grant on a broker with no Gitea path refuses gitea-not-configured, and nothing is stored + --- + duration_ms: 19.467268 + type: 'test' + ... +# Subtest: G2: an agent whose definition lacks host refuses host-not-declared, and an unknown agent unknown-role +ok 391 - G2: an agent whose definition lacks host refuses host-not-declared, and an unknown agent unknown-role + --- + duration_ms: 23.126645 + type: 'test' + ... +# Subtest: mos-1163: a grant whose agent is a creative role refuses host-creative-role, even when its definition declares host +ok 392 - mos-1163: a grant whose agent is a creative role refuses host-creative-role, even when its definition declares host + --- + duration_ms: 19.954983 + type: 'test' + ... +# Subtest: G3: wildcard, shell, empty and other 210 D6 argv prefixes refuse invalid-request +ok 393 - G3: wildcard, shell, empty and other 210 D6 argv prefixes refuse invalid-request + --- + duration_ms: 41.377745 + type: 'test' + ... +# Subtest: R4 rotateBy (sage-1782): a real calendar day after today UTC, or invalid-request +ok 394 - R4 rotateBy (sage-1782): a real calendar day after today UTC, or invalid-request + --- + duration_ms: 32.22665 + type: 'test' + ... +# Subtest: G19: a grant naming a host that is pending-install refuses host-not-ready, and an unknown host host-unknown +ok 395 - G19: a grant naming a host that is pending-install refuses host-not-ready, and an unknown host host-unknown + --- + duration_ms: 25.248375 + type: 'test' + ... +# Subtest: R4, G5: the raise routes to the human and its event body binds the eight fields with their hashes +ok 396 - R4, G5: the raise routes to the human and its event body binds the eight fields with their hashes + --- + duration_ms: 20.407463 + type: 'test' + ... +# Subtest: G4 (host block): the broker appends the host, each prefix, the rotate date and new key or change +ok 397 - G4 (host block): the broker appends the host, each prefix, the rotate date and new key or change + --- + duration_ms: 34.292366 + type: 'test' + ... +# Subtest: 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard +ok 398 - 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard + --- + duration_ms: 80.146006 + type: 'test' + ... +# Subtest: a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact +ok 399 - a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact + --- + duration_ms: 95.999534 + type: 'test' + ... +# Subtest: the 3i engine refuses a migrated store, migrating or not, and leaves it as it was +ok 400 - the 3i engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 85.794579 + type: 'test' + ... +# Subtest: A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it +ok 401 - A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it + --- + duration_ms: 81.645565 + type: 'test' + ... +# Subtest: the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor +ok 402 - the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor + --- + duration_ms: 14.90023 + type: 'test' + ... +# Subtest: hosts: one record per business and host, a ready host has its installer and check, grants need the host +ok 403 - hosts: one record per business and host, a ready host has its installer and check, grants need the host + --- + duration_ms: 12.345508 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 298 runtime: human scope approval writes the file and organization history at the supplied revision +ok 404 - row 298 runtime: human scope approval writes the file and organization history at the supplied revision + --- + duration_ms: 71.57735 + type: 'test' + ... +# Subtest: row 298 (Q3): only the human at the cli reads or sets the scope; agents, the tester, a reader and the Console refuse +ok 405 - row 298 (Q3): only the human at the cli reads or sets the scope; agents, the tester, a reader and the Console refuse + --- + duration_ms: 73.345247 + type: 'test' + ... +# Subtest: row 298 (Q1): organization.set and limits.set refuse a grantScope key, and nothing is written +ok 406 - row 298 (Q1): organization.set and limits.set refuse a grantScope key, and nothing is written + --- + duration_ms: 46.72714 + type: 'test' + ... +# Subtest: row 298 (Q3): the human verb writes the scope and a grant.scope record with the human proof and both sha256 +ok 407 - row 298 (Q3): the human verb writes the scope and a grant.scope record with the human proof and both sha256 + --- + duration_ms: 46.828441 + type: 'test' + ... +# Subtest: row 298 (Q4): an in-scope Gitea grant is issued with no inbox item, logged with 236 records, and revocable +ok 408 - row 298 (Q4): an in-scope Gitea grant is issued with no inbox item, logged with 236 records, and revocable + --- + duration_ms: 132.600693 + type: 'test' + ... +# Subtest: row 298: an out-of-scope Gitea grant waits for the human, whose Approve still issues it +ok 409 - row 298: an out-of-scope Gitea grant waits for the human, whose Approve still issues it + --- + duration_ms: 113.520375 + type: 'test' + ... +# Subtest: row 298: with no scope, a bad scope or an unreadable file, an in-scope-looking grant waits +ok 410 - row 298: with no scope, a bad scope or an unreadable file, an in-scope-looking grant waits + --- + duration_ms: 141.998077 + type: 'test' + ... +# Subtest: row 298 (Q6): a chief-of-staff instance that is not launch.by never raises in scope +ok 411 - row 298 (Q6): a chief-of-staff instance that is not launch.by never raises in scope + --- + duration_ms: 46.794692 + type: 'test' + ... +# Subtest: row 298 (Q5): a scope narrowed between the raise and the spend ends the grant scope-changed +ok 412 - row 298 (Q5): a scope narrowed between the raise and the spend ends the grant scope-changed + --- + duration_ms: 66.726197 + type: 'test' + ... +# Subtest: row 298 (Q2): an in-scope host grant is spent with no Approve; ls never covers lsblk, nor a scope command extra arguments +ok 413 - row 298 (Q2): an in-scope host grant is spent with no Approve; ls never covers lsblk, nor a scope command extra arguments + --- + duration_ms: 74.094012 + type: 'test' + ... +# Subtest: row 298 (Q5): a host scope narrowed before the spend ends scope-changed +ok 414 - row 298 (Q5): a host scope narrowed before the spend ends scope-changed + --- + duration_ms: 67.348806 + type: 'test' + ... +# Subtest: row 298 Q4: missing scope evidence or a bad scope digest cannot authorize execution +ok 415 - row 298 Q4: missing scope evidence or a bad scope digest cannot authorize execution + --- + duration_ms: 91.015488 + type: 'test' + ... +# Subtest: row 298 T4/T8: an in-scope host grant issues, records and revokes through the existing executor +ok 416 - row 298 T4/T8: an in-scope host grant issues, records and revokes through the existing executor + --- + duration_ms: 75.481584 + type: 'test' + ... +# Subtest: row 298 T6: host enrollment stays open for human Approve even with both methods in scope +ok 417 - row 298 T6: host enrollment stays open for human Approve even with both methods in scope + --- + duration_ms: 49.413956 + type: 'test' + ... +# Subtest: row 298: scope without an organization revision never closes automatically +ok 418 - row 298: scope without an organization revision never closes automatically + --- + duration_ms: 47.033389 + type: 'test' + ... +# Subtest: REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary +ok 419 - REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary + --- + duration_ms: 1.222736 + type: 'test' + ... +# Subtest: REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable +ok 420 - REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable + --- + duration_ms: 19.429751 + type: 'test' + ... +# Subtest: REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it +ok 421 - REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it + --- + duration_ms: 406.817837 + type: 'test' + ... +# Subtest: REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human +ok 422 - REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human + --- + duration_ms: 164.534563 + type: 'test' + ... +# Subtest: REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it +ok 423 - REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it + --- + duration_ms: 50.564437 + type: 'test' + ... +# Subtest: REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation +ok 424 - REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation + --- + duration_ms: 64.856637 + type: 'test' + ... +# Subtest: REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human +ok 425 - REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human + --- + duration_ms: 97.411789 + type: 'test' + ... +# Subtest: Q169: the chief of staff's end of the assistant stops every thread run; its own run and another ender's are refused +ok 426 - Q169: the chief of staff's end of the assistant stops every thread run; its own run and another ender's are refused + --- + duration_ms: 48.394996 + type: 'test' + ... +# Subtest: Q169: a revoke of the assistant the chief of staff raises goes to the human, cited or not, and no arbiter resolves it +ok 427 - Q169: a revoke of the assistant the chief of staff raises goes to the human, cited or not, and no arbiter resolves it + --- + duration_ms: 116.847836 + type: 'test' + ... +# Subtest: Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused +ok 428 - Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused + --- + duration_ms: 63.180913 + type: 'test' + ... +# Subtest: Q169: a revoke of the assistant citing a decision the human resolved stops its thread run +ok 429 - Q169: a revoke of the assistant citing a decision the human resolved stops its thread run + --- + duration_ms: 54.499453 + type: 'test' + ... +# Subtest: Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes +ok 430 - Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes + --- + duration_ms: 54.50334 + type: 'test' + ... +# Subtest: Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human +ok 431 - Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human + --- + duration_ms: 83.073035 + type: 'test' + ... +# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd +ok 432 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd + --- + duration_ms: 88.670113 + type: 'test' + ... +# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range +ok 433 - row 280: every injected picker sample is unprivileged and outside the ephemeral range + --- + duration_ms: 0.516384 + type: 'test' + ... +# Subtest: the executor tests need sshd, ssh, ssh-agent, ssh-add, ssh-keygen and setpriv: a missing one fails, never skips +ok 434 - the executor tests need sshd, ssh, ssh-agent, ssh-add, ssh-keygen and setpriv: a missing one fails, never skips + --- + duration_ms: 0.174602 + type: 'test' + ... +# Subtest: T3: organization.set, limits.set and instances.set refuse hosts, and the writer never runs +ok 435 - T3: organization.set, limits.set and instances.set refuse hosts, and the writer never runs + --- + duration_ms: 31.078589 + type: 'test' + ... +# Subtest: T4: the value check takes one unencrypted ed25519 key and nothing else +ok 436 - T4: the value check takes one unencrypted ed25519 key and nothing else + --- + duration_ms: 172.679003 + type: 'test' + ... +# Subtest: T5 to T8: registry, grant, argv shape and allowlist refusals +ok 437 - T5 to T8: registry, grant, argv shape and allowlist refusals + --- + duration_ms: 518.680272 + type: 'test' + ... +# Subtest: T9: under 1.7 every call needs a decision bound to its host, argv and stdin, spent once +ok 438 - T9: under 1.7 every call needs a decision bound to its host, argv and stdin, spent once + --- + duration_ms: 295.802186 + type: 'test' + ... +# Subtest: T10, T11: argv reaches sudo unchanged after sudo -n -- +ok 439 - T10, T11: argv reaches sudo unchanged after sudo -n -- + --- + duration_ms: 261.503665 + type: 'test' + ... +# Subtest: T12, T13: exit code passes through, the timeout kills the group, output is capped +ok 440 - T12, T13: exit code passes through, the timeout kills the group, output is capped + --- + duration_ms: 1507.126074 + type: 'test' + ... +# Subtest: T14: a host key not in the registry refuses and nothing runs +ok 441 - T14: a host key not in the registry refuses and nothing runs + --- + duration_ms: 172.994314 + type: 'test' + ... +# Subtest: G18: hosts.check with a wrong pin refuses host-key-mismatch and runs nothing on the host +ok 442 - G18: hosts.check with a wrong pin refuses host-key-mismatch and runs nothing on the host + --- + duration_ms: 310.501083 + type: 'test' + ... +# Subtest: N3: a remote exit 255 that prints the pin refusal text is the command result, and an ssh failure keeps its message +ok 443 - N3: a remote exit 255 that prints the pin refusal text is the command result, and an ssh failure keeps its message + --- + duration_ms: 279.877026 + type: 'test' + ... +# Subtest: T15: ssh reads no config file and no user known_hosts +ok 444 - T15: ssh reads no config file and no user known_hosts + --- + duration_ms: 260.311487 + type: 'test' + ... +# Subtest: T16, T17: key material in output or stdin refuses credential-leak, and no event holds it +ok 445 - T16, T17: key material in output or stdin refuses credential-leak, and no event holds it + --- + duration_ms: 602.110132 + type: 'test' + ... +# Subtest: T18, T19, T20: one call at a time, no key in any argv or env, and nothing left after +ok 446 - T18, T19, T20: one call at a time, no key in any argv or env, and nothing left after + --- + duration_ms: 4639.553302 + type: 'test' + ... +# Subtest: T21: revoke kills the call in flight, and the next call refuses +ok 447 - T21: revoke kills the call in flight, and the next call refuses + --- + duration_ms: 267.60248 + type: 'test' + ... +# Subtest: T22: events carry host, address, user and argv in clear, and sizes and hashes only +ok 448 - T22: events carry host, address, user and argv in clear, and sizes and hashes only + --- + duration_ms: 259.43847 + type: 'test' + ... +# Subtest: T24: no literal gitea and vikunja kind list outside vocabulary.mjs, and the credential use sites are known +ok 449 - T24: no literal gitea and vikunja kind list outside vocabulary.mjs, and the credential use sites are known + --- + duration_ms: 17.611268 + type: 'test' + ... +# Subtest: T25: no role definition lists host.sudo while it is a hard wait +ok 450 - T25: no role definition lists host.sudo while it is a hard wait + --- + duration_ms: 0.465282 + type: 'test' + ... +# Subtest: T27: the bus child dying takes ssh and ssh-agent with it +ok 451 - T27: the bus child dying takes ssh and ssh-agent with it + --- + duration_ms: 311.282582 + type: 'test' + ... +# Subtest: T27: ssh-add -t drops the key from an agent the test keeps alive +ok 452 - T27: ssh-add -t drops the key from an agent the test keeps alive + --- + duration_ms: 3545.325351 + type: 'test' + ... +# Subtest: N2: a hung ssh-add is killed at its limit or on abort, and nothing is left running +ok 453 - N2: a hung ssh-add is killed at its limit or on abort, and nothing is left running + --- + duration_ms: 426.523785 + type: 'test' + ... +# Subtest: T27: the start sweep keeps a live bus dir and kills only a matching live process +ok 454 - T27: the start sweep keeps a live bus dir and kills only a matching live process + --- + duration_ms: 26.378813 + type: 'test' + ... +# Subtest: T27: the bus start sweeps /secrets/run before it listens, and a stray entry stops the start +ok 455 - T27: the bus start sweeps /secrets/run before it listens, and a stray entry stops the start + --- + duration_ms: 51.088468 + type: 'test' + ... +# Subtest: M3: host.run refuses host-not-granted unless the grant record has an approved, spent host grant +ok 456 - M3: host.run refuses host-not-granted unless the grant record has an approved, spent host grant + --- + duration_ms: 138.877658 + type: 'test' + ... +# Subtest: M3: a host_grants record gives Credentials a store reference at start, and a restart reads its key +ok 457 - M3: a host_grants record gives Credentials a store reference at start, and a restart reads its key + --- + duration_ms: 98.388253 + type: 'test' + ... +# Subtest: G16: the writer refuses each user, tag and key the design names, before any key file +ok 458 - G16: the writer refuses each user, tag and key the design names, before any key file + --- + duration_ms: 1853.515978 + type: 'test' + ... +# Subtest: G16: from= comes from the host file, a privileged user skips the group and sudo checks, and the line is exact +ok 459 - G16: from= comes from the host file, a privileged user skips the group and sudo checks, and the line is exact + --- + duration_ms: 478.325789 + type: 'test' + ... +# Subtest: G16: list shows tagged lines only, and add and remove never touch a line outside the tag pattern +ok 460 - G16: list shows tagged lines only, and add and remove never touch a line outside the tag pattern + --- + duration_ms: 235.31928 + type: 'test' + ... +# Subtest: G25: the writer refuses a symlinked dir or user file, a group-writable dir and an odd tmp, and writes 0644 +ok 461 - G25: the writer refuses a symlinked dir or user file, a group-writable dir and an odd tmp, and writes 0644 + --- + duration_ms: 339.37864 + type: 'test' + ... +# Subtest: G16: mosaic-keys passes the three requests to the writer through sudo and refuses anything else without it +ok 462 - G16: mosaic-keys passes the three requests to the writer through sudo and refuses anything else without it + --- + duration_ms: 70.819307 + type: 'test' + ... +# Subtest: E3: the sudoers line and the sshd drop-in are the design lines and parse +ok 463 - E3: the sudoers line and the sshd drop-in are the design lines and parse + --- + duration_ms: 12.028271 + type: 'test' + ... +# Subtest: human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse +ok 464 - human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse + --- + duration_ms: 1.369741 + type: 'test' + ... +# Subtest: process reader gets own kernel identity without exposing environment values +ok 465 - process reader gets own kernel identity without exposing environment values + --- + duration_ms: 0.380374 + type: 'test' + ... +# Subtest: EACCES ancestor environments skip only markers; commands and registered launches still refuse +ok 466 - EACCES ancestor environments skip only markers; commands and registered launches still refuse + --- + duration_ms: 0.543508 + type: 'test' + ... +# Subtest: real pid 1 remains inspectable when its environment is protected +ok 467 - real pid 1 remains inspectable when its environment is protected + --- + duration_ms: 0.21486 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 165: instances and instances.set refuse every non-human session but the tester, the chief of staff included, and pass the verified actor +ok 468 - row 165: instances and instances.set refuse every non-human session but the tester, the chief of staff included, and pass the verified actor + --- + duration_ms: 34.670868 + type: 'test' + ... +# Subtest: row 165 runtime: an add and a change reach the organization file with the human as actor; each refusal keeps the bytes and logs nothing +ok 469 - row 165 runtime: an add and a change reach the organization file with the human as actor; each refusal keeps the bytes and logs nothing + --- + duration_ms: 115.94885 + type: 'test' + ... +# Subtest: row 194 T12: agent and reader sessions refuse veto.set; the tester gets add and change but not delete or veto.set; the human passes the hook for each listed verb +ok 470 - row 194 T12: agent and reader sessions refuse veto.set; the tester gets add and change but not delete or veto.set; the human passes the hook for each listed verb + --- + duration_ms: 24.966669 + type: 'test' + ... +# Subtest: system Python is a resolved root-owned ELF, never a shim or home interpreter +ok 471 - system Python is a resolved root-owned ELF, never a shim or home interpreter + --- + duration_ms: 1.914288 + type: 'test' + ... +# Subtest: real system interpreter is available and safely inspected +ok 472 - real system interpreter is available and safely inspected + --- + duration_ms: 17.546963 + type: 'test' + ... +# Subtest: restart receipt appends actual replacement identity and refuses unsafe files +ok 473 - restart receipt appends actual replacement identity and refuses unsafe files + --- + duration_ms: 2.77971 + type: 'test' + ... +# Subtest: activation gate compares fresh startup receipt to the current interpreter identity +ok 474 - activation gate compares fresh startup receipt to the current interpreter identity + --- + duration_ms: 1.37678 + type: 'test' + ... +# Subtest: non-regular startup receipt refuses promptly without waiting on a FIFO peer +ok 475 - non-regular startup receipt refuses promptly without waiting on a FIFO peer + --- + duration_ms: 28.287274 + type: 'test' + ... +# Subtest: 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 +ok 476 - 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 + --- + duration_ms: 36.144428 + type: 'test' + ... +# Subtest: checkLand refuses on the decision and the review +ok 477 - checkLand refuses on the decision and the review + --- + duration_ms: 32.176564 + type: 'test' + ... +# Subtest: REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human +ok 478 - REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human + --- + duration_ms: 79.850403 + type: 'test' + ... +# Subtest: REQ-LAND-1: a within-role merge grant refuses not-authorized at the land +ok 479 - REQ-LAND-1: a within-role merge grant refuses not-authorized at the land + --- + duration_ms: 21.205037 + type: 'test' + ... +# Subtest: a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer +ok 480 - a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer + --- + duration_ms: 24.154715 + type: 'test' + ... +# Subtest: a merge option with no first line refuses no-subject, as land-work does +ok 481 - a merge option with no first line refuses no-subject, as land-work does + --- + duration_ms: 22.260557 + type: 'test' + ... +# Subtest: checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands +ok 482 - checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands + --- + duration_ms: 56.874001 + type: 'test' + ... +# Subtest: a ticket outlives the run that asked, and recordLand checks the task again +ok 483 - a ticket outlives the run that asked, and recordLand checks the task again + --- + duration_ms: 25.656401 + type: 'test' + ... +# Subtest: two tickets on one decision: the first recordLand lands, the second refuses decision-consumed and records nothing +ok 484 - two tickets on one decision: the first recordLand lands, the second refuses decision-consumed and records nothing + --- + duration_ms: 26.535702 + type: 'test' + ... +# Subtest: landRefused files the code on the task, tells the role only with notify, and ends the ticket +ok 485 - landRefused files the code on the task, tells the role only with notify, and ends the ticket + --- + duration_ms: 26.263244 + type: 'test' + ... +# Subtest: landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread +ok 486 - landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread + --- + duration_ms: 25.848676 + type: 'test' + ... +# Subtest: landHolders lists a merge decision exactly while landHeld is true for its non-thread instance, in decision order +ok 487 - landHolders lists a merge decision exactly while landHeld is true for its non-thread instance, in decision order + --- + duration_ms: 37.506391 + type: 'test' + ... +# Subtest: landHolders leaves out a thread instance's decision, even one raised before its role became one +ok 488 - landHolders leaves out a thread instance's decision, even one raised before its role became one + --- + duration_ms: 22.196409 + type: 'test' + ... +# Subtest: landRelease releases the holding run by land-relaunch once it has asked message.receive and nothing delivered to it is unread, and waiting messages go to the next holder +ok 489 - landRelease releases the holding run by land-relaunch once it has asked message.receive and nothing delivered to it is unread, and waiting messages go to the next holder + --- + duration_ms: 33.48402 + type: 'test' + ... +# Subtest: a landing run started after the resolution passes checkLand for its held decision before any message.receive, and lands it +ok 490 - a landing run started after the resolution passes checkLand for its held decision before any message.receive, and lands it + --- + duration_ms: 26.570305 + type: 'test' + ... +# Subtest: the bus process answers landHolders and landRelease from their own lines, not as credentialStatus +ok 491 - the bus process answers landHolders and landRelease from their own lines, not as credentialStatus + --- + duration_ms: 128.927129 + type: 'test' + ... +# Subtest: usage.begin with a decision id needs it held for the run's instance, usage.end needs the begin, and the limit checks see the landing turn +ok 492 - usage.begin with a decision id needs it held for the run's instance, usage.end needs the begin, and the limit checks see the landing turn + --- + duration_ms: 33.852471 + type: 'test' + ... +# Subtest: no run may write the action.allowed for git.merge.protected itself +ok 493 - no run may write the action.allowed for git.merge.protected itself + --- + duration_ms: 17.275605 + type: 'test' + ... +# Subtest: a message to a stopped role sends launch.by one notice, and the result says so +ok 494 - a message to a stopped role sends launch.by one notice, and the result says so + --- + duration_ms: 25.474114 + type: 'test' + ... +# Subtest: a message to a role outside launch.instances says so in its result and in the notice +ok 495 - a message to a role outside launch.instances says so in its result and in the notice + --- + duration_ms: 15.031631 + type: 'test' + ... +# Subtest: a message to a running role sends no notice and its result is unchanged +ok 496 - a message to a running role sends no notice and its result is unchanged + --- + duration_ms: 12.117634 + type: 'test' + ... +# Subtest: a re-route at a claim, a release and claim, and a broker restart send no second notice +ok 497 - a re-route at a claim, a release and claim, and a broker restart send no second notice + --- + duration_ms: 19.610121 + type: 'test' + ... +# Subtest: a run launched but not yet claimed counts as no holder +ok 498 - a run launched but not yet claimed counts as no holder + --- + duration_ms: 12.306908 + type: 'test' + ... +# Subtest: no notice for a message to launch.by, from it, a refused one from a tester, to the human, or in a thread to a thread instance +ok 499 - no notice for a message to launch.by, from it, a refused one from a tester, to the human, or in a thread to a thread instance + --- + duration_ms: 23.097687 + type: 'test' + ... +# Subtest: a business with no launch block tells nobody and says there is no launcher +ok 500 - a business with no launch block tells nobody and says there is no launcher + --- + duration_ms: 10.923045 + type: 'test' + ... +# Subtest: the notice sender stays internal: no role is named _bus and no caller can send as it or to it +ok 501 - the notice sender stays internal: no role is named _bus and no caller can send as it or to it + --- + duration_ms: 29.110169 + type: 'test' + ... +# Subtest: row 302 a run threadIdle released answers launcher-released on receive, state, read and send, logs each, and claims nothing again +ok 502 - row 302 a run threadIdle released answers launcher-released on receive, state, read and send, logs each, and claims nothing again + --- + duration_ms: 40.334546 + type: 'test' + ... +# Subtest: row 302 with a run launcher-released, a run that lost its claim another way still answers not-holder +ok 503 - row 302 with a run launcher-released, a run that lost its claim another way still answers not-holder + --- + duration_ms: 29.866146 + type: 'test' + ... +# Subtest: row 302 a run landRelease released answers launcher-released, and claims nothing again +ok 504 - row 302 a run landRelease released answers launcher-released, and claims nothing again + --- + duration_ms: 29.785985 + type: 'test' + ... +# Subtest: C2-03b T6: the slot before any chief evidence, then the listed chief's live grant +ok 505 - C2-03b T6: the slot before any chief evidence, then the listed chief's live grant + --- + duration_ms: 24.703862 + type: 'test' + ... +# Subtest: C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended +ok 506 - C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended + --- + duration_ms: 270.39987 + type: 'test' + ... +# Subtest: C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again +ok 507 - C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again + --- + duration_ms: 30.591815 + type: 'test' + ... +# Subtest: C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant +ok 508 - C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant + --- + duration_ms: 28.873196 + type: 'test' + ... +# Subtest: C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses +ok 509 - C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses + --- + duration_ms: 15.440101 + type: 'test' + ... +# library: {"event":"library-sync-refused","business":"acme","project":"books","code":"library-state-invalid"} +# Subtest: C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 +not ok 510 - C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 + --- + duration_ms: 622.568721 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/tests/library-credential.test.mjs:265:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly deep-equal: + + actual - expected + + Comparison { + + code: 'library-sync-busy' + - code: 'library-fetch-no-grant' + } + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: + code: 'library-fetch-no-grant' + actual: + error: 'library-sync-busy' + stack: |- + #requestLibrary (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/src/broker.mjs:5386:68) + async waitForActual (node:assert:615:5) + async strict.rejects (node:assert:738:25) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/tests/library-credential.test.mjs:317:3) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + operator: 'rejects' + stack: |- + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/tests/library-credential.test.mjs:317:3) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-03a library.sync: every agent, the tester and a reader are refused before the adapter runs +ok 511 - C2-03a library.sync: every agent, the tester and a reader are refused before the adapter runs + --- + duration_ms: 18.449165 + type: 'test' + ... +# Subtest: C2-03a library.sync: the human fetches, accept passes through, and a held sync is a recorded refusal +ok 512 - C2-03a library.sync: the human fetches, accept passes through, and a held sync is a recorded refusal + --- + duration_ms: 17.089184 + type: 'test' + ... +# Subtest: C2-03a library.sync: a LibraryError keeps its code and a host without sync is not configured +ok 513 - C2-03a library.sync: a LibraryError keeps its code and a host without sync is not configured + --- + duration_ms: 23.889753 + type: 'test' + ... +# Subtest: C2-03a runtime: a librarySync from a boot config, with no function, is refused +ok 514 - C2-03a runtime: a librarySync from a boot config, with no function, is refused + --- + duration_ms: 1.119977 + type: 'test' + ... +# Subtest: C2-03a runtime: the timer syncs each entry with a user at start and on each tick, logs codes only, and stops on close +ok 515 - C2-03a runtime: the timer syncs each entry with a user at start and on each tick, logs codes only, and stops on close + --- + duration_ms: 540.752392 + type: 'test' + ... +# Subtest: row 254 human-cli: library.sync outlasts the 5 s client default, and library.status does not +ok 516 - row 254 human-cli: library.sync outlasts the 5 s client default, and library.status does not + --- + duration_ms: 6082.260509 + type: 'test' + ... +# Subtest: C2-04 M4: both verbs reject every agent before arguments or adapter access +ok 517 - C2-04 M4: both verbs reject every agent before arguments or adapter access + --- + duration_ms: 35.977073 + type: 'test' + ... +# Subtest: C2-04 bus: human reads validate keys and return adapter results without path leakage +ok 518 - C2-04 bus: human reads validate keys and return adapter results without path leakage + --- + duration_ms: 13.588419 + type: 'test' + ... +# Subtest: C2-04 socket: each async library verb resolves its result rather than serializing {} +ok 519 - C2-04 socket: each async library verb resolves its result rather than serializing {} + --- + duration_ms: 67.314452 + type: 'test' + ... +# Subtest: C2-04 runtime: protectedRoots skips library but retains real code-root credential protection +ok 520 - C2-04 runtime: protectedRoots skips library but retains real code-root credential protection + --- + duration_ms: 95.483921 + type: 'test' + ... +# Subtest: C2-04 runtime: unsafe existing mirror refuses boot and never publishes a socket +ok 521 - C2-04 runtime: unsafe existing mirror refuses boot and never publishes a socket + --- + duration_ms: 23.925824 + type: 'test' + ... +# Subtest: C2-04 runtime: real library adapters reach the socket and lock waits leave other bus reads responsive +ok 522 - C2-04 runtime: real library adapters reach the socket and lock waits leave other bus reads responsive + --- + duration_ms: 201.095456 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store +ok 523 - T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store + --- + duration_ms: 86.901195 + type: 'test' + ... +# Subtest: T20 fire: an instance already delisted still has its tokens revoked and the file is left alone +ok 524 - T20 fire: an instance already delisted still has its tokens revoked and the file is left alone + --- + duration_ms: 49.69631 + type: 'test' + ... +# Subtest: T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on +ok 525 - T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on + --- + duration_ms: 53.544037 + type: 'test' + ... +# Subtest: T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot +ok 526 - T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot + --- + duration_ms: 66.620475 + type: 'test' + ... +# Subtest: T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses +ok 527 - T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses + --- + duration_ms: 52.469558 + type: 'test' + ... +# Subtest: T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything +ok 528 - T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything + --- + duration_ms: 55.03914 + type: 'test' + ... +# Subtest: row 281 T1 fire: a host. or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged +ok 529 - row 281 T1 fire: a host. or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged + --- + duration_ms: 52.517185 + type: 'test' + ... +# Subtest: row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued +ok 530 - row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued + --- + duration_ms: 48.907451 + type: 'test' + ... +# Subtest: row 194 T12: agent and reader sessions refuse the lifecycle verbs before any effect; the tester gets launch, end and the request read, never regenerate +ok 531 - row 194 T12: agent and reader sessions refuse the lifecycle verbs before any effect; the tester gets launch, end and the request read, never regenerate + --- + duration_ms: 36.180421 + type: 'test' + ... +# Subtest: row 194 V2 and V4 at the verb: the request is open, by the human, with a human.input; thread, retired, unknown and revoked refuse with no event +ok 532 - row 194 V2 and V4 at the verb: the request is open, by the human, with a human.input; thread, retired, unknown and revoked refuse with no event + --- + duration_ms: 20.223839 + type: 'test' + ... +# Subtest: row 194 D1.1 take: a request is taken once, closes once, and lifecycleRequests lists only what is not closed +ok 533 - row 194 D1.1 take: a request is taken once, closes once, and lifecycleRequests lists only what is not closed + --- + duration_ms: 15.542162 + type: 'test' + ... +# Subtest: row 194 D1.1 take: a launch.revoke after the request closes it launch-revoked, and a request past 60 s closes request-expired +ok 534 - row 194 D1.1 take: a launch.revoke after the request closes it launch-revoked, and a request past 60 s closes request-expired + --- + duration_ms: 18.656859 + type: 'test' + ... +# Subtest: row 194 T15 (bus): while halted, launch and regenerate refuse processing-halted at the verb and at the take, hire and fire refuse, terminate goes; an unreadable switch refuses with its code +ok 535 - row 194 T15 (bus): while halted, launch and regenerate refuse processing-halted at the verb and at the take, hire and fire refuse, terminate goes; an unreadable switch refuses with its code + --- + duration_ms: 27.866547 + type: 'test' + ... +# Subtest: row 194 T12a: the tester launches and ends on its own business with actor tester; bus.tester off in the file refuses the call and the take tester-off +ok 536 - row 194 T12a: the tester launches and ends on its own business with actor tester; bus.tester off in the file refuses the call and the take tester-off + --- + duration_ms: 21.762857 + type: 'test' + ... +# Subtest: row 194 V3 terminate: claims revoked, open requests cancelled, bound runs named, taken requests listed; nothing at all answers not-held +ok 537 - row 194 V3 terminate: claims revoked, open requests cancelled, bound runs named, taken requests listed; nothing at all answers not-held + --- + duration_ms: 26.1708 + type: 'test' + ... +# Subtest: row 194 V3 terminate of a thread instance: the human ends every thread, the tester only its own +ok 538 - row 194 V3 terminate of a thread instance: the human ends every thread, the tester only its own + --- + duration_ms: 19.923828 + type: 'test' + ... +# Subtest: row 194 T6 V5 order at the verb: the writer's named refusals, then instance-running, instance-starting, the last-listed refusal and the revision +ok 539 - row 194 T6 V5 order at the verb: the writer's named refusals, then instance-running, instance-starting, the last-listed refusal and the revision + --- + duration_ms: 28.97417 + type: 'test' + ... +# Subtest: row 194 V5: an open launch past its 60 s is not starting, as it can only close request-expired +ok 540 - row 194 V5: an open launch past its 60 s is not starting, as it can only close request-expired + --- + duration_ms: 11.971608 + type: 'test' + ... +# Subtest: row 194 V5 after the take: lifecycleDelete re-checks running and starting, then commits through the writer with the human as actor +ok 541 - row 194 V5 after the take: lifecycleDelete re-checks running and starting, then commits through the writer with the human as actor + --- + duration_ms: 21.654 + type: 'test' + ... +# Subtest: row 194 V5 retry: a retired name deletes again only after workspace-rename-failed, and that request commits nothing +ok 542 - row 194 V5 retry: a retired name deletes again only after workspace-rename-failed, and that request commits nothing + --- + duration_ms: 18.416784 + type: 'test' + ... +# Subtest: row 194 V5 runtime: a delete request, the take and lifecycleDelete commit the file with retired, log the human and reload so the name no longer binds +ok 543 - row 194 V5 runtime: a delete request, the take and lifecycleDelete commit the file with retired, log the human and reload so the name no longer binds + --- + duration_ms: 129.194044 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers +ok 544 - REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers + --- + duration_ms: 1.220371 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names +ok 545 - REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names + --- + duration_ms: 0.203546 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced +ok 546 - REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced + --- + duration_ms: 13.624666 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count +ok 547 - REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count + --- + duration_ms: 13.399507 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through +ok 548 - REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through + --- + duration_ms: 11.835473 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time +ok 549 - REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time + --- + duration_ms: 13.466489 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code +ok 550 - REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code + --- + duration_ms: 12.315338 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer +ok 551 - REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer + --- + duration_ms: 14.747618 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded +ok 552 - REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded + --- + duration_ms: 10.810657 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check +ok 553 - REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check + --- + duration_ms: 9.037438 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report +ok 554 - REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report + --- + duration_ms: 10.235159 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws +ok 555 - REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws + --- + duration_ms: 9.921457 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report +ok 556 - REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report + --- + duration_ms: 0.437506 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set +ok 557 - REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set + --- + duration_ms: 15.357127 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name +ok 558 - REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name + --- + duration_ms: 10.536568 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 core reaches limit checks only through the plug-in loader +ok 559 - REQ-LIMIT-3 core reaches limit checks only through the plug-in loader + --- + duration_ms: 0.966303 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check +ok 560 - REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check + --- + duration_ms: 32.784899 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit +ok 561 - REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit + --- + duration_ms: 32.678874 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code +ok 562 - REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code + --- + duration_ms: 78.445296 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit +ok 563 - REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit + --- + duration_ms: 21.290056 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a broker with no limit checks configured never stops a run +ok 564 - REQ-LIMIT-4 a broker with no limit checks configured never stops a run + --- + duration_ms: 13.97648 + type: 'test' + ... +# limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0} +# organization: {"event":"reload-needs-restart","business":"demo"} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"9226e8d4-422c-4b25-8d70-38f4ef972f42","source":"@none","code":"baseline-unknown"} +# limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"0d36491f-6618-4266-98fc-43840d215068","source":"@none","code":"baseline-unknown"} +# Subtest: REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since +# organization: {"event":"reload-needs-restart","business":"demo"} +ok 565 - REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since + --- + duration_ms: 137.829242 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed +ok 566 - REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed + --- + duration_ms: 34.631228 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive +ok 567 - REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive + --- + duration_ms: 47.504733 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 +ok 568 - REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 + --- + duration_ms: 47.264084 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn +ok 569 - REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn + --- + duration_ms: 63.504556 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: limits binds actor from human proof and rejects role, reader, a tester set and forged actor +ok 570 - limits binds actor from human proof and rejects role, reader, a tester set and forged actor + --- + duration_ms: 22.736242 + type: 'test' + ... +# Subtest: runtime wires verified human settings to the actual shared file writer and actor receipt +ok 571 - runtime wires verified human settings to the actual shared file writer and actor receipt + --- + duration_ms: 97.042952 + type: 'test' + ... +# Subtest: uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled +ok 572 - uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled + --- + duration_ms: 51.723692 + type: 'test' + ... +# Subtest: within-role sends cite an open gated launch decision without spending it or naming it in grants +ok 573 - within-role sends cite an open gated launch decision without spending it or naming it in grants + --- + duration_ms: 27.533658 + type: 'test' + ... +# Subtest: missing and foreign-business citations refuse and roll back message and grant +ok 574 - missing and foreign-business citations refuse and roll back message and grant + --- + duration_ms: 17.824271 + type: 'test' + ... +# Subtest: cross-role sends still need a matching resolved decision and consume it once +ok 575 - cross-role sends still need a matching resolved decision and consume it once + --- + duration_ms: 21.8209 + type: 'test' + ... +# Subtest: trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester +ok 576 - trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester + --- + duration_ms: 25.106465 + type: 'test' + ... +# Subtest: replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester +ok 577 - replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester + --- + duration_ms: 23.557396 + type: 'test' + ... +# Subtest: trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events +ok 578 - trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events + --- + duration_ms: 28.932726 + type: 'test' + ... +# Subtest: replies leaves out other users thread messages and still fills a page +ok 579 - replies leaves out other users thread messages and still fills a page + --- + duration_ms: 173.719399 + type: 'test' + ... +# Subtest: messages in the business human and tester threads are not hidden (row 177 unchanged) +ok 580 - messages in the business human and tester threads are not hidden (row 177 unchanged) + --- + duration_ms: 35.110811 + type: 'test' + ... +# Subtest: governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages +ok 581 - governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages + --- + duration_ms: 91.546684 + type: 'test' + ... +# Subtest: messages pages all human messages newest first without writes; read state is history +ok 582 - messages pages all human messages newest first without writes; read state is history + --- + duration_ms: 295.494026 + type: 'test' + ... +# Subtest: messages refuses role callers, invalid paging and cursors outside this human feed +ok 583 - messages refuses role callers, invalid paging and cursors outside this human feed + --- + duration_ms: 23.287966 + type: 'test' + ... +# Subtest: views messages passes only its paging arguments through +ok 584 - views messages passes only its paging arguments through + --- + duration_ms: 0.260129 + type: 'test' + ... +# Subtest: messages isolates businesses even with a valid foreign cursor +ok 585 - messages isolates businesses even with a valid foreign cursor + --- + duration_ms: 16.92949 + type: 'test' + ... +# Subtest: the assistant sends to the user and to the chief of staff only +ok 586 - the assistant sends to the user and to the chief of staff only + --- + duration_ms: 34.362936 + type: 'test' + ... +# Subtest: an assistant send to any other role, or to the tester, is refused and logged +ok 587 - an assistant send to any other role, or to the tester, is refused and logged + --- + duration_ms: 29.702326 + type: 'test' + ... +# Subtest: only the user and the chief of staff may send to the assistant; the tester is refused by default +ok 588 - only the user and the chief of staff may send to the assistant; the tester is refused by default + --- + duration_ms: 29.55999 + type: 'test' + ... +# Subtest: REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing +ok 589 - REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing + --- + duration_ms: 25.255965 + type: 'test' + ... +# Subtest: a sender-side list alone refuses a send to a role that has no list +ok 590 - a sender-side list alone refuses a send to a role that has no list + --- + duration_ms: 27.406591 + type: 'test' + ... +# Subtest: a target-side list alone refuses a send from a role that has no list +ok 591 - a target-side list alone refuses a send from a role that has no list + --- + duration_ms: 27.910159 + type: 'test' + ... +# Subtest: the sender list is checked before the target list +ok 592 - the sender list is checked before the target list + --- + duration_ms: 25.596942 + type: 'test' + ... +# Subtest: roles without the field behave exactly as before +ok 593 - roles without the field behave exactly as before + --- + duration_ms: 37.649237 + type: 'test' + ... +# Subtest: a business with no role definitions at all is unlimited +ok 594 - a business with no role definitions at all is unlimited + --- + duration_ms: 30.870433 + type: 'test' + ... +# Subtest: a malformed messaging field refuses at boot +ok 595 - a malformed messaging field refuses at boot + --- + duration_ms: 12.573301 + type: 'test' + ... +# Subtest: the assistant's review.request to a reviewer is refused and logged, even with an approved decision +ok 596 - the assistant's review.request to a reviewer is refused and logged, even with an approved decision + --- + duration_ms: 29.642406 + type: 'test' + ... +# Subtest: a review.verdict to the assistant from a role outside its receiveFrom is refused and logged +ok 597 - a review.verdict to the assistant from a role outside its receiveFrom is refused and logged + --- + duration_ms: 33.617984 + type: 'test' + ... +# Subtest: review requests and verdicts between roles without the field are unchanged +ok 598 - review requests and verdicts between roles without the field are unchanged + --- + duration_ms: 25.984838 + type: 'test' + ... +# Subtest: 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name +ok 599 - 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name + --- + duration_ms: 81.700408 + type: 'test' + ... +# Subtest: REQ-MSG-2: the chief of staff names an instance under its within-role grant, and the write is logged +ok 600 - REQ-MSG-2: the chief of staff names an instance under its within-role grant, and the write is logged + --- + duration_ms: 23.845166 + type: 'test' + ... +# Subtest: REQ-MSG-2: the human names an instance through the CLI +ok 601 - REQ-MSG-2: the human names an instance through the CLI + --- + duration_ms: 17.968056 + type: 'test' + ... +# Subtest: REQ-MSG-2: a role without the grant, or holding it cross-role, is refused not-authorized +ok 602 - REQ-MSG-2: a role without the grant, or holding it cross-role, is refused not-authorized + --- + duration_ms: 18.855944 + type: 'test' + ... +# Subtest: REQ-MSG-2: a name is unique in the business and is never an instance key or a role name +ok 603 - REQ-MSG-2: a name is unique in the business and is never an instance key or a role name + --- + duration_ms: 32.335677 + type: 'test' + ... +# Subtest: REQ-MSG-2: a send by name reaches the instance and records both; a send by instance key is unchanged +ok 604 - REQ-MSG-2: a send by name reaches the instance and records both; a send by instance key is unchanged + --- + duration_ms: 27.656009 + type: 'test' + ... +# Subtest: REQ-MSG-2: an instance key beats a name that equals it, as when a later instance takes the key +ok 605 - REQ-MSG-2: an instance key beats a name that equals it, as when a later instance takes the key + --- + duration_ms: 18.117539 + type: 'test' + ... +# Subtest: REQ-MSG-2: a role name beats a name that equals it, as when a later definition takes the word (sage-0590) +ok 606 - REQ-MSG-2: a role name beats a name that equals it, as when a later definition takes the word (sage-0590) + --- + duration_ms: 19.577618 + type: 'test' + ... +# Subtest: proof receives actual peer, cap traffic never invokes helper and transient cap disconnects +ok 607 - proof receives actual peer, cap traffic never invokes helper and transient cap disconnects + --- + duration_ms: 5.732829 + type: 'test' + ... +# Subtest: proof helper error and disconnect during verification never dispatch or bind +ok 608 - proof helper error and disconnect during verification never dispatch or bind + --- + duration_ms: 1.327766 + type: 'test' + ... +# Subtest: Client receives explicit proof refusal codes without dispatch, not outcome-unknown +ok 609 - Client receives explicit proof refusal codes without dispatch, not outcome-unknown + --- + duration_ms: 36.461845 + type: 'test' + ... +# Subtest: asynchronous proof calls release their transient session on success, failure and timeout +ok 610 - asynchronous proof calls release their transient session on success, failure and timeout + --- + duration_ms: 27.999663 + type: 'test' + ... +# Subtest: T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit +ok 611 - T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit + --- + duration_ms: 221.148381 + type: 'test' + ... +# Subtest: helper output and failures fail closed including unsafe gid +ok 612 - helper output and failures fail closed including unsafe gid + --- + duration_ms: 1.581323 + type: 'test' + ... +# Subtest: helper timeout, capacity and shutdown refuse without leaving children +ok 613 - helper timeout, capacity and shutdown refuse without leaving children + --- + duration_ms: 26.83641 + type: 'test' + ... +# Subtest: missing or non-regular peer helper refuses at construction before opening the bus +ok 614 - missing or non-regular peer helper refuses at construction before opening the bus + --- + duration_ms: 0.24249 + type: 'test' + ... +# Subtest: shutdown waits for killed helper close before returning +ok 615 - shutdown waits for killed helper close before returning + --- + duration_ms: 4.855613 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor +ok 616 - plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor + --- + duration_ms: 23.488028 + type: 'test' + ... +# Subtest: 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 +ok 617 - 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 + --- + duration_ms: 105.774031 + type: 'test' + ... +# Subtest: vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed +ok 618 - vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed + --- + duration_ms: 49.911577 + type: 'test' + ... +# Subtest: principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body +ok 619 - principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body + --- + duration_ms: 1.51659 + type: 'test' + ... +# Subtest: user requires its own nonce and full walk plus immediate same-tree Console parent +ok 620 - user requires its own nonce and full walk plus immediate same-tree Console parent + --- + duration_ms: 0.436222 + type: 'test' + ... +# Subtest: tester deliberately admits agent parents but rejects managed runs and another nonce +ok 621 - tester deliberately admits agent parents but rejects managed runs and another nonce + --- + duration_ms: 0.276796 + type: 'test' + ... +# Subtest: human leaf identity is reread after walking the parents +ok 622 - human leaf identity is reread after walking the parents + --- + duration_ms: 0.165783 + type: 'test' + ... +# Subtest: console requires its own wrapper, nonce and serve parent, and a configured owner from the spawn env +ok 623 - console requires its own wrapper, nonce and serve parent, and a configured owner from the spawn env + --- + duration_ms: 1.176194 + type: 'test' + ... +# Subtest: broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly +ok 624 - broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly + --- + duration_ms: 172.376044 + type: 'test' + ... +# Subtest: startup token refusal returns safe code without value or partial listening broker +ok 625 - startup token refusal returns safe code without value or partial listening broker + --- + duration_ms: 105.461545 + type: 'test' + ... +# Subtest: loaded fixture token is absent from socket replies and SQLite, including refusal evidence +ok 626 - loaded fixture token is absent from socket replies and SQLite, including refusal evidence + --- + duration_ms: 142.589526 + type: 'test' + ... +# Subtest: killed broker leaves an explicit stale lock; another process cannot silently reclaim it +ok 627 - killed broker leaves an explicit stale lock; another process cannot silently reclaim it + --- + duration_ms: 238.842374 + type: 'test' + ... +# Subtest: trusted host registers later launches; socket clients never have a registration verb +ok 628 - trusted host registers later launches; socket clients never have a registration verb + --- + duration_ms: 149.028013 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the broker process answers the launcher's mayLaunch op with the limits' awaited decision +ok 629 - REQ-LIMIT-4 the broker process answers the launcher's mayLaunch op with the limits' awaited decision + --- + duration_ms: 132.539575 + type: 'test' + ... +# Subtest: runtime excludes declared project roots even when host supplies no repoRoots +ok 630 - runtime excludes declared project roots even when host supplies no repoRoots + --- + duration_ms: 106.204768 + type: 'test' + ... +# Subtest: a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it +ok 631 - a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it + --- + duration_ms: 132.507293 + type: 'test' + ... +# Subtest: real runtime injects the coordinator, stops its workload and mirrors stable stop events across restart +ok 632 - real runtime injects the coordinator, stops its workload and mirrors stable stop events across restart + --- + duration_ms: 165.642994 + type: 'test' + ... +# Subtest: invalid state still starts the control bus and human halt then resume repairs it +ok 633 - invalid state still starts the control bus and human halt then resume repairs it + --- + duration_ms: 62.923583 + type: 'test' + ... +# Subtest: processing halt and resume extend only the socket timeout while ordinary status retains the explicit timeout +ok 634 - processing halt and resume extend only the socket timeout while ordinary status retains the explicit timeout + --- + duration_ms: 182.112264 + type: 'test' + ... +# Subtest: a root halt aborts the active search-source signal before the normal web deadline +ok 635 - a root halt aborts the active search-source signal before the normal web deadline + --- + duration_ms: 32.501409 + type: 'test' + ... +# Subtest: processing.halt refuses agent reader and tester before any transition +ok 636 - processing.halt refuses agent reader and tester before any transition + --- + duration_ms: 21.78585 + type: 'test' + ... +# Subtest: processing.resume refuses agent reader and tester before any transition +ok 637 - processing.resume refuses agent reader and tester before any transition + --- + duration_ms: 14.244352 + type: 'test' + ... +# Subtest: human halt and clear each have one event with verified actor; launch.restore cannot clear +ok 638 - human halt and clear each have one event with verified actor; launch.restore cannot clear + --- + duration_ms: 16.572767 + type: 'test' + ... +# Subtest: all ordinary work verbs refuse before dispatch while pure reads remain available +ok 639 - all ordinary work verbs refuse before dispatch while pure reads remain available + --- + duration_ms: 28.039198 + type: 'test' + ... +# Subtest: task web authorization and bind paths refuse before external work +ok 640 - task web authorization and bind paths refuse before external work + --- + duration_ms: 14.590792 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.halt +ok 641 - recordEvent cannot forge processing.halt + --- + duration_ms: 10.672356 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.resume +ok 642 - recordEvent cannot forge processing.resume + --- + duration_ms: 10.734795 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.stop +ok 643 - recordEvent cannot forge processing.stop + --- + duration_ms: 10.339015 + type: 'test' + ... +# Subtest: recordTask poll cannot forge a processing action through its kinds filter +ok 644 - recordTask poll cannot forge a processing action through its kinds filter + --- + duration_ms: 10.500066 + type: 'test' + ... +# Subtest: recordTask self cannot forge a processing action through its kinds filter +ok 645 - recordTask self cannot forge a processing action through its kinds filter + --- + duration_ms: 10.227057 + type: 'test' + ... +# Subtest: spec read remains a read but cannot release new write work after an await +ok 646 - spec read remains a read but cannot release new write work after an await + --- + duration_ms: 15.145104 + type: 'test' + ... +# Subtest: the real socket awaits halt and resume beyond the ordinary idle deadline +ok 647 - the real socket awaits halt and resume beyond the ordinary idle deadline + --- + duration_ms: 53.443012 + type: 'test' + ... +# Subtest: a malformed processing reader never silently admits agent work +ok 648 - a malformed processing reader never silently admits agent work + --- + duration_ms: 16.146355 + type: 'test' + ... +# Subtest: halt refuses the newly landed host executor path before credentials or effects +ok 649 - halt refuses the newly landed host executor path before credentials or effects + --- + duration_ms: 13.611307 + type: 'test' + ... +# Subtest: D1: committed write with a failed receipt refuses outcome-unknown without action.allowed +ok 650 - D1: committed write with a failed receipt refuses outcome-unknown without action.allowed + --- + duration_ms: 20.858647 + type: 'test' + ... +# Subtest: D2: spec.read refuses without content if its role is released during the read +ok 651 - D2: spec.read refuses without content if its role is released during the read + --- + duration_ms: 13.652886 + type: 'test' + ... +# Subtest: D3: spec.read secret check refuses flagged content without content +ok 652 - D3: spec.read secret check refuses flagged content without content + --- + duration_ms: 13.550901 + type: 'test' + ... +# Subtest: D3: spec.read secret check refuses flagged subject without content +ok 653 - D3: spec.read secret check refuses flagged subject without content + --- + duration_ms: 13.945494 + type: 'test' + ... +# Subtest: a human lists, opens and saves; the save is one commit by the business human +ok 654 - a human lists, opens and saves; the save is one commit by the business human + --- + duration_ms: 106.762057 + type: 'test' + ... +# Subtest: an agent and a reader refuse every file verb and nothing is written +ok 655 - an agent and a reader refuse every file verb and nothing is written + --- + duration_ms: 39.507443 + type: 'test' + ... +# Subtest: a stale base refuses stale-base and writes nothing +ok 656 - a stale base refuses stale-base and writes nothing + --- + duration_ms: 64.632708 + type: 'test' + ... +# Subtest: paths outside the spec and docs refuse, as do unknown projects, missing files and odd arguments +ok 657 - paths outside the spec and docs refuse, as do unknown projects, missing files and odd arguments + --- + duration_ms: 55.250626 + type: 'test' + ... +# Subtest: without a project adapter the file verbs refuse project-not-configured +ok 658 - without a project adapter the file verbs refuse project-not-configured + --- + duration_ms: 26.279959 + type: 'test' + ... +# Subtest: on the socket a save may carry 1 MiB of text; every other request keeps the 64 KiB limit +ok 659 - on the socket a save may carry 1 MiB of text; every other request keeps the 64 KiB limit + --- + duration_ms: 219.70816 + type: 'test' + ... +# Subtest: a request that names the save verb first and another verb last is refused at 64 KiB +ok 660 - a request that names the save verb first and another verb last is refused at 64 KiB + --- + duration_ms: 57.635145 + type: 'test' + ... +# Subtest: two saves racing for one repository make one commit +ok 661 - two saves racing for one repository make one commit + --- + duration_ms: 130.814831 + type: 'test' + ... +# Subtest: Broker keeps the sandbox client import closure: only the listed imports, no lazy project import +ok 662 - Broker keeps the sandbox client import closure: only the listed imports, no lazy project import + --- + duration_ms: 1.891025 + type: 'test' + ... +# Subtest: without a trusted project adapter all three async paths refuse project-not-configured +ok 663 - without a trusted project adapter all three async paths refuse project-not-configured + --- + duration_ms: 41.196663 + type: 'test' + ... +# Subtest: real startBroker injects the project adapter for socket reads and bound-author record writes +ok 664 - real startBroker injects the project adapter for socket reads and bound-author record writes + --- + duration_ms: 185.535072 + type: 'test' + ... +# Subtest: a raise with no recorded push refuses no-push; a raise binds the latest push and shows it +ok 665 - a raise with no recorded push refuses no-push; a raise binds the latest push and shows it + --- + duration_ms: 28.662701 + type: 'test' + ... +# Subtest: happy path: the fork is the upstream repo under the agent's own user, the destination is host-built +ok 666 - happy path: the fork is the upstream repo under the agent's own user, the destination is host-built + --- + duration_ms: 22.765974 + type: 'test' + ... +# Subtest: a hard wait: no decision refuses, and a decision for another task refuses +ok 667 - a hard wait: no decision refuses, and a decision for another task refuses + --- + duration_ms: 22.324138 + type: 'test' + ... +# Subtest: r4 B4: approve while the latest push is A, push B, publish refuses decision-mismatch +ok 668 - r4 B4: approve while the latest push is A, push B, publish refuses decision-mismatch + --- + duration_ms: 44.720555 + type: 'test' + ... +# Subtest: grant and fork refusals +ok 669 - grant and fork refusals + --- + duration_ms: 40.212079 + type: 'test' + ... +# Subtest: remote-not-fork, compared without case, and remote-host-mismatch, at push +ok 670 - remote-not-fork, compared without case, and remote-host-mismatch, at push + --- + duration_ms: 79.960236 + type: 'test' + ... +# Subtest: two agents granted one project each get their own fork +ok 671 - two agents granted one project each get their own fork + --- + duration_ms: 40.8685 + type: 'test' + ... +# Subtest: the request cannot name the fork, the user or the destination +ok 672 - the request cannot name the fork, the user or the destination + --- + duration_ms: 18.507157 + type: 'test' + ... +# Subtest: one decision, one open publish: a second ticket refuses publish-busy, whatever its branch +ok 673 - one decision, one open publish: a second ticket refuses publish-busy, whatever its branch + --- + duration_ms: 46.078767 + type: 'test' + ... +# Subtest: publishRefused files the code on the task's trail and drops the ticket +ok 674 - publishRefused files the code on the task's trail and drops the ticket + --- + duration_ms: 20.279165 + type: 'test' + ... +# Subtest: git.push.remote is in neither ROUTED list and no shipped role grants it +ok 675 - git.push.remote is in neither ROUTED list and no shipped role grants it + --- + duration_ms: 0.687391 + type: 'test' + ... +# Subtest: runtime: withGitea keys from the open ticket only, and the store root is the organization dir +ok 676 - runtime: withGitea keys from the open ticket only, and the store root is the organization dir + --- + duration_ms: 94.015724 + type: 'test' + ... +# Subtest: the bus process answers the publish ops from their own lines, not launch-op-refused +ok 677 - the bus process answers the publish ops from their own lines, not launch-op-refused + --- + duration_ms: 135.388357 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 a create goes live with no restart: the new instance binds at once and the answer says restart false +ok 678 - T14 a create goes live with no restart: the new instance binds at once and the answer says restart false + --- + duration_ms: 69.092679 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 every committed verb reloads once, limits.set, routes.set, plugins.set and veto.set included, and a refused one does not +ok 679 - T14 every committed verb reloads once, limits.set, routes.set, plugins.set and veto.set included, and a refused one does not + --- + duration_ms: 77.035773 + type: 'test' + ... +# Subtest: T14 a definition change on a running instance refuses instance-running; a vars change still goes live +ok 680 - T14 a definition change on a running instance refuses instance-running; a vars change still goes live + --- + duration_ms: 59.955521 + type: 'test' + ... +# Subtest: T14 a file whose credential references differ from the boot copy is not reloaded and the write answers restart true +ok 681 - T14 a file whose credential references differ from the boot copy is not reloaded and the write answers restart true + --- + duration_ms: 46.343193 + type: 'test' + ... +# Subtest: T14 a date-only change to a credential reference still reloads: row 199 issue rewrites the date outside the reload +ok 682 - T14 a date-only change to a credential reference still reloads: row 199 issue rewrites the date outside the reload + --- + duration_ms: 46.58705 + type: 'test' + ... +# Subtest: T19 a credentialed create answers restart true; issue works only after a restart, and a later vars change goes live +ok 683 - T19 a credentialed create answers restart true; issue works only after a restart, and a later vars change goes live + --- + duration_ms: 91.758545 + type: 'test' + ... +# Subtest: T14 after a refused reload veto.set, instance.hire and instance.fire answer restart true, and a fire of a name kept since refuses before step A +ok 684 - T14 after a refused reload veto.set, instance.hire and instance.fire answer restart true, and a fire of a name kept since refuses before step A + --- + duration_ms: 96.846001 + type: 'test' + ... +# Subtest: T14 a file whose project root differs from the boot copy is not reloaded, because the Credentials store protects the boot roots +ok 685 - T14 a file whose project root differs from the boot copy is not reloaded, because the Credentials store protects the boot roots + --- + duration_ms: 43.295493 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 a file whose library mapping differs from the boot copy is not reloaded, because the mirror is ensured at start +ok 686 - T14 a file whose library mapping differs from the boot copy is not reloaded, because the mirror is ensured at start + --- + duration_ms: 178.914558 + type: 'test' + ... +# Subtest: T14 reloadBusiness refuses an unknown business, a changed human and a document the boot check refuses +ok 687 - T14 reloadBusiness refuses an unknown business, a changed human and a document the boot check refuses + --- + duration_ms: 9.822847 + type: 'test' + ... +# Subtest: a reply is listed for human and reader sessions, and its delivery rows are unchanged +ok 688 - a reply is listed for human and reader sessions, and its delivery rows are unchanged + --- + duration_ms: 34.759289 + type: 'test' + ... +# Subtest: the reply still reaches the human message.receive (mosaic talk) after the Console showed it +ok 689 - the reply still reaches the human message.receive (mosaic talk) after the Console showed it + --- + duration_ms: 19.574345 + type: 'test' + ... +# Subtest: a message with no reply gives an empty list +ok 690 - a message with no reply gives an empty list + --- + duration_ms: 15.148443 + type: 'test' + ... +# Subtest: replies come oldest first and stop at REPLIES +ok 691 - replies come oldest first and stop at REPLIES + --- + duration_ms: 73.213699 + type: 'test' + ... +# Subtest: an id that names no message in the business refuses message-not-found, and the refusal is recorded +ok 692 - an id that names no message in the business refuses message-not-found, and the refusal is recorded + --- + duration_ms: 26.811927 + type: 'test' + ... +# Subtest: strict arguments; a role session gets human-required +ok 693 - strict arguments; a role session gets human-required + --- + duration_ms: 32.167961 + type: 'test' + ... +# Subtest: views passes replies through as one call with the id +ok 694 - views passes replies through as one call with the id + --- + duration_ms: 0.197556 + type: 'test' + ... +# Subtest: requirements returns the committed list to a holding role session, and no one else +ok 695 - requirements returns the committed list to a holding role session, and no one else + --- + duration_ms: 27.051319 + type: 'test' + ... +# Subtest: the PM's prd.approve with no task, when no id fits, reaches the human's Inbox +ok 696 - the PM's prd.approve with no task, when no id fits, reaches the human's Inbox + --- + duration_ms: 15.369827 + type: 'test' + ... +# Subtest: the PM's non-blocking role.revoke with no task reaches the human's Inbox +ok 697 - the PM's non-blocking role.revoke with no task reaches the human's Inbox + --- + duration_ms: 14.883303 + type: 'test' + ... +# Subtest: a push is recorded as the action.allowed for git.push.working on the task, and only the host records one +ok 698 - a push is recorded as the action.allowed for git.push.working on the task, and only the host records one + --- + duration_ms: 30.739466 + type: 'test' + ... +# Subtest: review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST +ok 699 - review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST + --- + duration_ms: 21.586128 + type: 'test' + ... +# Subtest: review.request says which run holds the reviewer role, or null, and a null request waits for a claim +ok 700 - review.request says which run holds the reviewer role, or null, and a null request waits for a claim + --- + duration_ms: 24.041865 + type: 'test' + ... +# Subtest: review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action +ok 701 - review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action + --- + duration_ms: 32.548063 + type: 'test' + ... +# Subtest: reviewFetch answers only the addressed reviewer, for the request it cites +ok 702 - reviewFetch answers only the addressed reviewer, for the request it cites + --- + duration_ms: 21.361547 + type: 'test' + ... +# Subtest: review.verdict answers one request once, to the role that asked +ok 703 - review.verdict answers one request once, to the role that asked + --- + duration_ms: 24.525831 + type: 'test' + ... +# Subtest: task.close on a pushed task needs an approve verdict for the latest push +ok 704 - task.close on a pushed task needs an approve verdict for the latest push + --- + duration_ms: 34.871834 + type: 'test' + ... +# Subtest: a refusal the host decided is filed on the task it names, and only a task ref counts +ok 705 - a refusal the host decided is filed on the task it names, and only a task ref counts + --- + duration_ms: 20.206722 + type: 'test' + ... +# Subtest: row 306 T1: a run the timer sweep ended answers thread-revoked on every claim-needing call, logged, and its claim still refuses run-revoked +ok 706 - row 306 T1: a run the timer sweep ended answers thread-revoked on every claim-needing call, logged, and its claim still refuses run-revoked + --- + duration_ms: 34.223127 + type: 'test' + ... +# Subtest: row 306 T1: a user's request and access.reload end the run the same way, and it answers thread-revoked +ok 707 - row 306 T1: a user's request and access.reload end the run the same way, and it answers thread-revoked + --- + duration_ms: 48.141952 + type: 'test' + ... +# Subtest: row 306 T2: after the sweep, a run the human stopped and a run the limit stop ended still answer not-holder +ok 708 - row 306 T2: after the sweep, a run the human stopped and a run the limit stop ended still answer not-holder + --- + duration_ms: 30.95598 + type: 'test' + ... +# Subtest: C2-10c room.read carries exactly the thread check and current file last +ok 709 - C2-10c room.read carries exactly the thread check and current file last + --- + duration_ms: 67.271158 + type: 'test' + ... +# Subtest: C2-10c check hydration preserves unchecked rows and one broadcast with two addressees +ok 710 - C2-10c check hydration preserves unchecked rows and one broadcast with two addressees + --- + duration_ms: 15.071326 + type: 'test' + ... +# Subtest: room.open sorts all threaded instances, creates defaults, and reuses caller-owned threads +ok 711 - room.open sorts all threaded instances, creates defaults, and reuses caller-owned threads + --- + duration_ms: 24.217943 + type: 'test' + ... +# Subtest: room.open preflights instance collisions atomically +ok 712 - room.open preflights instance collisions atomically + --- + duration_ms: 15.476487 + type: 'test' + ... +# Subtest: room.open preflights owner collisions atomically +ok 713 - room.open preflights owner collisions atomically + --- + duration_ms: 14.32546 + type: 'test' + ... +# Subtest: room verbs require the human, and none is a tester verb +ok 714 - room verbs require the human, and none is a tester verb + --- + duration_ms: 19.084928 + type: 'test' + ... +# Subtest: room verbs refuse missing projects and zero member businesses +ok 715 - room verbs refuse missing projects and zero member businesses + --- + duration_ms: 28.187382 + type: 'test' + ... +# Subtest: send/read refuse a missing canonical member without effects +ok 716 - send/read refuse a missing canonical member without effects + --- + duration_ms: 15.329688 + type: 'test' + ... +# Subtest: send/read refuse a foreign-owner canonical member without effects +ok 717 - send/read refuse a foreign-owner canonical member without effects + --- + duration_ms: 16.296985 + type: 'test' + ... +# Subtest: send/read refuse a wrong-instance canonical member without effects +ok 718 - send/read refuse a wrong-instance canonical member without effects + --- + duration_ms: 19.683256 + type: 'test' + ... +# Subtest: room.send targets a key, broadcasts without tags, and preserves original text and ordinary route/input rows +ok 719 - room.send targets a key, broadcasts without tags, and preserves original text and ordinary route/input rows + --- + duration_ms: 18.196688 + type: 'test' + ... +# Subtest: current display names and repeated tags resolve once; a replaced display name is unknown +ok 720 - current display names and repeated tags resolve once; a replaced display name is unknown + --- + duration_ms: 19.15483 + type: 'test' + ... +# Subtest: a legacy name colliding with another member key is ambiguous; its own key resolves once +ok 721 - a legacy name colliding with another member key is ambiguous; its own key resolves once + --- + duration_ms: 17.9926 + type: 'test' + ... +# Subtest: unknown or non-member addressees and tags-only bodies leave no message effects +ok 722 - unknown or non-member addressees and tags-only bodies leave no message effects + --- + duration_ms: 19.838786 + type: 'test' + ... +# Subtest: messaging denial on the last target rolls back the entire broadcast; allowed subset still works +ok 723 - messaging denial on the last target rolls back the entire broadcast; allowed subset still works + --- + duration_ms: 15.126027 + type: 'test' + ... +# Subtest: a clearing last member fences the whole send; another active target still accepts +ok 724 - a clearing last member fences the whole send; another active target still accepts + --- + duration_ms: 19.440099 + type: 'test' + ... +# Subtest: room.read groups one send, pages by the last grouped id, and rejects foreign or absent cursors +ok 725 - room.read groups one send, pages by the last grouped id, and rejects foreign or absent cursors + --- + duration_ms: 29.876474 + type: 'test' + ... +# Subtest: room.read keeps identical sends at the same timestamp separate and includes every session +ok 726 - room.read keeps identical sends at the same timestamp separate and includes every session + --- + duration_ms: 29.869509 + type: 'test' + ... +# Subtest: room.read defaults and caps the number of merged entries, not recipient rows +ok 727 - room.read defaults and caps the number of merged entries, not recipient rows + --- + duration_ms: 471.442399 + type: 'test' + ... +# Subtest: room.read includes an agent reply with its thread and instance without merging it with human rows +ok 728 - room.read includes an agent reply with its thread and instance without merging it with human rows + --- + duration_ms: 21.657481 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 65: routes and routes.set refuse every non-human session, the chief of staff included, the tester may read and set, and each passes the verified actor +ok 729 - row 65: routes and routes.set refuse every non-human session, the chief of staff included, the tester may read and set, and each passes the verified actor + --- + duration_ms: 34.190334 + type: 'test' + ... +# Subtest: row 65: a new launch binds only on a switched-on harness with a module name, and a run an earlier broker bound binds again after its harness is switched off +ok 730 - row 65: a new launch binds only on a switched-on harness with a module name, and a run an earlier broker bound binds again after its harness is switched off + --- + duration_ms: 21.705997 + type: 'test' + ... +# Subtest: row 65 runtime: harnessLevels answers each module in the tree, and null for a name with no module +ok 731 - row 65 runtime: harnessLevels answers each module in the tree, and null for a name with no module + --- + duration_ms: 41.528967 + type: 'test' + ... +# Subtest: row 65 runtime: routes and routes.set reach the organization file with the human as actor, a new bind reads plugins.harness, and each refusal keeps the bytes and logs nothing +ok 732 - row 65 runtime: routes and routes.set reach the organization file with the human as actor, a new bind reads plugins.harness, and each refusal keeps the bytes and logs nothing + --- + duration_ms: 81.288479 + type: 'test' + ... +# Subtest: v3b prototype refusals, views and append-only mutations +ok 733 - v3b prototype refusals, views and append-only mutations + --- + duration_ms: 85.951235 + type: 'test' + ... +# Subtest: T4 D7: a clear of a held default session fences it, drains at the next receive, retires at the exit proof and moves the default +ok 734 - T4 D7: a clear of a held default session fences it, drains at the next receive, retires at the exit proof and moves the default + --- + duration_ms: 43.210695 + type: 'test' + ... +# Subtest: T4 D7: an unheld session drains at accept, its proof is run null, and a non-default clear leaves the default +ok 735 - T4 D7: an unheld session drains at accept, its proof is run null, and a non-default clear leaves the default + --- + duration_ms: 18.164094 + type: 'test' + ... +# Subtest: T4 D7: a run that ends before its next receive drains at its end, with its generation +ok 736 - T4 D7: a run that ends before its next receive drains at its end, with its generation + --- + duration_ms: 17.255503 + type: 'test' + ... +# Subtest: T4 D7: a run whose turn is running (delivered, unread) stays clearing; uncertain is recorded once and nothing more +ok 737 - T4 D7: a run whose turn is running (delivered, unread) stays clearing; uncertain is recorded once and nothing more + --- + duration_ms: 25.815356 + type: 'test' + ... +# Subtest: T4 D7 B1: undelivered inputs are cancelled with receipts at accept, never delivered to the successor, and a routed reply is cancelled at arrival +ok 738 - T4 D7 B1: undelivered inputs are cancelled with receipts at accept, never delivered to the successor, and a routed reply is cancelled at arrival + --- + duration_ms: 30.221403 + type: 'test' + ... +# Subtest: T4 D7: repeat, conflict, a second op, a stale revision, confirm and a halt +ok 739 - T4 D7: repeat, conflict, a second op, a stale revision, confirm and a halt + --- + duration_ms: 27.399776 + type: 'test' + ... +# Subtest: T4 Q4: the successor takes -N, the next N free, and a bound name stays taken +ok 740 - T4 Q4: the successor takes -N, the next N free, and a bound name stays taken + --- + duration_ms: 21.519458 + type: 'test' + ... +# Subtest: T4 D8: the successor start is held, refused or started, each report on its own counter +ok 741 - T4 D8: the successor start is held, refused or started, each report on its own counter + --- + duration_ms: 21.454397 + type: 'test' + ... +# Subtest: T4 D7 N4: a halt at retirement waits and writes nothing; retirement goes once processing resumes +ok 742 - T4 D7 N4: a halt at retirement waits and writes nothing; retirement goes once processing resumes + --- + duration_ms: 17.009235 + type: 'test' + ... +# Subtest: T4 sage-2828: a cancel before retirement makes the session active again, keeps the claim and the cancelled messages, and never makes the successor +ok 743 - T4 sage-2828: a cancel before retirement makes the session active again, keeps the claim and the cancelled messages, and never makes the successor + --- + duration_ms: 25.74645 + type: 'test' + ... +# Subtest: T4 sage-2828 sage-2830: a cancel after retirement ends the startup only, and a later thread-only send makes the successor pending as new input +ok 744 - T4 sage-2828 sage-2830: a cancel after retirement ends the startup only, and a later thread-only send makes the successor pending as new input + --- + duration_ms: 20.200503 + type: 'test' + ... +# Subtest: T4 N4: a user's thread whose grant is gone by retirement ends the clear failed, writes no successor, and leaves the session as it was +ok 745 - T4 N4: a user's thread whose grant is gone by retirement ends the clear failed, writes no successor, and leaves the session as it was + --- + duration_ms: 20.364557 + type: 'test' + ... +# Subtest: T4 N4: a user's thread whose grant is live at retirement retires the session and makes its successor +ok 746 - T4 N4: a user's thread whose grant is live at retirement retires the session and makes its successor + --- + duration_ms: 19.21061 + type: 'test' + ... +# Subtest: T4 sage-2828: a cancel after the successor started refuses session-clear-complete +ok 747 - T4 sage-2828: a cancel after the successor started refuses session-clear-complete + --- + duration_ms: 18.066825 + type: 'test' + ... +# Subtest: T4 B2: a run bound to a clearing session refuses its claim, and claims again once the clear is cancelled +ok 748 - T4 B2: a run bound to a clearing session refuses its claim, and claims again once the clear is cancelled + --- + duration_ms: 19.658333 + type: 'test' + ... +# Subtest: T4 mos-1325: the tester clears its own thread; its clear, cancel and operation on a human-owned thread refuse thread-not-owned and write nothing +ok 749 - T4 mos-1325: the tester clears its own thread; its clear, cancel and operation on a human-owned thread refuse thread-not-owned and write nothing + --- + duration_ms: 23.820375 + type: 'test' + ... +# Subtest: T4 schema: session_ops and message_cancels are append-only, and a second open clear of a session is refused below the broker +ok 750 - T4 schema: session_ops and message_cancels are append-only, and a second open clear of a session is refused below the broker + --- + duration_ms: 18.143588 + type: 'test' + ... +# Subtest: T4 schema: a 3m store migrates to 3n, session_ops and message_cancels are new and empty, and every other row stays as it was +ok 751 - T4 schema: a 3m store migrates to 3n, session_ops and message_cancels are new and empty, and every other row stays as it was + --- + duration_ms: 87.875417 + type: 'test' + ... +# Subtest: T4 schema: the 3m engine refuses a 3n store, migrating or not, and leaves it as it was +ok 752 - T4 schema: the 3m engine refuses a 3n store, migrating or not, and leaves it as it was + --- + duration_ms: 161.59607 + type: 'test' + ... +# Subtest: session.list rows carry the reader count for each session, with its store identity +ok 753 - session.list rows carry the reader count for each session, with its store identity + --- + duration_ms: 19.271694 + type: 'test' + ... +# Subtest: a legacy session is asked for with legacy true +ok 754 - a legacy session is asked for with legacy true + --- + duration_ms: 15.638443 + type: 'test' + ... +# Subtest: without a reader the count is unknown, never 0; a reader that throws is store-unreadable +ok 755 - without a reader the count is unknown, never 0; a reader that throws is store-unreadable + --- + duration_ms: 23.904669 + type: 'test' + ... +# Subtest: compactions must be a function +ok 756 - compactions must be a function + --- + duration_ms: 7.753232 + type: 'test' + ... +# Subtest: T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies +ok 757 - T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies + --- + duration_ms: 43.695067 + type: 'test' + ... +# Subtest: T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder +ok 758 - T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder + --- + duration_ms: 36.452154 + type: 'test' + ... +# Subtest: T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing +ok 759 - T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing + --- + duration_ms: 41.908414 + type: 'test' + ... +# Subtest: session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads +ok 760 - session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads + --- + duration_ms: 29.539466 + type: 'test' + ... +# Subtest: the 3l triggers keep sessions in their thread and session ids apart from thread ids +ok 761 - the 3l triggers keep sessions in their thread and session ids apart from thread ids + --- + duration_ms: 70.0768 + type: 'test' + ... +# Subtest: T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs +ok 762 - T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs + --- + duration_ms: 97.459051 + type: 'test' + ... +# Subtest: T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was +ok 763 - T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was + --- + duration_ms: 150.151464 + type: 'test' + ... +# Subtest: gated approval authorizes once, survives store reopen, and fresh approval works +ok 764 - gated approval authorizes once, survives store reopen, and fresh approval works + --- + duration_ms: 29.047022 + type: 'test' + ... +# Subtest: another run of the same instance consumes an approval once; a failed check leaves it usable +ok 765 - another run of the same instance consumes an approval once; a failed check leaves it usable + --- + duration_ms: 18.712911 + type: 'test' + ... +# Subtest: two scheduled callers have exactly one grant and one consumed refusal +ok 766 - two scheduled callers have exactly one grant and one consumed refusal + --- + duration_ms: 14.5129 + type: 'test' + ... +# Subtest: failed commit rolls consumption back; cross-role consumes and within-role stays reusable +ok 767 - failed commit rolls consumption back; cross-role consumes and within-role stays reusable + --- + duration_ms: 27.89702 + type: 'test' + ... +# Subtest: class drift gated to cross-role refuses before consumption +ok 768 - class drift gated to cross-role refuses before consumption + --- + duration_ms: 19.463902 + type: 'test' + ... +# Subtest: class drift cross-role to gated refuses before consumption +ok 769 - class drift cross-role to gated refuses before consumption + --- + duration_ms: 20.767522 + type: 'test' + ... +# Subtest: class drift gated to within-role refuses before consumption +ok 770 - class drift gated to within-role refuses before consumption + --- + duration_ms: 19.018766 + type: 'test' + ... +# Subtest: class drift cross-role to within-role refuses before consumption +ok 771 - class drift cross-role to within-role refuses before consumption + --- + duration_ms: 20.801277 + type: 'test' + ... +# Subtest: class drift within-role to gated refuses before consumption +ok 772 - class drift within-role to gated refuses before consumption + --- + duration_ms: 17.985263 + type: 'test' + ... +# Subtest: class drift within-role to cross-role refuses before consumption +ok 773 - class drift within-role to cross-role refuses before consumption + --- + duration_ms: 17.76233 + type: 'test' + ... +# Subtest: message.send consumes approval and prevents a later send or authorize +ok 774 - message.send consumes approval and prevents a later send or authorize + --- + duration_ms: 20.893498 + type: 'test' + ... +# Subtest: role.revoke consumes approval and prevents a later revoke or authorize +ok 775 - role.revoke consumes approval and prevents a later revoke or authorize + --- + duration_ms: 23.141764 + type: 'test' + ... +# Subtest: 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations +ok 776 - 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations + --- + duration_ms: 95.453233 + type: 'test' + ... +# Subtest: a human spec save sends one notice to each pm and cto, naming the commit, and each commit sends its own +ok 777 - a human spec save sends one notice to each pm and cto, naming the commit, and each commit sends its own + --- + duration_ms: 116.105473 + type: 'test' + ... +# Subtest: no notice for a docs save, an agent record commit, a git commit outside the Console, or a refused save +ok 778 - no notice for a docs save, an agent record commit, a git commit outside the Console, or a refused save + --- + duration_ms: 134.55441 + type: 'test' + ... +# Subtest: a notice to a role no run holds waits for a claim, and launches nobody and tells nobody +ok 779 - a notice to a role no run holds waits for a claim, and launches nobody and tells nobody + --- + duration_ms: 70.097602 + type: 'test' + ... +# Subtest: a business without a pm or a cto saves the spec and sends nothing +ok 780 - a business without a pm or a cto saves the spec and sends nothing + --- + duration_ms: 58.270335 + type: 'test' + ... +# Subtest: a notice that cannot be stored answers outcome-unknown, and the commit stands +ok 781 - a notice that cannot be stored answers outcome-unknown, and the commit stands + --- + duration_ms: 67.175691 + type: 'test' + ... +# Subtest: a BLOCK reaches the chief of staff, the chief relays it to the assistant in the user's thread, and the commit stands +ok 782 - a BLOCK reaches the chief of staff, the chief relays it to the assistant in the user's thread, and the commit stands + --- + duration_ms: 75.931085 + type: 'test' + ... +# Subtest: with no thread a BLOCK still reaches the chief of staff, and the relay to the assistant is refused +ok 783 - with no thread a BLOCK still reaches the chief of staff, and the relay to the assistant is refused + --- + duration_ms: 70.273992 + type: 'test' + ... +# Subtest: within the notice's project the relay lands in the user's most recently opened thread +ok 784 - within the notice's project the relay lands in the user's most recently opened thread + --- + duration_ms: 73.053966 + type: 'test' + ... +# Subtest: a more recently opened thread in another project does not take the relay +ok 785 - a more recently opened thread in another project does not take the relay + --- + duration_ms: 73.165572 + type: 'test' + ... +# Subtest: a BLOCK is refused from anyone but a pm or cto, to anyone but the chief of staff, and outside a reply to its own notice +ok 786 - a BLOCK is refused from anyone but a pm or cto, to anyone but the chief of staff, and outside a reply to its own notice + --- + duration_ms: 78.442678 + type: 'test' + ... +# Subtest: a role cannot forge a spec notice: its text opens neither a BLOCK nor the assistant's thread +ok 787 - a role cannot forge a spec notice: its text opens neither a BLOCK nor the assistant's thread + --- + duration_ms: 70.424488 + type: 'test' + ... +# Subtest: the bus receives nothing: a reply to a notice addressed to _bus is refused +ok 788 - the bus receives nothing: a reply to a notice addressed to _bus is refused + --- + duration_ms: 68.530865 + type: 'test' + ... +# Subtest: real socket awaits spec reads, record writes and cited raises; other requests still return normally +ok 789 - real socket awaits spec reads, record writes and cited raises; other requests still return normally + --- + duration_ms: 109.917879 + type: 'test' + ... +# Subtest: real socket preserves asynchronous refusal codes and disconnects its transient proof +ok 790 - real socket preserves asynchronous refusal codes and disconnects its transient proof + --- + duration_ms: 62.127936 + type: 'test' + ... +# Subtest: two real socket writes to one repository yield one commit and one project-busy refusal +ok 791 - two real socket writes to one repository yield one commit and one project-busy refusal + --- + duration_ms: 61.32154 + type: 'test' + ... +# Subtest: client disconnect during await tolerates late reply +ok 792 - client disconnect during await tolerates late reply + --- + duration_ms: 58.813712 + type: 'test' + ... +# Subtest: client disconnect during await tolerates late refusal +ok 793 - client disconnect during await tolerates late refusal + --- + duration_ms: 43.462975 + type: 'test' + ... +# Subtest: N-a: slow admitted record.write returns its committed result after the idle deadline +ok 794 - N-a: slow admitted record.write returns its committed result after the idle deadline + --- + duration_ms: 211.935627 + type: 'test' + ... +# Subtest: current citation is recorded; docs commits do not stale it and a new spec never reopens settlement +ok 795 - current citation is recorded; docs commits do not stale it and a new spec never reopens settlement + --- + duration_ms: 100.837402 + type: 'test' + ... +# Subtest: stale, unconfirmed, missing and partial spec citations refuse without inserting a decision +ok 796 - stale, unconfirmed, missing and partial spec citations refuse without inserting a decision + --- + duration_ms: 94.479302 + type: 'test' + ... +# Subtest: uncited raises retain their synchronous path and spec read is available to any held role in its business +ok 797 - uncited raises retain their synchronous path and spec read is available to any held role in its business + --- + duration_ms: 42.608834 + type: 'test' + ... +# Subtest: record writes bind the session author, require authority and refuse spec and impersonation paths +ok 798 - record writes bind the session author, require authority and refuse spec and impersonation paths + --- + duration_ms: 48.796142 + type: 'test' + ... +# Subtest: REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it +ok 799 - REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it + --- + duration_ms: 31.30598 + type: 'test' + ... +# Subtest: REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing +ok 800 - REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing + --- + duration_ms: 26.875638 + type: 'test' + ... +# Subtest: REQ-COS-1: a pm without message.send is refused like any other gated action +ok 801 - REQ-COS-1: a pm without message.send is refused like any other gated action + --- + duration_ms: 13.833121 + type: 'test' + ... +# Subtest: REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff +ok 802 - REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff + --- + duration_ms: 36.111621 + type: 'test' + ... +# Subtest: 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 +ok 803 - 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 + --- + duration_ms: 33.749016 + type: 'test' + ... +# Subtest: 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 +ok 804 - 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 + --- + duration_ms: 32.61084 + type: 'test' + ... +# Subtest: REQ-COS-1: a refused staff request leaves no staff.request action.allowed event +ok 805 - REQ-COS-1: a refused staff request leaves no staff.request action.allowed event + --- + duration_ms: 20.248057 + type: 'test' + ... +# Subtest: REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient +ok 806 - REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient + --- + duration_ms: 51.459545 + type: 'test' + ... +# Subtest: a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted +ok 807 - a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted + --- + duration_ms: 36.395133 + type: 'test' + ... +# Subtest: REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before +ok 808 - REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before + --- + duration_ms: 20.974993 + type: 'test' + ... +# Subtest: a business that never switched launches reads allowed with no time and no event +ok 809 - a business that never switched launches reads allowed with no time and no event + --- + duration_ms: 18.784135 + type: 'test' + ... +# Subtest: launches revoked and then restored read allowed, with the restore time and event id +ok 810 - launches revoked and then restored read allowed, with the restore time and event id + --- + duration_ms: 14.925303 + type: 'test' + ... +# Subtest: a task closed on the tracker leaves the open list, and total counts the open ones +ok 811 - a task closed on the tracker leaves the open list, and total counts the open ones + --- + duration_ms: 14.71472 + type: 'test' + ... +# Subtest: a tombstone is not open +ok 812 - a tombstone is not open + --- + duration_ms: 12.933063 + type: 'test' + ... +# Subtest: the open list stops at the cap and says so; total still counts every open task +ok 813 - the open list stops at the cap and says so; total still counts every open task + --- + duration_ms: 15.942524 + type: 'test' + ... +# Subtest: a role and a reader session read state; arguments, and an unbound cap, refuse +ok 814 - a role and a reader session read state; arguments, and an unbound cap, refuse + --- + duration_ms: 14.181167 + type: 'test' + ... +# Subtest: a human session reads the same state, with the same cap +ok 815 - a human session reads the same state, with the same cap + --- + duration_ms: 15.542221 + type: 'test' + ... +# Subtest: reading state writes nothing: every table keeps its row count +ok 816 - reading state writes nothing: every table keeps its row count + --- + duration_ms: 15.049929 + type: 'test' + ... +# Subtest: creates private WAL store and excludes a second writer until explicit close +ok 817 - creates private WAL store and excludes a second writer until explicit close + --- + duration_ms: 12.013073 + type: 'test' + ... +# Subtest: rollback is atomic and schema metadata is checked against trusted DDL, not just itself +ok 818 - rollback is atomic and schema metadata is checked against trusted DDL, not just itself + --- + duration_ms: 11.923256 + type: 'test' + ... +# Subtest: existing empty database and symlink runtime directory refuse, never initialize over damage +ok 819 - existing empty database and symlink runtime directory refuse, never initialize over damage + --- + duration_ms: 11.700583 + type: 'test' + ... +# Subtest: crash during a transaction recovers no partial event after explicit fixture-only lock removal +ok 820 - crash during a transaction recovers no partial event after explicit fixture-only lock removal + --- + duration_ms: 62.02388 + type: 'test' + ... +# Subtest: writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers +ok 821 - writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers + --- + duration_ms: 9.081463 + type: 'test' + ... +# Subtest: async transactions refuse before invoking their function +ok 822 - async transactions refuse before invoking their function + --- + duration_ms: 7.020761 + type: 'test' + ... +# Subtest: usage_records refuses non-canonical timestamps atomically +ok 823 - usage_records refuses non-canonical timestamps atomically + --- + duration_ms: 8.182214 + type: 'test' + ... +# Subtest: the session default fits under the reply cap and pages to the end with next +ok 824 - the session default fits under the reply cap and pages to the end with next + --- + duration_ms: 115.537782 + type: 'test' + ... +# Subtest: the short form: no description, assignees by role, every listed key +ok 825 - the short form: no description, assignees by role, every listed key + --- + duration_ms: 73.079831 + type: 'test' + ... +# Subtest: each filter, alone and together, and total counts every match +ok 826 - each filter, alone and together, and total counts every match + --- + duration_ms: 142.54498 + type: 'test' + ... +# Subtest: task_ref reads one task in full, as the whole board has it +ok 827 - task_ref reads one task in full, as the whole board has it + --- + duration_ms: 89.772296 + type: 'test' + ... +# Subtest: no arguments is the read the Console and mosaic make, unchanged +ok 828 - no arguments is the read the Console and mosaic make, unchanged + --- + duration_ms: 73.279446 + type: 'test' + ... +# Subtest: an unknown argument or a bad value refuses invalid-request +ok 829 - an unknown argument or a bad value refuses invalid-request + --- + duration_ms: 319.591401 + type: 'test' + ... +# Subtest: tasks rows carry priority and requirement for every session that reads tasks +ok 830 - tasks rows carry priority and requirement for every session that reads tasks + --- + duration_ms: 36.464955 + type: 'test' + ... +# Subtest: the read model rebuilds from the ledger: a reopened bus and each trail give the same values +ok 831 - the read model rebuilds from the ledger: a reopened bus and each trail give the same values + --- + duration_ms: 38.525067 + type: 'test' + ... +# Subtest: an empty business and one with snapshots but no task.created read cleanly +ok 832 - an empty business and one with snapshots but no task.created read cleanly + --- + duration_ms: 11.943721 + type: 'test' + ... +# Subtest: recordTask keeps sync reads and a role write apart +ok 833 - recordTask keeps sync reads and a role write apart + --- + duration_ms: 29.958231 + type: 'test' + ... +# Subtest: read_at must be one canonical UTC format, so the projection compares strings safely +ok 834 - read_at must be one canonical UTC format, so the projection compares strings safely + --- + duration_ms: 9.701965 + type: 'test' + ... +# Subtest: a bad entry refuses the whole record +ok 835 - a bad entry refuses the whole record + --- + duration_ms: 9.745605 + type: 'test' + ... +# Subtest: taskView reads the projection for one business +ok 836 - taskView reads the projection for one business + --- + duration_ms: 12.167329 + type: 'test' + ... +# Subtest: requestTask hands only a holder and a task verb to the handler, and records refusals +ok 837 - requestTask hands only a holder and a task verb to the handler, and records refusals + --- + duration_ms: 22.050409 + type: 'test' + ... +# Subtest: the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous +ok 838 - the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous + --- + duration_ms: 302.671 + type: 'test' + ... +# Subtest: without an adapter the server refuses every task verb +ok 839 - without an adapter the server refuses every task verb + --- + duration_ms: 40.635492 + type: 'test' + ... +# Subtest: the runtime refuses an invalid adapter and closes a valid one +ok 840 - the runtime refuses an invalid adapter and closes a valid one + --- + duration_ms: 51.197989 + type: 'test' + ... +# Subtest: the process loads the S3 adapter from plain-data trackers +ok 841 - the process loads the S3 adapter from plain-data trackers + --- + duration_ms: 251.54157 + type: 'test' + ... +# Subtest: row 177 T1: a tester thread is owned by tester, and neither side reaches or lists the other +ok 842 - row 177 T1: a tester thread is owned by tester, and neither side reaches or lists the other + --- + duration_ms: 28.761698 + type: 'test' + ... +# Subtest: row 177 T2: the tester thread.send is from tester-cli with no human.input; its open is by tester +ok 843 - row 177 T2: the tester thread.send is from tester-cli with no human.input; its open is by tester + --- + duration_ms: 17.017256 + type: 'test' + ... +# Subtest: row 177 T3: the lists read the tester as the human in its own thread, and nowhere else +ok 844 - row 177 T3: the lists read the tester as the human in its own thread, and nowhere else + --- + duration_ms: 14.416088 + type: 'test' + ... +# Subtest: row 177 T3: an assistant that would not hear the human refuses the tester too +ok 845 - row 177 T3: an assistant that would not hear the human refuses the tester too + --- + duration_ms: 13.42157 + type: 'test' + ... +# Subtest: row 177 T4: the tester thread run answers the tester, never the human +ok 846 - row 177 T4: the tester thread run answers the tester, never the human + --- + duration_ms: 26.619872 + type: 'test' + ... +# Subtest: row 177 T5: each stop revokes only its own threads, recorded by its own actor +ok 847 - row 177 T5: each stop revokes only its own threads, recorded by its own actor + --- + duration_ms: 20.654383 + type: 'test' + ... +# Subtest: row 177 T5: the human stop never ends a tester run +ok 848 - row 177 T5: the human stop never ends a tester run + --- + duration_ms: 14.687668 + type: 'test' + ... +# Subtest: row 177 T6: a business whose human is tester refuses invalid-business +ok 849 - row 177 T6: a business whose human is tester refuses invalid-business + --- + duration_ms: 10.307335 + type: 'test' + ... +# Subtest: row 177 T7: the human trail shows a tester thread message as the tester +ok 850 - row 177 T7: the human trail shows a tester thread message as the tester + --- + duration_ms: 19.260383 + type: 'test' + ... +# Subtest: row 177 T8: a tester-thread run never raises a decision to the human; a human-thread run still does +ok 851 - row 177 T8: a tester-thread run never raises a decision to the human; a human-thread run still does + --- + duration_ms: 19.927343 + type: 'test' + ... +# Subtest: row 177 T8: a tester-thread raise routed to the arbiter stays allowed +ok 852 - row 177 T8: a tester-thread raise routed to the arbiter stays allowed + --- + duration_ms: 16.574358 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply into the human's thread refuses thread-not-owned and stores nothing +ok 853 - row 182 T9: a tester reply into the human's thread refuses thread-not-owned and stores nothing + --- + duration_ms: 18.047228 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply into its own thread lands there +ok 854 - row 182 T9: a tester reply into its own thread lands there + --- + duration_ms: 17.733562 + type: 'test' + ... +# Subtest: row 182 T9: the chief's reply up a chain into a tester's thread lands there +ok 855 - row 182 T9: the chief's reply up a chain into a tester's thread lands there + --- + duration_ms: 21.196437 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply to a spec notice refuses thread-not-owned; the chief's relay still lands +ok 856 - row 182 T9: a tester reply to a spec notice refuses thread-not-owned; the chief's relay still lands + --- + duration_ms: 20.618573 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 175: TESTER_VERBS and the organization branch tester set are pinned +ok 857 - row 175: TESTER_VERBS and the organization branch tester set are pinned + --- + duration_ms: 1.035683 + type: 'test' + ... +# Subtest: row 175: each of the six reads as the tester deep-equals the human read +ok 858 - row 175: each of the six reads as the tester deep-equals the human read + --- + duration_ms: 72.125244 + type: 'test' + ... +# Subtest: row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human +ok 859 - row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human + --- + duration_ms: 68.394006 + type: 'test' + ... +# Subtest: row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing +ok 860 - row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing + --- + duration_ms: 60.191095 + type: 'test' + ... +# Subtest: row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were +ok 861 - row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were + --- + duration_ms: 58.044677 + type: 'test' + ... +# Subtest: row 175: W4 as the tester writes by tester and keeps every name check +ok 862 - row 175: W4 as the tester writes by tester and keeps every name check + --- + duration_ms: 21.262302 + type: 'test' + ... +# Subtest: row 175: W6 as the tester records created_by tester; the human records the human +ok 863 - row 175: W6 as the tester records created_by tester; the human records the human + --- + duration_ms: 13.220226 + type: 'test' + ... +# Subtest: row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs +ok 864 - row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs + --- + duration_ms: 47.727023 + type: 'test' + ... +# Subtest: the tester binds only when the business sets bus.tester to exactly true +ok 865 - the tester binds only when the business sets bus.tester to exactly true + --- + duration_ms: 91.073086 + type: 'test' + ... +# Subtest: a business may not name a role tester, so the tester address is never a role +ok 866 - a business may not name a role tester, so the tester address is never a role + --- + duration_ms: 23.583638 + type: 'test' + ... +# Subtest: every verb outside the tester list refuses tester-refused and is recorded against the tester +ok 867 - every verb outside the tester list refuses tester-refused and is recorded against the tester + --- + duration_ms: 41.558289 + type: 'test' + ... +# Subtest: a tester message is from tester, needs no prefix, and writes no human.input or authority +ok 868 - a tester message is from tester, needs no prefix, and writes no human.input or authority + --- + duration_ms: 18.567029 + type: 'test' + ... +# Subtest: a tester message to a role no run holds refuses tester-target-not-running and stores nothing +ok 869 - a tester message to a role no run holds refuses tester-target-not-running and stores nothing + --- + duration_ms: 12.233098 + type: 'test' + ... +# Subtest: a tester message is refused while the run is only launched, and routes once it claims +ok 870 - a tester message is refused while the run is only launched, and routes once it claims + --- + duration_ms: 15.017457 + type: 'test' + ... +# Subtest: a human message to a role no run holds still waits and tells launch.by +ok 871 - a human message to a role no run holds still waits and tells launch.by + --- + duration_ms: 12.542223 + type: 'test' + ... +# Subtest: a role answers a tester only in reply to a tester message, and the answer never reaches the human +ok 872 - a role answers a tester only in reply to a tester message, and the answer never reaches the human + --- + duration_ms: 23.917167 + type: 'test' + ... +# Subtest: the tester reads the human views a reader reads +ok 873 - the tester reads the human views a reader reads + --- + duration_ms: 26.302298 + type: 'test' + ... +# Subtest: tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent +ok 874 - tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent + --- + duration_ms: 1.12358 + type: 'test' + ... +# Subtest: neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable +ok 875 - neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable + --- + duration_ms: 0.350581 + type: 'test' + ... +# Subtest: testerNonce reads only the tester's variable and gives null on any read error +ok 876 - testerNonce reads only the tester's variable and gives null on any read error + --- + duration_ms: 0.185242 + type: 'test' + ... +# Subtest: an envelope carries exactly one of cap, human and tester; no tester authenticator refuses +ok 877 - an envelope carries exactly one of cap, human and tester; no tester authenticator refuses + --- + duration_ms: 93.018922 + type: 'test' + ... +# Subtest: tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker +ok 878 - tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker + --- + duration_ms: 987.084829 + type: 'test' + ... +# Subtest: T1: the human and the reader see a held thread claim; agents still lists the role only +ok 879 - T1: the human and the reader see a held thread claim; agents still lists the role only + --- + duration_ms: 25.746049 + type: 'test' + ... +# Subtest: T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row +ok 880 - T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row + --- + duration_ms: 21.609288 + type: 'test' + ... +# Subtest: T3: a role session refuses human-required and the tester refuses tester-refused +ok 881 - T3: a role session refuses human-required and the tester refuses tester-refused + --- + duration_ms: 19.23918 + type: 'test' + ... +# Subtest: T4: agents answers each session the same before and after a thread run claims +ok 882 - T4: agents answers each session the same before and after a thread run claims + --- + duration_ms: 18.834331 + type: 'test' + ... +# Subtest: T5: the result carries neither the thread name a user wrote nor a message body +ok 883 - T5: the result carries neither the thread name a user wrote nor a message body + --- + duration_ms: 17.313033 + type: 'test' + ... +# Subtest: T6: two held sessions of one thread list as two rows, each its session's latest claim +ok 884 - T6: two held sessions of one thread list as two rows, each its session's latest claim + --- + duration_ms: 19.19892 + type: 'test' + ... +# Subtest: REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written +ok 885 - REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written + --- + duration_ms: 86.292224 + type: 'test' + ... +# Subtest: REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables +ok 886 - REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables + --- + duration_ms: 39.821349 + type: 'test' + ... +# Subtest: REQ-THREAD-1: the offline command prints the kept-message counts before the ready line +ok 887 - REQ-THREAD-1: the offline command prints the kept-message counts before the ready line + --- + duration_ms: 119.711395 + type: 'test' + ... +# Subtest: a share lets the sharee read the thread and nothing else: every write verb stays the owner's (mutants 7, 9) +ok 888 - a share lets the sharee read the thread and nothing else: every write verb stays the owner's (mutants 7, 9) + --- + duration_ms: 40.491826 + type: 'test' + ... +# Subtest: the business human shares too, and a `*` share reaches every covered principal but the tester +ok 889 - the business human shares too, and a `*` share reaches every covered principal but the tester + --- + duration_ms: 25.094444 + type: 'test' + ... +# Subtest: mutant 2: a share never widens a grant; when the sharee's grant stops covering the thread, its reads end +ok 890 - mutant 2: a share never widens a grant; when the sharee's grant stops covering the thread, its reads end + --- + duration_ms: 24.917201 + type: 'test' + ... +# Subtest: mutant 3: a thread whose user owner has lost coverage is hidden from its sharees, the owner's board included +ok 891 - mutant 3: a thread whose user owner has lost coverage is hidden from its sharees, the owner's board included + --- + duration_ms: 34.480657 + type: 'test' + ... +# Subtest: mutant 4: a share's state is its latest row, so an unshare ends it and a share after it starts it again +ok 892 - mutant 4: a share's state is its latest row, so an unshare ends it and a share after it starts it again + --- + duration_ms: 28.620188 + type: 'test' + ... +# Subtest: mutant 8: a user target needs a live grant of any level covering the thread, else share-not-covered +ok 893 - mutant 8: a user target needs a live grant of any level covering the thread, else share-not-covered + --- + duration_ms: 20.306202 + type: 'test' + ... +# Subtest: a viewer reads a thread shared with it, and share, unshare and shares refuse a viewer access-refused (design 4.3) +ok 894 - a viewer reads a thread shared with it, and share, unshare and shares refuse a viewer access-refused (design 4.3) + --- + duration_ms: 22.445664 + type: 'test' + ... +# Subtest: a share target is `user:`, the business human or `*`, and never the sharer +ok 895 - a share target is `user:`, the business human or `*`, and never the sharer + --- + duration_ms: 42.083258 + type: 'test' + ... +# Subtest: a user whose collaborator grant no longer covers its own thread can't share, unshare or list its shares +ok 896 - a user whose collaborator grant no longer covers its own thread can't share, unshare or list its shares + --- + duration_ms: 20.270176 + type: 'test' + ... +# Subtest: the tester and a reader session never share: each verb refuses and writes nothing +ok 897 - the tester and a reader session never share: each verb refuses and writes nothing + --- + duration_ms: 35.246192 + type: 'test' + ... +# Subtest: the owner's trail and replies show a user's message only while that user's thread is shared with the owner +ok 898 - the owner's trail and replies show a user's message only while that user's thread is shared with the owner + --- + duration_ms: 26.847379 + type: 'test' + ... +# Subtest: a share covers every session of the thread +ok 899 - a share covers every session of the thread + --- + duration_ms: 20.900672 + type: 'test' + ... +# Subtest: a sharee can't list the thread's sessions: session.list stays owner-only (Q7, sage-2818 Q1) +ok 900 - a sharee can't list the thread's sessions: session.list stays owner-only (Q7, sage-2818 Q1) + --- + duration_ms: 19.556417 + type: 'test' + ... +# Subtest: only a human principal matches a share: an agent bound to the thread and the tester match none (sage-2818 Q2) +ok 901 - only a human principal matches a share: an agent bound to the thread and the tester match none (sage-2818 Q2) + --- + duration_ms: 30.489499 + type: 'test' + ... +# Subtest: a 3l store migrates to 3m: thread_shares is new and empty, and every other row stays as it was +ok 902 - a 3l store migrates to 3m: thread_shares is new and empty, and every other row stays as it was + --- + duration_ms: 90.510078 + type: 'test' + ... +# Subtest: the 3l engine refuses a 3m store, migrating or not, and leaves it as it was +ok 903 - the 3l engine refuses a 3m store, migrating or not, and leaves it as it was + --- + duration_ms: 156.870812 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger +ok 904 - REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger + --- + duration_ms: 38.305636 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker +ok 905 - REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker + --- + duration_ms: 69.925676 + type: 'test' + ... +# Subtest: REQ-MSG-1: a message to or from the assistant names its thread, or is refused +ok 906 - REQ-MSG-1: a message to or from the assistant names its thread, or is refused + --- + duration_ms: 31.978426 + type: 'test' + ... +# Subtest: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work +ok 907 - REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work + --- + duration_ms: 582.341743 + type: 'test' + ... +# Subtest: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance +ok 908 - REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance + --- + duration_ms: 23.730024 + type: 'test' + ... +# Subtest: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder +ok 909 - REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder + --- + duration_ms: 26.962781 + type: 'test' + ... +# Subtest: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it +ok 910 - REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it + --- + duration_ms: 30.996261 + type: 'test' + ... +# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder +ok 911 - REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder + --- + duration_ms: 33.103481 + type: 'test' + ... +# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder +ok 912 - REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder + --- + duration_ms: 28.784717 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant +ok 913 - REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant + --- + duration_ms: 24.776618 + type: 'test' + ... +# Subtest: Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's +ok 914 - Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's + --- + duration_ms: 38.839285 + type: 'test' + ... +# Subtest: REQ-USER-2: the human verbs refuse another owner's thread +ok 915 - REQ-USER-2: the human verbs refuse another owner's thread + --- + duration_ms: 28.253486 + type: 'test' + ... +# Subtest: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one +ok 916 - REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one + --- + duration_ms: 23.439371 + type: 'test' + ... +# Subtest: REQ-ORG-2: projects and threads are named once, and the repo names a business project +ok 917 - REQ-ORG-2: projects and threads are named once, and the repo names a business project + --- + duration_ms: 25.091837 + type: 'test' + ... +# Subtest: REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing +ok 918 - REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing + --- + duration_ms: 87.714952 + type: 'test' + ... +# Subtest: project.create refuses a repository name without its matching repo before any write +ok 919 - project.create refuses a repository name without its matching repo before any write + --- + duration_ms: 15.54535 + type: 'test' + ... +# Subtest: project.create keeps unrelated names with and without a repository +ok 920 - project.create keeps unrelated names with and without a repository + --- + duration_ms: 11.019828 + type: 'test' + ... +# Subtest: C2-09a: explicit creative instances bind independent threads, default sessions and holders +ok 921 - C2-09a: explicit creative instances bind independent threads, default sessions and holders + --- + duration_ms: 45.371487 + type: 'test' + ... +# Subtest: C2-09a: explicit missing, non-thread and malformed selectors create no thread or session +ok 922 - C2-09a: explicit missing, non-thread and malformed selectors create no thread or session + --- + duration_ms: 19.929973 + type: 'test' + ... +# Subtest: C2-09a: creative bindLaunch without a thread refuses thread-required +ok 923 - C2-09a: creative bindLaunch without a thread refuses thread-required + --- + duration_ms: 9.955014 + type: 'test' + ... +# Subtest: socket capability stamps launch identity; shared views use wire, no SQL client +ok 924 - socket capability stamps launch identity; shared views use wire, no SQL client + --- + duration_ms: 43.503831 + type: 'test' + ... +# Subtest: two wire claims serialize; a lost reply never automatically retries +ok 925 - two wire claims serialize; a lost reply never automatically retries + --- + duration_ms: 35.505762 + type: 'test' + ... +# Subtest: malformed, oversized and identity-forging envelopes refuse without echoing input +ok 926 - malformed, oversized and identity-forging envelopes refuse without echoing input + --- + duration_ms: 29.487948 + type: 'test' + ... +# Subtest: client preserves UTF-8 when a response divides a multibyte character +ok 927 - client preserves UTF-8 when a response divides a multibyte character + --- + duration_ms: 11.126851 + type: 'test' + ... +# Subtest: committed mutation followed by dropped reply reports unknown and is never retried +ok 928 - committed mutation followed by dropped reply reports unknown and is never retried + --- + duration_ms: 30.274585 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses +ok 929 - REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses + --- + duration_ms: 25.215363 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty +ok 930 - REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty + --- + duration_ms: 83.277008 + type: 'test' + ... +# Subtest: REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket +ok 931 - REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket + --- + duration_ms: 64.521762 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once +ok 932 - REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once + --- + duration_ms: 13.936086 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 cut: unknown is durable and logged next to every total +ok 933 - REQ-LIMIT-4 cut: unknown is durable and logged next to every total + --- + duration_ms: 10.237164 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 disabled: unknown is durable and logged next to every total +ok 934 - REQ-LIMIT-4 disabled: unknown is durable and logged next to every total + --- + duration_ms: 9.054274 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total +ok 935 - REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total + --- + duration_ms: 8.522975 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total +ok 936 - REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total + --- + duration_ms: 9.607426 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total +ok 937 - REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total + --- + duration_ms: 9.47392 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts +ok 938 - REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts + --- + duration_ms: 8.771747 + type: 'test' + ... +# Subtest: usage records are append-only +ok 939 - usage records are append-only + --- + duration_ms: 9.58451 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 parse failure logs its safe code, never transcript content +ok 940 - REQ-LIMIT-4 parse failure logs its safe code, never transcript content + --- + duration_ms: 9.413838 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow +ok 941 - REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow + --- + duration_ms: 11.389305 + type: 'test' + ... +# Subtest: REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript +ok 942 - REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript + --- + duration_ms: 8.711893 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run +ok 943 - REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run + --- + duration_ms: 9.462535 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled +ok 944 - REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled + --- + duration_ms: 13.412959 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded +ok 945 - REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded + --- + duration_ms: 9.258436 + type: 'test' + ... +# Subtest: row 65 a run bound without a transcript directory records no-transcript +ok 946 - row 65 a run bound without a transcript directory records no-transcript + --- + duration_ms: 8.813616 + type: 'test' + ... +# Subtest: R3: bindUser binds a granted user and refuses one with no live grant +ok 947 - R3: bindUser binds a granted user and refuses one with no live grant + --- + duration_ms: 14.444806 + type: 'test' + ... +# Subtest: R3: a user named like the business human, the tester or a principal word is refused, whatever the grants say +ok 948 - R3: a user named like the business human, the tester or a principal word is refused, whatever the grants say + --- + duration_ms: 9.744513 + type: 'test' + ... +# Subtest: R3: each collaborator verb is allowed to a granted user +ok 949 - R3: each collaborator verb is allowed to a granted user + --- + duration_ms: 18.615024 + type: 'test' + ... +# Subtest: R3: every verb off the collaborator list refuses a user access-refused before its own checks +ok 950 - R3: every verb off the collaborator list refuses a user access-refused before its own checks + --- + duration_ms: 108.633826 + type: 'test' + ... +# Subtest: R3: task, web and host verbs refuse a user access-refused +ok 951 - R3: task, web and host verbs refuse a user access-refused + --- + duration_ms: 23.347158 + type: 'test' + ... +# Subtest: R3 leak: project.list shows granted projects only +ok 952 - R3 leak: project.list shows granted projects only + --- + duration_ms: 13.121078 + type: 'test' + ... +# Subtest: R3 leak: thread.create needs the project and the thread instance granted, and an ungranted id reads as one that does not exist +ok 953 - R3 leak: thread.create needs the project and the thread instance granted, and an ungranted id reads as one that does not exist + --- + duration_ms: 16.288364 + type: 'test' + ... +# Subtest: R3 leak: thread.list shows the user its own threads that are still granted, never others +ok 954 - R3 leak: thread.list shows the user its own threads that are still granted, never others + --- + duration_ms: 35.453141 + type: 'test' + ... +# Subtest: R3 leak: names shows granted instances only +ok 955 - R3 leak: names shows granted instances only + --- + duration_ms: 14.241025 + type: 'test' + ... +# Subtest: R3: thread.send is from user: and writes no human.input +ok 956 - R3: thread.send is from user: and writes no human.input + --- + duration_ms: 12.698273 + type: 'test' + ... +# Subtest: R3: a reply-chain message.send into another user thread is refused +ok 957 - R3: a reply-chain message.send into another user thread is refused + --- + duration_ms: 15.384048 + type: 'test' + ... +# Subtest: R3: the run reply to a user message reaches that user thread.messages, with no waiting and no notice +ok 958 - R3: the run reply to a user message reaches that user thread.messages, with no waiting and no notice + --- + duration_ms: 19.351506 + type: 'test' + ... +# Subtest: R3: a reply to: user without a matching in_reply_to is refused user-reply-required +ok 959 - R3: a reply to: user without a matching in_reply_to is refused user-reply-required + --- + duration_ms: 28.623395 + type: 'test' + ... +# Subtest: R3: a non-thread run, the human and the tester cannot send to: user +ok 960 - R3: a non-thread run, the human and the tester cannot send to: user + --- + duration_ms: 17.410716 + type: 'test' + ... +# Subtest: R3: a user thread run cannot message the owner, while its uncited gated raise reaches only the owner inbox, B9 +ok 961 - R3: a user thread run cannot message the owner, while its uncited gated raise reaches only the owner inbox, B9 + --- + duration_ms: 19.881305 + type: 'test' + ... +# Subtest: R3: a removed or expired grant refuses the next request access-revoked, and the file is read per request +ok 962 - R3: a removed or expired grant refuses the next request access-revoked, and the file is read per request + --- + duration_ms: 19.590136 + type: 'test' + ... +# Subtest: R3: a user refusal is recorded as action.refused by user: +ok 963 - R3: a user refusal is recorded as action.refused by user: + --- + duration_ms: 13.584657 + type: 'test' + ... +# Subtest: R3: a business with a role keyed user refuses invalid-business +ok 964 - R3: a business with a role keyed user refuses invalid-business + --- + duration_ms: 9.49604 + type: 'test' + ... +# Subtest: R3: name.set refuses the name user +ok 965 - R3: name.set refuses the name user + --- + duration_ms: 10.334159 + type: 'test' + ... +# Subtest: R3 r4: while halted, a granted user's thread.send refuses processing-halted and thread.messages still answers +ok 966 - R3 r4: while halted, a granted user's thread.send refuses processing-halted and thread.messages still answers + --- + duration_ms: 15.421256 + type: 'test' + ... +# Subtest: R3 r4: the chief's hire refuses an instance named user with the code it gives human and tester +ok 967 - R3 r4: the chief's hire refuses an instance named user with the code it gives human and tester + --- + duration_ms: 15.273119 + type: 'test' + ... +# Subtest: R3 r4: a non-function access throws before the store is read +ok 968 - R3 r4: a non-function access throws before the store is read + --- + duration_ms: 0.126192 + type: 'test' + ... +# Subtest: C2-09a: naming an instance cannot bypass its collaborator grant or disclose an ungranted project +ok 969 - C2-09a: naming an instance cannot bypass its collaborator grant or disclose an ungranted project + --- + duration_ms: 18.921764 + type: 'test' + ... +# Subtest: 264e deferred B6: a reply cannot cite the same user in a sibling session +ok 970 - 264e deferred B6: a reply cannot cite the same user in a sibling session + --- + duration_ms: 20.970996 + type: 'test' + ... +# Subtest: 275: VIEWER_VERBS is the ruled read list, inside USER_VERBS +ok 971 - 275: VIEWER_VERBS is the ruled read list, inside USER_VERBS + --- + duration_ms: 1.054162 + type: 'test' + ... +# Subtest: 275: a viewer binds, and each viewer verb answers with what its grant covers +ok 972 - 275: a viewer binds, and each viewer verb answers with what its grant covers + --- + duration_ms: 27.455106 + type: 'test' + ... +# Subtest: 275: a viewer is refused thread.create, thread.open and thread.send access-refused, and nothing is stored +ok 973 - 275: a viewer is refused thread.create, thread.open and thread.send access-refused, and nothing is stored + --- + duration_ms: 20.765903 + type: 'test' + ... +# Subtest: 275: every verb off the user list refuses a viewer access-refused before its own checks +ok 974 - 275: every verb off the user list refuses a viewer access-refused before its own checks + --- + duration_ms: 95.209901 + type: 'test' + ... +# Subtest: 275: mixed grants, collaborator on one project and viewer on another, take the level per project +ok 975 - 275: mixed grants, collaborator on one project and viewer on another, take the level per project + --- + duration_ms: 22.979829 + type: 'test' + ... +# Subtest: 275: board reads refuse users and viewers access-refused +ok 976 - 275: board reads refuse users and viewers access-refused + --- + duration_ms: 70.581526 + type: 'test' + ... +# Subtest: governance pin, user side: decisions, inbox entries, claims, tasks and project files are the owner's, the user reads its messages +ok 977 - governance pin, user side: decisions, inbox entries, claims, tasks and project files are the owner's, the user reads its messages + --- + duration_ms: 37.882636 + type: 'test' + ... +# Subtest: web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query +ok 978 - web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query + --- + duration_ms: 20.295638 + type: 'test' + ... +# Subtest: web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url +ok 979 - web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url + --- + duration_ms: 19.160995 + type: 'test' + ... +# Subtest: a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched +ok 980 - a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched + --- + duration_ms: 18.657896 + type: 'test' + ... +# Subtest: a broker with no web service refuses a granted role +ok 981 - a broker with no web service refuses a granted role + --- + duration_ms: 13.055339 + type: 'test' + ... +# Subtest: bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session +ok 982 - bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session + --- + duration_ms: 17.959193 + type: 'test' + ... +# Subtest: a session that is not the role holder is refused +ok 983 - a session that is not the role holder is refused + --- + duration_ms: 10.62129 + type: 'test' + ... +# Subtest: web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason +ok 984 - web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason + --- + duration_ms: 36.046269 + type: 'test' + ... +# Subtest: web.search with no search source configured is a refused result, not an error +ok 985 - web.search with no search source configured is a refused result, not an error + --- + duration_ms: 13.132617 + type: 'test' + ... +# Subtest: a search source that fails with its own refusal, or that throws, is handled +ok 986 - a search source that fails with its own refusal, or that throws, is handled + --- + duration_ms: 16.520343 + type: 'test' + ... +# Subtest: a slow search source ends in a refusal at the deadline +ok 987 - a slow search source ends in a refusal at the deadline + --- + duration_ms: 64.219129 + type: 'test' + ... +# Subtest: a secret in the arguments is refused before anything is trailed or fetched +ok 988 - a secret in the arguments is refused before anything is trailed or fetched + --- + duration_ms: 13.158777 + type: 'test' + ... +# Subtest: over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured +ok 989 - over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured + --- + duration_ms: 64.690974 + type: 'test' + ... +# Subtest: busBusiness: the web grant comes from "web" in the resolved tool limit +ok 990 - busBusiness: the web grant comes from "web" in the resolved tool limit + --- + duration_ms: 0.289812 + type: 'test' + ... +# Subtest: webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured +ok 991 - webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured + --- + duration_ms: 44.350171 + type: 'test' + ... +# Subtest: an ungranted call is refused at once: no admission, no wait, nothing touched +ok 992 - an ungranted call is refused at once: no admission, no wait, nothing touched + --- + duration_ms: 16.591777 + type: 'test' + ... +# Subtest: over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait +ok 993 - over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait + --- + duration_ms: 387.006492 + type: 'test' + ... +# Subtest: a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) +ok 994 - a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) + --- + duration_ms: 74.706415 + type: 'test' + ... +# Subtest: a fetch that stalls is cut off at the deadline: the request is destroyed, not left running +ok 995 - a fetch that stalls is cut off at the deadline: the request is destroyed, not left running + --- + duration_ms: 95.45619 + type: 'test' + ... +# Subtest: 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 +ok 996 - 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 + --- + duration_ms: 18.402902 + type: 'test' + ... +# Subtest: merge-gate's technical raise is cross-role, goes to the cto, and only merge-gate can use the approval +ok 997 - merge-gate's technical raise is cross-role, goes to the cto, and only merge-gate can use the approval + --- + duration_ms: 37.795312 + type: 'test' + ... +# Subtest: merge-gate has no message.send, and without a domain its raise goes to the delivery arbiter +ok 998 - merge-gate has no message.send, and without a domain its raise goes to the delivery arbiter + --- + duration_ms: 25.996386 + type: 'test' + ... +# Subtest: the cto must be able to message merge-gate, or the technical raise is refused (row 133) +ok 999 - the cto must be able to message merge-gate, or the technical raise is refused (row 133) + --- + duration_ms: 23.983572 + type: 'test' + ... +# Subtest: security-reviewer answers a review with its verdict alone; it holds no message.send +ok 1000 - security-reviewer answers a review with its verdict alone; it holds no message.send + --- + duration_ms: 25.172155 + type: 'test' + ... +1..1000 +# tests 1000 +# suites 0 +# pass 999 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 132825.401104 diff --git a/agents/fethry/work/queue-266/evidence/bus-rerun.tap b/agents/fethry/work/queue-266/evidence/bus-rerun.tap new file mode 100644 index 000000000..eb562a4bb --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/bus-rerun.tap @@ -0,0 +1,6058 @@ +TAP version 13 +# Subtest: R4: the timer sweep after a hand edit ends only the lost user's run; its next call refuses thread-revoked +ok 1 - R4: the timer sweep after a hand edit ends only the lost user's run; its next call refuses thread-revoked + --- + duration_ms: 40.54118 + type: 'test' + ... +# Subtest: R4: an expiry with no write and no request ends the run at the next timer sweep +ok 2 - R4: an expiry with no write and no request ends the run at the next timer sweep + --- + duration_ms: 24.163719 + type: 'test' + ... +# Subtest: R4: a downgrade to viewer is a loss +ok 3 - R4: a downgrade to viewer is a loss + --- + duration_ms: 22.045637 + type: 'test' + ... +# Subtest: R4: another user's request after a hand edit ends the lost user's run, and its own run stays +ok 4 - R4: another user's request after a hand edit ends the lost user's run, and its own run stays + --- + duration_ms: 25.156886 + type: 'test' + ... +# Subtest: R4: a request reads the access file only when its stamp changed, once per change +ok 5 - R4: a request reads the access file only when its stamp changed, once per change + --- + duration_ms: 22.473032 + type: 'test' + ... +# Subtest: R4: access.reload ends the lost runs at once for the human; the tester, a reader, an agent and a user are refused +ok 6 - R4: access.reload ends the lost runs at once for the human; the tester, a reader, an agent and a user are refused + --- + duration_ms: 26.849557 + type: 'test' + ... +# Subtest: R4: threadsState marks revoked: true on the lost user's thread only, a pending message included +ok 7 - R4: threadsState marks revoked: true on the lost user's thread only, a pending message included + --- + duration_ms: 17.819627 + type: 'test' + ... +# Subtest: R4: threadsState after an expiry with no write and no sweep ends the claim before it marks the row revoked +ok 8 - R4: threadsState after an expiry with no write and no sweep ends the claim before it marks the row revoked + --- + duration_ms: 23.433675 + type: 'test' + ... +# Subtest: R4: a new run of a revoked thread refuses thread-revoked at bind and at claim; a rebind is allowed +ok 9 - R4: a new run of a revoked thread refuses thread-revoked at bind and at claim; a rebind is allowed + --- + duration_ms: 20.394423 + type: 'test' + ... +# Subtest: R4 runtime: a hand edit ends the run at the first timer period, intervalMs is checked, and close stops the timer +ok 10 - R4 runtime: a hand edit ends the run at the first timer period, intervalMs is checked, and close stops the timer + --- + duration_ms: 54.684695 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes +ok 11 - REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes + --- + duration_ms: 82.949172 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact +ok 12 - REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact + --- + duration_ms: 102.798218 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was +ok 13 - REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 87.557412 + type: 'test' + ... +# Subtest: parseAddress: one +ok 14 - parseAddress: one + --- + duration_ms: 1.200454 + type: 'test' + ... +# Subtest: parseAddress: many +ok 15 - parseAddress: many + --- + duration_ms: 0.157851 + type: 'test' + ... +# Subtest: parseAddress: repeat +ok 16 - parseAddress: repeat + --- + duration_ms: 0.086307 + type: 'test' + ... +# Subtest: parseAddress: plain +ok 17 - parseAddress: plain + --- + duration_ms: 0.07857 + type: 'test' + ... +# Subtest: parseAddress: stop +ok 18 - parseAddress: stop + --- + duration_ms: 0.102223 + type: 'test' + ... +# Subtest: parseAddress: EOF tag +ok 19 - parseAddress: EOF tag + --- + duration_ms: 0.090877 + type: 'test' + ... +# Subtest: parseAddress: EOF last tag +ok 20 - parseAddress: EOF last tag + --- + duration_ms: 0.103566 + type: 'test' + ... +# Subtest: parseAddress: leading whitespace +ok 21 - parseAddress: leading whitespace + --- + duration_ms: 0.100817 + type: 'test' + ... +# Subtest: parseAddress: tags only +ok 22 - parseAddress: tags only + --- + duration_ms: 0.103657 + type: 'test' + ... +# Subtest: parseAddress: empty +ok 23 - parseAddress: empty + --- + duration_ms: 0.169753 + type: 'test' + ... +# Subtest: parseAddress: whitespace +ok 24 - parseAddress: whitespace + --- + duration_ms: 0.079147 + type: 'test' + ... +# Subtest: parseAddress: bare at +ok 25 - parseAddress: bare at + --- + duration_ms: 0.064052 + type: 'test' + ... +# Subtest: parseAddress: punctuation is a name +ok 26 - parseAddress: punctuation is a name + --- + duration_ms: 0.047528 + type: 'test' + ... +# Subtest: parseAddress rejects non-text without coercion +ok 27 - parseAddress rejects non-text without coercion + --- + duration_ms: 0.305199 + type: 'test' + ... +# Subtest: the mounted address parser has no import dependency +ok 28 - the mounted address parser has no import dependency + --- + duration_ms: 0.232357 + type: 'test' + ... +# Subtest: agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged +ok 29 - agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged + --- + duration_ms: 31.992148 + type: 'test' + ... +# Subtest: agents: working counts what the holder received and has not read; routed alone is not working +ok 30 - agents: working counts what the holder received and has not read; routed alone is not working + --- + duration_ms: 20.336975 + type: 'test' + ... +# Subtest: agents: input needed is the role's open decisions routed to the human, gated first, then oldest +ok 31 - agents: input needed is the role's open decisions routed to the human, gated first, then oldest + --- + duration_ms: 34.290065 + type: 'test' + ... +# Subtest: agents: working wins over waiting, and Input needed still shows +ok 32 - agents: working wins over waiting, and Input needed still shows + --- + duration_ms: 17.139431 + type: 'test' + ... +# Subtest: agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role +ok 33 - agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role + --- + duration_ms: 18.494151 + type: 'test' + ... +# Subtest: agents: state reads only its own business, even for a run name both use +ok 34 - agents: state reads only its own business, even for a run name both use + --- + duration_ms: 17.408635 + type: 'test' + ... +# Subtest: agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it +ok 35 - agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it + --- + duration_ms: 21.152814 + type: 'test' + ... +# Subtest: agents: a message the holder read is not stranded; one the current holder has not read is not listed +ok 36 - agents: a message the holder read is not stranded; one the current holder has not read is not listed + --- + duration_ms: 19.005436 + type: 'test' + ... +# Subtest: agents: stranded is oldest first and capped at 50 for a role +ok 37 - agents: stranded is oldest first and capped at 50 for a role + --- + duration_ms: 81.599613 + type: 'test' + ... +# Subtest: agents: stranded is per role and per business +ok 38 - agents: stranded is per role and per business + --- + duration_ms: 30.906898 + type: 'test' + ... +# Subtest: agents: a message routed to a held role and not yet received is not stranded +ok 39 - agents: a message routed to a held role and not yet received is not stranded + --- + duration_ms: 12.922355 + type: 'test' + ... +# Subtest: REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once +ok 40 - REQ-DEC an approval outlives its run and a broker restart; a new run of the instance consumes it once + --- + duration_ms: 34.026137 + type: 'test' + ... +# Subtest: REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing +ok 41 - REQ-DEC another instance of the same definition cannot consume an approval, and its refusal consumes nothing + --- + duration_ms: 17.442709 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread +ok 42 - REQ-DEC REQ-THREAD-1 a thread approval is consumed only by a run holding the same thread + --- + duration_ms: 24.775608 + type: 'test' + ... +# Subtest: REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot +ok 43 - REQ-DEC a later run of the same instance supersedes an open decision; another instance cannot + --- + duration_ms: 22.251424 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread +ok 44 - REQ-DEC REQ-THREAD-1 a thread decision is superseded only from the same thread + --- + duration_ms: 23.691901 + type: 'test' + ... +# Subtest: REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run +ok 45 - REQ-DEC REQ-THREAD-1 a thread instance decision raised before row 121 is not consumed or superseded by any thread run + --- + duration_ms: 30.190544 + type: 'test' + ... +# Subtest: launch identity is stamped, payload identity is refused and stale holder cannot send +ok 46 - launch identity is stamped, payload identity is refused and stale holder cannot send + --- + duration_ms: 24.079586 + type: 'test' + ... +# Subtest: decision classes route from policy; gated resolution is human-only, choice and target must match +ok 47 - decision classes route from policy; gated resolution is human-only, choice and target must match + --- + duration_ms: 25.452681 + type: 'test' + ... +# Subtest: claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic +ok 48 - claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic + --- + duration_ms: 27.892666 + type: 'test' + ... +# Subtest: launch events require a human CLI capability; generic emit cannot forge authority events +ok 49 - launch events require a human CLI capability; generic emit cannot forge authority events + --- + duration_ms: 18.51745 + type: 'test' + ... +# Subtest: within-role decisions close atomically and invalid options or blocking omissions refuse +ok 50 - within-role decisions close atomically and invalid options or blocking omissions refuse + --- + duration_ms: 16.060084 + type: 'test' + ... +# Subtest: a recommendation that is not exactly one option key refuses invalid-recommendation after the options +ok 51 - a recommendation that is not exactly one option key refuses invalid-recommendation after the options + --- + duration_ms: 24.478561 + type: 'test' + ... +# Subtest: observer capabilities read human inbox but cannot mutate or forge launch identity +ok 52 - observer capabilities read human inbox but cannot mutate or forge launch identity + --- + duration_ms: 15.384711 + type: 'test' + ... +# Subtest: task action subjects and linked decision trail are complete and ordered +ok 53 - task action subjects and linked decision trail are complete and ordered + --- + duration_ms: 23.417009 + type: 'test' + ... +# Subtest: launch binding is durable and reconnecting requires the identical trusted record +ok 54 - launch binding is durable and reconnecting requires the identical trusted record + --- + duration_ms: 11.97769 + type: 'test' + ... +# Subtest: business isolation includes inherited object names and cross-business message references +ok 55 - business isolation includes inherited object names and cross-business message references + --- + duration_ms: 18.681065 + type: 'test' + ... +# Subtest: authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it +ok 56 - authority never transfers between action, target, unresolved or replaced role holder; a later run of the instance keeps it + --- + duration_ms: 26.162467 + type: 'test' + ... +# Subtest: task projection uses schema current view, skipping earlier and equal-start polls +ok 57 - task projection uses schema current view, skipping earlier and equal-start polls + --- + duration_ms: 14.195435 + type: 'test' + ... +# Subtest: revocation permanently bars the old run from reclaiming first, including after broker restart +ok 58 - revocation permanently bars the old run from reclaiming first, including after broker restart + --- + duration_ms: 21.859962 + type: 'test' + ... +# Subtest: empty message references refuse before storage; refusal-evidence failure stays a typed error +ok 59 - empty message references refuse before storage; refusal-evidence failure stays a typed error + --- + duration_ms: 14.567486 + type: 'test' + ... +# Subtest: both arbiters require human resolution when their cross-role route is themselves +ok 60 - both arbiters require human resolution when their cross-role route is themselves + --- + duration_ms: 21.63012 + type: 'test' + ... +# Subtest: the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role +ok 61 - the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role + --- + duration_ms: 22.560067 + type: 'test' + ... +# Subtest: S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input +ok 62 - S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input + --- + duration_ms: 1.30689 + type: 'test' + ... +# Subtest: channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller +ok 63 - channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller + --- + duration_ms: 1.341082 + type: 'test' + ... +# Subtest: channel recovery still requires the same shim path and rejects an absent or forged proof +ok 64 - channel recovery still requires the same shim path and rejects an absent or forged proof + --- + duration_ms: 398.732248 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged +ok 65 - REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged + --- + duration_ms: 39.373907 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke +ok 66 - REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke + --- + duration_ms: 27.043401 + type: 'test' + ... +# Subtest: REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither +ok 67 - REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither + --- + duration_ms: 20.770207 + type: 'test' + ... +# Subtest: REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path +ok 68 - REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path + --- + duration_ms: 20.0062 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason +ok 69 - REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason + --- + duration_ms: 23.167981 + type: 'test' + ... +# Subtest: REQ-ROLE-2: a reason is required, bounded, and never sent with a decision +ok 70 - REQ-ROLE-2: a reason is required, bounded, and never sent with a decision + --- + duration_ms: 24.972904 + type: 'test' + ... +# Subtest: REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run +ok 71 - REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run + --- + duration_ms: 26.200397 + type: 'test' + ... +# Subtest: REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor +ok 72 - REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor + --- + duration_ms: 21.386768 + type: 'test' + ... +# Subtest: REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set +ok 73 - REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set + --- + duration_ms: 28.515926 + type: 'test' + ... +# Subtest: REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change +ok 74 - REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change + --- + duration_ms: 28.507109 + type: 'test' + ... +# Subtest: REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys +ok 75 - REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys + --- + duration_ms: 30.625958 + type: 'test' + ... +# Subtest: REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing +ok 76 - REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing + --- + duration_ms: 25.193362 + type: 'test' + ... +# Subtest: REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change +ok 77 - REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change + --- + duration_ms: 30.545716 + type: 'test' + ... +# Subtest: REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused +ok 78 - REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused + --- + duration_ms: 88.824109 + type: 'test' + ... +# Subtest: REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused +ok 79 - REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused + --- + duration_ms: 75.758069 + type: 'test' + ... +# Subtest: Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused +ok 80 - Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused + --- + duration_ms: 80.70252 + type: 'test' + ... +# Subtest: row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief +ok 81 - row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief + --- + duration_ms: 59.459255 + type: 'test' + ... +# Subtest: REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused +ok 82 - REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused + --- + duration_ms: 71.040186 + type: 'test' + ... +# Subtest: row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing +ok 83 - row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing + --- + duration_ms: 20.96558 + type: 'test' + ... +# Subtest: row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run +ok 84 - row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run + --- + duration_ms: 21.576102 + type: 'test' + ... +# Subtest: row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not +ok 85 - row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not + --- + duration_ms: 21.318184 + type: 'test' + ... +# Subtest: row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer +ok 86 - row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer + --- + duration_ms: 25.48547 + type: 'test' + ... +# Subtest: row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer +ok 87 - row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer + --- + duration_ms: 25.535743 + type: 'test' + ... +# Subtest: row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it +ok 88 - row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it + --- + duration_ms: 22.082653 + type: 'test' + ... +# Subtest: row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own +ok 89 - row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own + --- + duration_ms: 18.78914 + type: 'test' + ... +# Subtest: row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key +ok 90 - row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key + --- + duration_ms: 30.565883 + type: 'test' + ... +# Subtest: row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions +ok 91 - row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions + --- + duration_ms: 29.025001 + type: 'test' + ... +# Subtest: row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer +ok 92 - row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer + --- + duration_ms: 42.505923 + type: 'test' + ... +# Subtest: row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name +ok 93 - row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name + --- + duration_ms: 22.85331 + type: 'test' + ... +# Subtest: row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't +ok 94 - row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't + --- + duration_ms: 751.401066 + type: 'test' + ... +# Subtest: row 194 T8b: a hire without the role files configured refuses not-configured +ok 95 - row 194 T8b: a hire without the role files configured refuses not-configured + --- + duration_ms: 21.489279 + type: 'test' + ... +# Subtest: row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs +ok 96 - row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs + --- + duration_ms: 25.050842 + type: 'test' + ... +# Subtest: row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses +ok 97 - row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses + --- + duration_ms: 27.553251 + type: 'test' + ... +# Subtest: row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone +ok 98 - row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone + --- + duration_ms: 26.652873 + type: 'test' + ... +# Subtest: row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once +ok 99 - row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once + --- + duration_ms: 25.513517 + type: 'test' + ... +# Subtest: row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it +ok 100 - row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it + --- + duration_ms: 27.787448 + type: 'test' + ... +# Subtest: row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it +ok 101 - row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it + --- + duration_ms: 23.173953 + type: 'test' + ... +# Subtest: row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer +ok 102 - row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer + --- + duration_ms: 21.075535 + type: 'test' + ... +# Subtest: row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable +ok 103 - row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable + --- + duration_ms: 20.05512 + type: 'test' + ... +# Subtest: row 194 T18: hire and fire take only their own keys, and a refused call writes nothing +ok 104 - row 194 T18: hire and fire take only their own keys, and a refused call writes nothing + --- + duration_ms: 27.444414 + type: 'test' + ... +# Subtest: row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone +ok 105 - row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone + --- + duration_ms: 70.758235 + type: 'test' + ... +# Subtest: row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing +ok 106 - row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing + --- + duration_ms: 25.877604 + type: 'test' + ... +# Subtest: C2-06 held library lock gives the agent citation-unavailable and its retry reason +ok 107 - C2-06 held library lock gives the agent citation-unavailable and its retry reason + --- + duration_ms: 5137.723339 + type: 'test' + ... +# Subtest: C2-06 malformed sync state is availability failure, never a fabricated invalid cite +ok 108 - C2-06 malformed sync state is availability failure, never a fabricated invalid cite + --- + duration_ms: 32.234617 + type: 'test' + ... +# Subtest: C2-06 no mirror or freshly initialized empty mirror still means no served citation +ok 109 - C2-06 no mirror or freshly initialized empty mirror still means no served citation + --- + duration_ms: 31.154061 + type: 'test' + ... +# Subtest: C2-06 coder send_message guard covers every table refusal; inserts nothing +ok 110 - C2-06 coder send_message guard covers every table refusal; inserts nothing + --- + duration_ms: 107.126459 + type: 'test' + ... +# Subtest: C2-06 research send_message guard covers every table refusal; inserts nothing +ok 111 - C2-06 research send_message guard covers every table refusal; inserts nothing + --- + duration_ms: 94.079662 + type: 'test' + ... +# Subtest: C2-06 stored check carries the file author trailer at an unrelated cited tip +ok 112 - C2-06 stored check carries the file author trailer at an unrelated cited tip + --- + duration_ms: 58.711483 + type: 'test' + ... +# Subtest: C2-06 supporting cite cannot state canon, including a folder also marked playground +ok 113 - C2-06 supporting cite cannot state canon, including a folder also marked playground + --- + duration_ms: 41.51029 + type: 'test' + ... +# Subtest: C2-06 supporting file stores supporting scope and its real agent trailer +ok 114 - C2-06 supporting file stores supporting scope and its real agent trailer + --- + duration_ms: 47.730552 + type: 'test' + ... +# Subtest: C2-06 check evidence and insert are atomic when storing evidence fails +ok 115 - C2-06 check evidence and insert are atomic when storing evidence fails + --- + duration_ms: 41.234984 + type: 'test' + ... +# Subtest: C2-06 live limits change both directions; unreadable file keeps checks and exact fixed texts +ok 116 - C2-06 live limits change both directions; unreadable file keeps checks and exact fixed texts + --- + duration_ms: 53.626637 + type: 'test' + ... +# Subtest: C2-06 page store is session-local, caps 20 fetches and 200 KiB, drops at disconnect +ok 117 - C2-06 page store is session-local, caps 20 fetches and 200 KiB, drops at disconnect + --- + duration_ms: 84.808587 + type: 'test' + ... +# Subtest: C2-06 transport passes safe capped guard reason; ordinary refusal envelope is byte-identical +ok 118 - C2-06 transport passes safe capped guard reason; ordinary refusal envelope is byte-identical + --- + duration_ms: 53.3954 + type: 'test' + ... +# Subtest: C2-06 non-library businesses retain role.claim shape and unguarded free sends +ok 119 - C2-06 non-library businesses retain role.claim shape and unguarded free sends + --- + duration_ms: 25.535045 + type: 'test' + ... +# Subtest: C2-06 thread messages carry file/last evidence with one read per distinct path +ok 120 - C2-06 thread messages carry file/last evidence with one read per distinct path + --- + duration_ms: 77.931657 + type: 'test' + ... +# Subtest: C2-06 guarded request snapshot cannot change between check and insert +ok 121 - C2-06 guarded request snapshot cannot change between check and insert + --- + duration_ms: 23.397226 + type: 'test' + ... +# Subtest: C2-06 library.limits.set is human-only and invalid settings leave file and receipts unchanged +ok 122 - C2-06 library.limits.set is human-only and invalid settings leave file and receipts unchanged + --- + duration_ms: 38.936741 + type: 'test' + ... +# Subtest: C2-06 runtime reads changed and unreadable reply limits without restarting +ok 123 - C2-06 runtime reads changed and unreadable reply limits without restarting + --- + duration_ms: 115.682489 + type: 'test' + ... +# Subtest: comment cursors isolate businesses, move only forward and remain append-only +ok 124 - comment cursors isolate businesses, move only forward and remain append-only + --- + duration_ms: 16.749053 + type: 'test' + ... +# Subtest: only trusted sync writes validated cursors; events and cursor share rollback +ok 125 - only trusted sync writes validated cursors; events and cursor share rollback + --- + duration_ms: 11.622735 + type: 'test' + ... +# Subtest: explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates +ok 126 - explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates + --- + duration_ms: 66.514368 + type: 'test' + ... +# Subtest: migration refuses active writers and drifted legacy schemas, with no partial upgrade +ok 127 - migration refuses active writers and drifted legacy schemas, with no partial upgrade + --- + duration_ms: 87.855061 + type: 'test' + ... +# Subtest: named migration registry chains 3b through 3g to a fixture-only future version in order +ok 128 - named migration registry chains 3b through 3g to a fixture-only future version in order + --- + duration_ms: 82.139875 + type: 'test' + ... +# Subtest: migration refuses mismatched source metadata without changing schema or evidence +ok 129 - migration refuses mismatched source metadata without changing schema or evidence + --- + duration_ms: 29.871701 + type: 'test' + ... +# Subtest: offline command migrates only the supplied fixture root and reports usage errors +ok 130 - offline command migrates only the supplied fixture root and reports usage errors + --- + duration_ms: 162.380222 + type: 'test' + ... +# Subtest: N4: the console verbs are exactly the preview and the console resolve, and decision.resolve is not one +ok 131 - N4: the console verbs are exactly the preview and the console resolve, and decision.resolve is not one + --- + duration_ms: 1.130017 + type: 'test' + ... +# Subtest: bindConsole takes only the business human and a three-string owner subject +ok 132 - bindConsole takes only the business human and a three-string owner subject + --- + duration_ms: 38.232763 + type: 'test' + ... +# Subtest: J1, Q188: only a console cap reaches the console verbs, and a console cap reaches nothing else +ok 133 - J1, Q188: only a console cap reaches the console verbs, and a console cap reaches nothing else + --- + duration_ms: 38.096541 + type: 'test' + ... +# Subtest: preview: the two real answers, a grant summary and the digest, for an open grant request only +ok 134 - preview: the two real answers, a grant summary and the digest, for an open grant request only + --- + duration_ms: 28.532994 + type: 'test' + ... +# Subtest: J1, J2: a decision that is not an eligible grant request refuses both console verbs +ok 135 - J1, J2: a decision that is not an eligible grant request refuses both console verbs + --- + duration_ms: 31.458548 + type: 'test' + ... +# Subtest: N2, J13: a Console approve records via console and the owner, before the executor starts, and the grant runs once +ok 136 - N2, J13: a Console approve records via console and the owner, before the executor starts, and the grant runs once + --- + duration_ms: 101.469397 + type: 'test' + ... +# Subtest: J15: a Console deny closes with the other key and starts nothing +ok 137 - J15: a Console deny closes with the other key and starts nothing + --- + duration_ms: 128.888027 + type: 'test' + ... +# Subtest: J2: approve and deny come from approvalChoice and the options, not a fixed yes and no +ok 138 - J2: approve and deny come from approvalChoice and the options, not a fixed yes and no + --- + duration_ms: 154.368058 + type: 'test' + ... +# Subtest: J11: a stale digest or a key outside the two refuses decision-stale and writes nothing +ok 139 - J11: a stale digest or a key outside the two refuses decision-stale and writes nothing + --- + duration_ms: 33.795631 + type: 'test' + ... +# Subtest: J14: a via console close with no matching human.input approves nothing +ok 140 - J14: a via console close with no matching human.input approves nothing + --- + duration_ms: 39.523513 + type: 'test' + ... +# Subtest: recordEvent keeps human.input reserved, so no agent forges a console answer +ok 141 - recordEvent keeps human.input reserved, so no agent forges a console answer + --- + duration_ms: 24.343478 + type: 'test' + ... +# Subtest: J7: a console proof over the socket binds a cap for its one call and the reply releases it +ok 142 - J7: a console proof over the socket binds a cap for its one call and the reply releases it + --- + duration_ms: 86.990108 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: M6: a creative raise refuses decision-not-allowed, cited or not, and no decision row appears; the assistant still raises +ok 143 - M6: a creative raise refuses decision-not-allowed, cited or not, and no decision row appears; the assistant still raises + --- + duration_ms: 37.122362 + type: 'test' + ... +# Subtest: a creative instance sends only to the user and hears only from the user +ok 144 - a creative instance sends only to the user and hears only from the user + --- + duration_ms: 44.15051 + type: 'test' + ... +# Subtest: M10 through the broker: the chief and the tester are refused on bean, the human's limits.set of its models key works +ok 145 - M10 through the broker: the chief and the tester are refused on bean, the human's limits.set of its models key works + --- + duration_ms: 77.795941 + type: 'test' + ... +# Subtest: row 256 T6 the human deletes a creative instance through the broker; the chief and the tester are refused at the verb +ok 146 - row 256 T6 the human deletes a creative instance through the broker; the chief and the tester are refused at the verb + --- + duration_ms: 60.208071 + type: 'test' + ... +# Subtest: X4: register adds a store reference to the running bus, and issue then writes the key +ok 147 - X4: register adds a store reference to the running bus, and issue then writes the key + --- + duration_ms: 13.231632 + type: 'test' + ... +# Subtest: X4: register runs the constructor's reference checks +ok 148 - X4: register runs the constructor's reference checks + --- + duration_ms: 0.695587 + type: 'test' + ... +# Subtest: X4: register reads no file, so a key file left at the path stays unused, and a live token refuses +ok 149 - X4: register reads no file, so a key file left at the path stays unused, and a live token refuses + --- + duration_ms: 9.230415 + type: 'test' + ... +# Subtest: X3, X4: unregister drops an entry with no token and refuses one with a live token +ok 150 - X3, X4: unregister drops an entry with no token and refuses one with a live token + --- + duration_ms: 9.663391 + type: 'test' + ... +# Subtest: X5: a claim holds the slot, so a second claim and a host.run refuse host-busy until release +ok 151 - X5: a claim holds the slot, so a second claim and a host.run refuse host-busy until release + --- + duration_ms: 5.694339 + type: 'test' + ... +# Subtest: X5: a claim made while a host.run is in flight refuses host-busy +ok 152 - X5: a claim made while a host.run is in flight refuses host-busy + --- + duration_ms: 5.266905 + type: 'test' + ... +# Subtest: X5: a stale release leaves a later claim in place +ok 153 - X5: a stale release leaves a later claim in place + --- + duration_ms: 0.41481 + type: 'test' + ... +# Subtest: X5: abortClaim aborts a live claim and says pending, and revoke's abort reaches a claim too +ok 154 - X5: abortClaim aborts a live claim and says pending, and revoke's abort reaches a claim too + --- + duration_ms: 6.301645 + type: 'test' + ... +# Subtest: credentials gives human and reader sessions service, account, role, date and state, and nothing else +ok 155 - credentials gives human and reader sessions service, account, role, date and state, and nothing else + --- + duration_ms: 19.083679 + type: 'test' + ... +# Subtest: credentials refuses a role session and any argument +ok 156 - credentials refuses a role session and any argument + --- + duration_ms: 17.371326 + type: 'test' + ... +# Subtest: credentials reads the status on each request, and a broker without one lists none +ok 157 - credentials reads the status on each request, and a broker without one lists none + --- + duration_ms: 21.115607 + type: 'test' + ... +# Subtest: the broker process answers credentials without a token, path or variable in its output, log or store +ok 158 - the broker process answers credentials without a token, path or variable in its output, log or store + --- + duration_ms: 145.435508 + type: 'test' + ... +# Subtest: T1: a store reference with no file yet starts, and the agent is not-issued until issue +ok 159 - T1: a store reference with no file yet starts, and the agent is not-issued until issue + --- + duration_ms: 4.79147 + type: 'test' + ... +# Subtest: T1: a store path the reference does not own, or no store root, refuses the reference +ok 160 - T1: a store path the reference does not own, or no store root, refuses the reference + --- + duration_ms: 0.543075 + type: 'test' + ... +# Subtest: T1: a wrong mode on the store root, a business dir, an agent dir or the file refuses start +ok 161 - T1: a wrong mode on the store root, a business dir, an agent dir or the file refuses start + --- + duration_ms: 1.886801 + type: 'test' + ... +# Subtest: T1: a missing store root refuses start; a missing {file} reference still refuses start +ok 162 - T1: a missing store root refuses start; a missing {file} reference still refuses start + --- + duration_ms: 0.597038 + type: 'test' + ... +# Subtest: T1: a store file that is a directory or a symlink refuses start +ok 163 - T1: a store file that is a directory or a symlink refuses start + --- + duration_ms: 0.777952 + type: 'test' + ... +# Subtest: T2: useFor keys from the session only +ok 164 - T2: useFor keys from the session only + --- + duration_ms: 1.455385 + type: 'test' + ... +# Subtest: T5: issue, rotate, revoke and delete are live with no restart, and revoke holds across one +ok 165 - T5: issue, rotate, revoke and delete are live with no restart, and revoke holds across one + --- + duration_ms: 3.438779 + type: 'test' + ... +# Subtest: T5: a failed commit leaves the token on disk but not in memory, and a bad token or date writes nothing +ok 166 - T5: a failed commit leaves the token on disk but not in memory, and a bad token or date writes nothing + --- + duration_ms: 1.471034 + type: 'test' + ... +# Subtest: T5: revoke drops the token from memory before the unlink, so a failed unlink still leaves it revoked +ok 167 - T5: revoke drops the token from memory before the unlink, so a failed unlink still leaves it revoked + --- + duration_ms: 1.398633 + type: 'test' + ... +# Subtest: T5: revoke of a {file} reference forgets the token and never unlinks the file +ok 168 - T5: revoke of a {file} reference forgets the token and never unlinks the file + --- + duration_ms: 0.539976 + type: 'test' + ... +# Subtest: T5: delete refuses an agent dir holding anything but tokens +ok 169 - T5: delete refuses an agent dir holding anything but tokens + --- + duration_ms: 1.738123 + type: 'test' + ... +# Subtest: D5: every credentials use( call site is on the allowlist +ok 170 - D5: every credentials use( call site is on the allowlist + --- + duration_ms: 21.391145 + type: 'test' + ... +# Subtest: row 199: the lifecycle verbs refuse every session but the human, and the tester revokes only +ok 171 - row 199: the lifecycle verbs refuse every session but the human, and the tester revokes only + --- + duration_ms: 35.336355 + type: 'test' + ... +# Subtest: T5: issue, rotate, revoke and delete are live, rewrite the business file and leave one receipt each, with no value anywhere +ok 172 - T5: issue, rotate, revoke and delete are live, rewrite the business file and leave one receipt each, with no value anywhere + --- + duration_ms: 88.203204 + type: 'test' + ... +# Subtest: only validated broker references load; returned data and exceptions cannot expose a known token +ok 173 - only validated broker references load; returned data and exceptions cannot expose a known token + --- + duration_ms: 2.420198 + type: 'test' + ... +# Subtest: bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse +ok 174 - bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse + --- + duration_ms: 1.389094 + type: 'test' + ... +# Subtest: expiry refuses use and env references never become client data +ok 175 - expiry refuses use and env references never become client data + --- + duration_ms: 0.446825 + type: 'test' + ... +# Subtest: S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state +ok 176 - S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state + --- + duration_ms: 1.046506 + type: 'test' + ... +# Subtest: opaque tokens shorter than 16 characters refuse before use +ok 177 - opaque tokens shorter than 16 characters refuse before use + --- + duration_ms: 0.246534 + type: 'test' + ... +# Subtest: each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto +ok 178 - each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto + --- + duration_ms: 1.392717 + type: 'test' + ... +# Subtest: chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass +ok 179 - chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 50.457696 + type: 'test' + ... +# Subtest: chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 180 - chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 39.255002 + type: 'test' + ... +# Subtest: chief-executive-officer: another C-suite role isn't on the lists either +ok 181 - chief-executive-officer: another C-suite role isn't on the lists either + --- + duration_ms: 33.677998 + type: 'test' + ... +# Subtest: chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass +ok 182 - chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 39.585711 + type: 'test' + ... +# Subtest: chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 183 - chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 37.971553 + type: 'test' + ... +# Subtest: chief-financial-officer: another C-suite role isn't on the lists either +ok 184 - chief-financial-officer: another C-suite role isn't on the lists either + --- + duration_ms: 32.046889 + type: 'test' + ... +# Subtest: chief-information-officer: messages to and from the user, chief of staff, pm and cto pass +ok 185 - chief-information-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 42.267568 + type: 'test' + ... +# Subtest: chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 186 - chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 37.604301 + type: 'test' + ... +# Subtest: chief-information-officer: another C-suite role isn't on the lists either +ok 187 - chief-information-officer: another C-suite role isn't on the lists either + --- + duration_ms: 30.841105 + type: 'test' + ... +# Subtest: chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass +ok 188 - chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 40.123925 + type: 'test' + ... +# Subtest: chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 189 - chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 38.327742 + type: 'test' + ... +# Subtest: chief-information-security-officer: another C-suite role isn't on the lists either +ok 190 - chief-information-security-officer: another C-suite role isn't on the lists either + --- + duration_ms: 31.952822 + type: 'test' + ... +# Subtest: chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass +ok 191 - chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass + --- + duration_ms: 40.082385 + type: 'test' + ... +# Subtest: chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored +ok 192 - chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored + --- + duration_ms: 38.392622 + type: 'test' + ... +# Subtest: chief-marketing-officer: another C-suite role isn't on the lists either +ok 193 - chief-marketing-officer: another C-suite role isn't on the lists either + --- + duration_ms: 32.45114 + type: 'test' + ... +# limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"bf1b3ab7-3351-4fa2-9771-8d8d470aa05d","source":"@none","code":"baseline-unknown"} +# limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"7f225d4b-1e29-44ef-895a-62ffff08b39a","source":"@none","code":"baseline-unknown"} +# Subtest: REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it +ok 194 - REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it + --- + duration_ms: 124.82171 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota +ok 195 - REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota + --- + duration_ms: 50.721583 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it +ok 196 - REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it + --- + duration_ms: 45.308098 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none +ok 197 - REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none + --- + duration_ms: 12.020786 + type: 'test' + ... +# Subtest: a human resolve sends the raising role one message from the human, and its request is the answer +ok 198 - a human resolve sends the raising role one message from the human, and its request is the answer + --- + duration_ms: 33.622103 + type: 'test' + ... +# Subtest: a cross-role decision resolved by its arbiter comes from that role and run, with no request +ok 199 - a cross-role decision resolved by its arbiter comes from that role and run, with no request + --- + duration_ms: 20.771905 + type: 'test' + ... +# Subtest: a human withdraw sends one message with the note +ok 200 - a human withdraw sends one message with the note + --- + duration_ms: 20.669359 + type: 'test' + ... +# Subtest: a human seen before the close leaves the request on the close's answer, not the seen +ok 201 - a human seen before the close leaves the request on the close's answer, not the seen + --- + duration_ms: 25.024792 + type: 'test' + ... +# Subtest: the raising run's withdraw, a supersede, a within-role raise and seen send nothing +ok 202 - the raising run's withdraw, a supersede, a within-role raise and seen send nothing + --- + duration_ms: 24.150327 + type: 'test' + ... +# Subtest: refused closes send nothing: invalid-choice, decision-closed, not-resolver +ok 203 - refused closes send nothing: invalid-choice, decision-closed, not-resolver + --- + duration_ms: 26.02393 + type: 'test' + ... +# Subtest: a raising role nobody holds at the close gets the message on the next claim +ok 204 - a raising role nobody holds at the close gets the message on the next claim + --- + duration_ms: 22.526738 + type: 'test' + ... +# Subtest: a human DECISION send keeps its own instruction as the request, not a close's answer +ok 205 - a human DECISION send keeps its own instruction as the request, not a close's answer + --- + duration_ms: 22.133888 + type: 'test' + ... +# Subtest: a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing +ok 206 - a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing + --- + duration_ms: 31.923221 + type: 'test' + ... +# Subtest: a gated raise by a role that does not hear from the human is refused and stores nothing +ok 207 - a gated raise by a role that does not hear from the human is refused and stores nothing + --- + duration_ms: 26.829739 + type: 'test' + ... +# Subtest: a route the raiser hears from is allowed, checked from the route to the raiser +ok 208 - a route the raiser hears from is allowed, checked from the route to the raiser + --- + duration_ms: 31.349595 + type: 'test' + ... +# Subtest: a refused supersede withdraws nothing +ok 209 - a refused supersede withdraws nothing + --- + duration_ms: 28.504323 + type: 'test' + ... +# Subtest: the assistant's within-role and gated raises still work +ok 210 - the assistant's within-role and gated raises still work + --- + duration_ms: 24.654368 + type: 'test' + ... +# Subtest: roles lists open decisions routed to a role, and never the human inbox +ok 211 - roles lists open decisions routed to a role, and never the human inbox + --- + duration_ms: 29.23135 + type: 'test' + ... +# Subtest: recent lists closed decisions of every route, newest close first, with how each closed +ok 212 - recent lists closed decisions of every route, newest close first, with how each closed + --- + duration_ms: 26.052335 + type: 'test' + ... +# Subtest: recent gives the closing event as closed when the decision was seen first +ok 213 - recent gives the closing event as closed when the decision was seen first + --- + duration_ms: 26.350647 + type: 'test' + ... +# Subtest: recent stops at RECENT rows +ok 214 - recent stops at RECENT rows + --- + duration_ms: 78.065471 + type: 'test' + ... +# Subtest: every row is what trail already gives the same session for that id +ok 215 - every row is what trail already gives the same session for that id + --- + duration_ms: 41.868897 + type: 'test' + ... +# Subtest: a role session can't list decisions, so it can't read another role's open decisions +ok 216 - a role session can't list decisions, so it can't read another role's open decisions + --- + duration_ms: 37.141419 + type: 'test' + ... +# Subtest: decisions is a read: one business, strict arguments, nothing written +ok 217 - decisions is a read: one business, strict arguments, nothing written + --- + duration_ms: 41.082957 + type: 'test' + ... +# Subtest: endLaunch writes session.ended, releases the run claim and kills its capabilities +ok 218 - endLaunch writes session.ended, releases the run claim and kills its capabilities + --- + duration_ms: 18.830118 + type: 'test' + ... +# Subtest: endLaunch refuses an unknown run, a second end and a rebind of the ended run +ok 219 - endLaunch refuses an unknown run, a second end and a rebind of the ended run + --- + duration_ms: 11.35607 + type: 'test' + ... +# Subtest: a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound +ok 220 - a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound + --- + duration_ms: 13.930209 + type: 'test' + ... +# Subtest: endLaunch leaves a claim another run took alone +ok 221 - endLaunch leaves a claim another run took alone + --- + duration_ms: 15.574123 + type: 'test' + ... +# Subtest: refuse records action.refused against the caller with the code only +ok 222 - refuse records action.refused against the caller with the code only + --- + duration_ms: 12.271294 + type: 'test' + ... +# Subtest: launches off refuses role.launch with launch-revoked until launches on +ok 223 - launches off refuses role.launch with launch-revoked until launches on + --- + duration_ms: 16.486098 + type: 'test' + ... +# Subtest: broker process: launch ops authorize role.launch, record refusals and end runs +ok 224 - broker process: launch ops authorize role.launch, record refusals and end runs + --- + duration_ms: 159.671409 + type: 'test' + ... +# Subtest: row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three +ok 225 - row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three + --- + duration_ms: 230.85034 + type: 'test' + ... +# Subtest: row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes +ok 226 - row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes + --- + duration_ms: 210.784505 + type: 'test' + ... +# Subtest: row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea +ok 227 - row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea + --- + duration_ms: 198.220877 + type: 'test' + ... +# Subtest: row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only +ok 228 - row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only + --- + duration_ms: 198.297174 + type: 'test' + ... +# Subtest: row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request +ok 229 - row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request + --- + duration_ms: 53.466582 + type: 'test' + ... +# Subtest: row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes +ok 230 - row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes + --- + duration_ms: 191.261927 + type: 'test' + ... +# Subtest: row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close +ok 231 - row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close + --- + duration_ms: 86.020574 + type: 'test' + ... +# Subtest: row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft +ok 232 - row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft + --- + duration_ms: 84.081977 + type: 'test' + ... +# Subtest: row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact +ok 233 - row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact + --- + duration_ms: 108.044492 + type: 'test' + ... +# Subtest: row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries +ok 234 - row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries + --- + duration_ms: 278.326749 + type: 'test' + ... +# Subtest: row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied +ok 235 - row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied + --- + duration_ms: 62.949994 + type: 'test' + ... +# Subtest: row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write +ok 236 - row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write + --- + duration_ms: 76.167654 + type: 'test' + ... +# Subtest: row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token +ok 237 - row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token + --- + duration_ms: 229.248433 + type: 'test' + ... +# Subtest: row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked +ok 238 - row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked + --- + duration_ms: 95.252123 + type: 'test' + ... +# Subtest: row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job +ok 239 - row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job + --- + duration_ms: 106.823345 + type: 'test' + ... +# Subtest: row 281 T7: an instance with no grant fires as today, synchronously, with the same events +ok 240 - row 281 T7: an instance with no grant fires as today, synchronously, with the same events + --- + duration_ms: 54.527319 + type: 'test' + ... +# Subtest: row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running +ok 241 - row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running + --- + duration_ms: 202.660462 + type: 'test' + ... +# Subtest: row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs +ok 242 - row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs + --- + duration_ms: 187.820606 + type: 'test' + ... +# Subtest: row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts +ok 243 - row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts + --- + duration_ms: 80.741585 + type: 'test' + ... +# Subtest: row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously +ok 244 - row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously + --- + duration_ms: 77.264961 + type: 'test' + ... +# Subtest: row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none +ok 245 - row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none + --- + duration_ms: 135.110314 + type: 'test' + ... +# Subtest: row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job +ok 246 - row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job + --- + duration_ms: 62.771715 + type: 'test' + ... +# Subtest: row 239 T4: a refusal after the writer's revoke is named -revoked, in the job's fire.failed and notice, a synchronous fire and a delete +ok 247 - row 239 T4: a refusal after the writer's revoke is named -revoked, in the job's fire.failed and notice, a synchronous fire and a delete + --- + duration_ms: 88.904741 + type: 'test' + ... +# Subtest: row 239 T4b: an unmarked step B refusal keeps its code, and the notice says nothing of the tokens +ok 248 - row 239 T4b: an unmarked step B refusal keeps its code, and the notice says nothing of the tokens + --- + duration_ms: 74.483605 + type: 'test' + ... +# Subtest: C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations +ok 249 - C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations + --- + duration_ms: 11244.440146 + type: 'test' + ... +# ✔ C2-21 F-A/F-B: admin collaborator grant on another owner and seat permission reach; F-C/F-D protection observations (11129.452725ms)\\nℹ F-A creative write: PUT status 204\\nℹ F-B creative: permissions {"admin":false,"push":true,"pull":true}\\nℹ F-A chief read: PUT status 204\\nℹ F-B chief: permissions {"admin":false,"push":false,"pull":true}\\nℹ F-C protected Story/**: seat rc 1, owner rc 1; established false\\nℹ F-D protected branch: normal rc 0, force rc 1; established true\\nℹ minted 4, hits 0\\nℹ tests 1\\nℹ suites 0\\nℹ pass 1\\nℹ fail 0\\nℹ cancelled 0\\nℹ skipped 0\\nℹ todo 0\\nℹ duration_ms 11213.736646\\n +# minted 4, hits 0 (complete TAP stdout/stderr) +# Subtest: X-G3: on scratch 1.27.1, a grant makes the user, mints, forks, checks reach, writes the file, and revoke deletes the token +ok 250 - X-G3: on scratch 1.27.1, a grant makes the user, mints, forks, checks reach, writes the file, and revoke deletes the token + --- + duration_ms: 11807.17801 + type: 'test' + ... +# Subtest: versionAtLeast compares numbers and refuses a prerelease of 1.27.0 +ok 251 - versionAtLeast compares numbers and refuses a prerelease of 1.27.0 + --- + duration_ms: 1.345594 + type: 'test' + ... +# Subtest: X-G1: a raise that fails a check refuses and stores nothing +ok 252 - X-G1: a raise that fails a check refuses and stores nothing + --- + duration_ms: 65.552586 + type: 'test' + ... +# Subtest: X-G1: a creative role, a role without identity and a missing or due slot refuse at raise +ok 253 - X-G1: a creative role, a role without identity and a missing or due slot refuse at raise + --- + duration_ms: 191.306263 + type: 'test' + ... +# Subtest: X-G1: the chief of staff refuses at raise, whatever its definition, identity and publish declare +ok 254 - X-G1: the chief of staff refuses at raise, whatever its definition, identity and publish declare + --- + duration_ms: 37.157298 + type: 'test' + ... +# Subtest: X-G2: admin set refuses each failed check and writes nothing, then writes the slot once +ok 255 - X-G2: admin set refuses each failed check and writes nothing, then writes the slot once + --- + duration_ms: 143.935635 + type: 'test' + ... +# Subtest: X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied +ok 256 - X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied + --- + duration_ms: 101.114616 + type: 'test' + ... +# Subtest: X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse +ok 257 - X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse + --- + duration_ms: 321.082314 + type: 'test' + ... +# Subtest: X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call +ok 258 - X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call + --- + duration_ms: 103.665692 + type: 'test' + ... +# Subtest: X-G4: a fork by the seat user of another repository than the project refuses fork-foreign +ok 259 - X-G4: a fork by the seat user of another repository than the project refuses fork-foreign + --- + duration_ms: 84.351857 + type: 'test' + ... +# Subtest: X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file +ok 260 - X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file + --- + duration_ms: 167.269121 + type: 'test' + ... +# Subtest: X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep +ok 261 - X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep + --- + duration_ms: 128.803008 + type: 'test' + ... +# Subtest: X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent +ok 262 - X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent + --- + duration_ms: 159.007401 + type: 'test' + ... +# Subtest: X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call +ok 263 - X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call + --- + duration_ms: 67.775881 + type: 'test' + ... +# Subtest: X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left +ok 264 - X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left + --- + duration_ms: 174.437885 + type: 'test' + ... +# Subtest: X-G10: in a rotation the store file holds the new token before the old one is deleted +ok 265 - X-G10: in a rotation the store file holds the new token before the old one is deleted + --- + duration_ms: 149.808855 + type: 'test' + ... +# Subtest: X-G6: a rotation cut before the rename settles back at once, and the old token stays live +ok 266 - X-G6: a rotation cut before the rename settles back at once, and the old token stays live + --- + duration_ms: 172.84601 + type: 'test' + ... +# Subtest: X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward +ok 267 - X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward + --- + duration_ms: 210.224277 + type: 'test' + ... +# Subtest: X-G6: a restart settles an open rotation back when the file still holds the old token +ok 268 - X-G6: a restart settles an open rotation back when the file still holds the old token + --- + duration_ms: 140.532267 + type: 'test' + ... +# Subtest: X-G6: a restart settles an open rotation forward when the file holds the new token +ok 269 - X-G6: a restart settles an open rotation forward when the file holds the new token + --- + duration_ms: 117.456158 + type: 'test' + ... +# Subtest: X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads +ok 270 - X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads + --- + duration_ms: 134.81872 + type: 'test' + ... +# Subtest: X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted +ok 271 - X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted + --- + duration_ms: 1056.146011 + type: 'test' + ... +# Subtest: X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids +ok 272 - X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids + --- + duration_ms: 173.750741 + type: 'test' + ... +# Subtest: N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message +ok 273 - N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message + --- + duration_ms: 139.399792 + type: 'test' + ... +# Subtest: N9: a 404 on a delete by id counts as done +ok 274 - N9: a 404 on a delete by id counts as done + --- + duration_ms: 134.413383 + type: 'test' + ... +# Subtest: X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision +ok 275 - X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision + --- + duration_ms: 421.269206 + type: 'test' + ... +# Subtest: X-G6: a restart with no admin slot leaves the user an orphan and the token left +ok 276 - X-G6: a restart with no admin slot leaves the user an orphan and the token left + --- + duration_ms: 56.775008 + type: 'test' + ... +# Subtest: X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch +ok 277 - X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch + --- + duration_ms: 126.407884 + type: 'test' + ... +# Subtest: X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left +ok 278 - X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left + --- + duration_ms: 116.210703 + type: 'test' + ... +# Subtest: X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away +ok 279 - X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away + --- + duration_ms: 70.88786 + type: 'test' + ... +# Subtest: X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent +ok 280 - X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent + --- + duration_ms: 50.950664 + type: 'test' + ... +# Subtest: X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision +ok 281 - X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision + --- + duration_ms: 111.434872 + type: 'test' + ... +# Subtest: kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses +ok 282 - kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses + --- + duration_ms: 108.106437 + type: 'test' + ... +# Subtest: X-G11: a revoke while the executor runs aborts it and the grant ends revoked +ok 283 - X-G11: a revoke while the executor runs aborts it and the grant ends revoked + --- + duration_ms: 110.084024 + type: 'test' + ... +# Subtest: X-G11: a revoke unloads memory and removes the file before its Gitea delete +ok 284 - X-G11: a revoke unloads memory and removes the file before its Gitea delete + --- + duration_ms: 132.38822 + type: 'test' + ... +# Subtest: X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back +ok 285 - X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back + --- + duration_ms: 179.707877 + type: 'test' + ... +# Subtest: X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record +ok 286 - X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record + --- + duration_ms: 331.794056 + type: 'test' + ... +# Subtest: X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held +ok 287 - X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held + --- + duration_ms: 196.623765 + type: 'test' + ... +# Subtest: X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost +ok 288 - X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost + --- + duration_ms: 193.393331 + type: 'test' + ... +# Subtest: X-G12: a token that reaches wider than its forks fails with the repository named +ok 289 - X-G12: a token that reaches wider than its forks fails with the repository named + --- + duration_ms: 413.347726 + type: 'test' + ... +# Subtest: X-G12: reach is paged by X-Total-Count and a count that does not add up refuses +ok 290 - X-G12: reach is paged by X-Total-Count and a count that does not add up refuses + --- + duration_ms: 248.540269 + type: 'test' + ... +# Subtest: X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer +ok 291 - X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer + --- + duration_ms: 46.296491 + type: 'test' + ... +# Subtest: X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it +ok 292 - X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it + --- + duration_ms: 298.806319 + type: 'test' + ... +# Subtest: X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft +ok 293 - X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft + --- + duration_ms: 138.227892 + type: 'test' + ... +# Subtest: X-G14: a fire whose user is gone or remade skips the fire steps and says why +ok 294 - X-G14: a fire whose user is gone or remade skips the fire steps and says why + --- + duration_ms: 302.953437 + type: 'test' + ... +# Subtest: X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named +ok 295 - X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named + --- + duration_ms: 352.975461 + type: 'test' + ... +# Subtest: X-G14: a revoke Gitea cannot reach stays open, and a restart closes it +ok 296 - X-G14: a revoke Gitea cannot reach stays open, and a restart closes it + --- + duration_ms: 138.539891 + type: 'test' + ... +# Subtest: row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job +ok 297 - row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job + --- + duration_ms: 131.796926 + type: 'test' + ... +# Subtest: X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status +ok 298 - X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status + --- + duration_ms: 114.833148 + type: 'test' + ... +# Subtest: X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant +ok 299 - X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant + --- + duration_ms: 45.51393 + type: 'test' + ... +# Subtest: status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea +ok 300 - status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea + --- + duration_ms: 114.581663 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: research gets write on her repository with declared scopes through raise and yes +ok 301 - C2-21 L1/L2/L9: research gets write on her repository with declared scopes through raise and yes + --- + duration_ms: 134.086688 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: chief-of-staff gets read on her repository with declared scopes through raise and yes +ok 302 - C2-21 L1/L2/L9: chief-of-staff gets read on her repository with declared scopes through raise and yes + --- + duration_ms: 109.543268 + type: 'test' + ... +# Subtest: C2-21 L1/L2/L9: coder gets read on her repository with declared scopes through raise and yes +ok 303 - C2-21 L1/L2/L9: coder gets read on her repository with declared scopes through raise and yes + --- + duration_ms: 111.051359 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: research refuses non-library targets lib +ok 304 - C2-21 L7/L7b: research refuses non-library targets lib + --- + duration_ms: 42.266112 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: research refuses non-library targets app,lib +ok 305 - C2-21 L7/L7b: research refuses non-library targets app,lib + --- + duration_ms: 43.169075 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: chief-of-staff refuses non-library targets lib +ok 306 - C2-21 L7/L7b: chief-of-staff refuses non-library targets lib + --- + duration_ms: 44.6663 + type: 'test' + ... +# Subtest: C2-21 L7/L7b: chief-of-staff refuses non-library targets app,lib +ok 307 - C2-21 L7/L7b: chief-of-staff refuses non-library targets app,lib + --- + duration_ms: 41.35707 + type: 'test' + ... +# Subtest: C2-21 L4: read widened to write refuses gitea-reach-wider and deletes the minted token +ok 308 - C2-21 L4: read widened to write refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 106.019173 + type: 'test' + ... +# Subtest: C2-21 L4: admin privilege refuses gitea-reach-wider and deletes the minted token +ok 309 - C2-21 L4: admin privilege refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 106.953262 + type: 'test' + ... +# Subtest: C2-21 L4: missing pull refuses gitea-reach-wider and deletes the minted token +ok 310 - C2-21 L4: missing pull refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 109.167783 + type: 'test' + ... +# Subtest: C2-21 L4: missing permission object refuses gitea-reach-wider and deletes the minted token +ok 311 - C2-21 L4: missing permission object refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 108.891085 + type: 'test' + ... +# Subtest: C2-21 L4: library fork refuses gitea-reach-wider and deletes the minted token +ok 312 - C2-21 L4: library fork refuses gitea-reach-wider and deletes the minted token + --- + duration_ms: 89.69272 + type: 'test' + ... +# Subtest: C2-21 L8: untargeted library collaborator reach is disclosed and accepted publish-wide +ok 313 - C2-21 L8: untargeted library collaborator reach is disclosed and accepted publish-wide + --- + duration_ms: 87.527147 + type: 'test' + ... +# Subtest: C2-21 L10: project kind or library level changing after raise refuses decision-mismatch +ok 314 - C2-21 L10: project kind or library level changing after raise refuses decision-mismatch + --- + duration_ms: 150.61679 + type: 'test' + ... +# Subtest: C2-21 L4: creative write requires push true but ignores unrelated permission keys +ok 315 - C2-21 L4: creative write requires push true but ignores unrelated permission keys + --- + duration_ms: 192.841455 + type: 'test' + ... +# Subtest: C2-21: a library grant with no declared scopes refuses gitea-not-declared at raise +ok 316 - C2-21: a library grant with no declared scopes refuses gitea-not-declared at raise + --- + duration_ms: 43.100589 + type: 'test' + ... +# Subtest: 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys +ok 317 - 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys + --- + duration_ms: 77.740767 + type: 'test' + ... +# Subtest: a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact +ok 318 - a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact + --- + duration_ms: 93.78792 + type: 'test' + ... +# Subtest: the 3j engine refuses a migrated store, migrating or not, and leaves it as it was +ok 319 - the 3j engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 84.170548 + type: 'test' + ... +# Subtest: gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision +ok 320 - gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision + --- + duration_ms: 11.157354 + type: 'test' + ... +# Subtest: gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user +ok 321 - gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user + --- + duration_ms: 11.891462 + type: 'test' + ... +# Subtest: G1, A1: only the chief raises a grant, and a refused raise stores nothing and runs no keyscan +ok 322 - G1, A1: only the chief raises a grant, and a refused raise stores nothing and runs no keyscan + --- + duration_ms: 36.252421 + type: 'test' + ... +# Subtest: G1: grant goes only with credential.mint, row a takes only host-enroll, and E1 refuses each bad field +ok 323 - G1: grant goes only with credential.mint, row a takes only host-enroll, and E1 refuses each bad field + --- + duration_ms: 48.134252 + type: 'test' + ... +# Subtest: G5, A5, A6: the scanned key set must equal the requested set, or host-key-mismatch and nothing stored +ok 324 - G5, A5, A6: the scanned key set must equal the requested set, or host-key-mismatch and nothing stored + --- + duration_ms: 33.148226 + type: 'test' + ... +# Subtest: G4 (host-enroll block, M1): the broker appends the keys, fingerprints and sudo line, and the cap counts the block +ok 325 - G4 (host-enroll block, M1): the broker appends the keys, fingerprints and sudo line, and the cap counts the block + --- + duration_ms: 28.379541 + type: 'test' + ... +# Subtest: G6, X1: the human's cli yes starts enrollment, which writes the record, the key file and the events in order +ok 326 - G6, X1: the human's cli yes starts enrollment, which writes the record, the key file and the events in order + --- + duration_ms: 50.962381 + type: 'test' + ... +# Subtest: A2, A4: a credential.mint without grant, and a no, start nothing +ok 327 - A2, A4: a credential.mint without grant, and a no, start nothing + --- + duration_ms: 237.471286 + type: 'test' + ... +# Subtest: A3, X1: a resolve by the tester or an agent starts nothing +ok 328 - A3, X1: a resolve by the tester or an agent starts nothing + --- + duration_ms: 241.166824 + type: 'test' + ... +# Subtest: G6 (duckworth-0081 B3): a withdraw by the chief or the human, and an arbiter resolve, start nothing +ok 329 - G6 (duckworth-0081 B3): a withdraw by the chief or the human, and an arbiter resolve, start nothing + --- + duration_ms: 241.01902 + type: 'test' + ... +# Subtest: G10 (duckworth-0081 B1): a second start for a spent decision refuses decision-consumed, and an unresolved or agent-resolved one not-authorized +ok 330 - G10 (duckworth-0081 B1): a second start for a spent decision refuses decision-consumed, and an unresolved or agent-resolved one not-authorized + --- + duration_ms: 52.514549 + type: 'test' + ... +# Subtest: A8, S1: two approved enrollments for one host: the second ends host-enrolled and the pin stays +ok 331 - A8, S1: two approved enrollments for one host: the second ends host-enrolled and the pin stays + --- + duration_ms: 71.561028 + type: 'test' + ... +# Subtest: A9: the hosts primary key refuses a second record for (business, host) +ok 332 - A9: the hosts primary key refuses a second record for (business, host) + --- + duration_ms: 23.842167 + type: 'test' + ... +# Subtest: X3: a failure at step 2 deletes the record again and ends grant.failed, with no key file +ok 333 - X3: a failure at step 2 deletes the record again and ends grant.failed, with no key file + --- + duration_ms: 45.778544 + type: 'test' + ... +# Subtest: A10, X3: at start a resolved, unspent enrollment is spent and ends interrupted, and never runs late +ok 334 - A10, X3: at start a resolved, unspent enrollment is spent and ends interrupted, and never runs late + --- + duration_ms: 26.936212 + type: 'test' + ... +# Subtest: X3: at start an enrollment that stopped after its registry step loses its record and key file +ok 335 - X3: at start an enrollment that stopped after its registry step loses its record and key file + --- + duration_ms: 50.8368 + type: 'test' + ... +# Subtest: G24 first sentence, M2, A12: tags are mosaic- and 32 hex, and differ by business, agent and host +ok 336 - G24 first sentence, M2, A12: tags are mosaic- and 32 hex, and differ by business, agent and host + --- + duration_ms: 0.274771 + type: 'test' + ... +# Subtest: E4: hosts.check sets the record ready and records grant.host.checked; a non-zero list leaves it pending +ok 337 - E4: hosts.check sets the record ready and records grant.host.checked; a non-zero list leaves it pending + --- + duration_ms: 52.321704 + type: 'test' + ... +# Subtest: G20 (duckworth-0081 B3): the human's hosts.check marks the host ready, and the reader refuses +ok 338 - G20 (duckworth-0081 B3): the human's hosts.check marks the host ready, and the reader refuses + --- + duration_ms: 49.114853 + type: 'test' + ... +# Subtest: G18 (duckworth-0081 B2), broker half: a check refused host-key-mismatch leaves the host pending-install with no grant.host.checked +ok 339 - G18 (duckworth-0081 B2), broker half: a check refused host-key-mismatch leaves the host pending-install with no grant.host.checked + --- + duration_ms: 49.043979 + type: 'test' + ... +# Subtest: E4: a check whose installer fingerprint differs from the record refuses host-changed +ok 340 - E4: a check whose installer fingerprint differs from the record refuses host-changed + --- + duration_ms: 46.528554 + type: 'test' + ... +# Subtest: E4, G21: hosts.remove is the human's or the tester's, deletes the key and the record, and records grant.host.removed +ok 341 - E4, G21: hosts.remove is the human's or the tester's, deletes the key and the record, and records grant.host.removed + --- + duration_ms: 48.37711 + type: 'test' + ... +# Subtest: G21, F1, F2, M4, A22: hosts.remove refuses host-line-left on a guarded hostLineLeft, and ignores look-alikes +ok 342 - G21, F1, F2, M4, A22: hosts.remove refuses host-line-left on a guarded hostLineLeft, and ignores look-alikes + --- + duration_ms: 49.801693 + type: 'test' + ... +# Subtest: hosts.remove refuses host-in-use while a grant record names the host +ok 343 - hosts.remove refuses host-in-use while a grant record names the host + --- + duration_ms: 48.33017 + type: 'test' + ... +# Subtest: the grant writer refuses a body outside section 7's shape +ok 344 - the grant writer refuses a body outside section 7's shape + --- + duration_ms: 22.050992 + type: 'test' + ... +# Subtest: recordEvent refuses reserved-event for a grant.* action or operation +ok 345 - recordEvent refuses reserved-event for a grant.* action or operation + --- + duration_ms: 21.933988 + type: 'test' + ... +# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd +ok 346 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd + --- + duration_ms: 86.033791 + type: 'test' + ... +# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range +ok 347 - row 280: every injected picker sample is unprivileged and outside the ephemeral range + --- + duration_ms: 0.383545 + type: 'test' + ... +# Subtest: G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied +ok 348 - G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied + --- + duration_ms: 677.24887 + type: 'test' + ... +# Subtest: G7: a commands change on a live grant updates the record in one transaction and keeps the key and line +ok 349 - G7: a commands change on a live grant updates the record in one transaction and keeps the key and line + --- + duration_ms: 533.077609 + type: 'test' + ... +# Subtest: G8: a failure at install or verify removes the line and leaves no record, key file or reference +ok 350 - G8: a failure at install or verify removes the line and leaves no record, key file or reference + --- + duration_ms: 1505.615208 + type: 'test' + ... +# Subtest: G8: a failed remove adds hostLineLeft and tells the human to sweep +ok 351 - G8: a failed remove adds hostLineLeft and tells the human to sweep + --- + duration_ms: 633.091855 + type: 'test' + ... +# Subtest: G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line +ok 352 - G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line + --- + duration_ms: 648.884602 + type: 'test' + ... +# Subtest: G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line +ok 353 - G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line + --- + duration_ms: 651.228453 + type: 'test' + ... +# Subtest: G8: a failed step 1 check spends the decision and runs nothing remote +ok 354 - G8: a failed step 1 check spends the decision and runs nothing remote + --- + duration_ms: 83.579982 + type: 'test' + ... +# Subtest: G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step +ok 355 - G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step + --- + duration_ms: 504.61162 + type: 'test' + ... +# Subtest: G9: an agent no longer a role or no longer declaring host ends with its code, spent +ok 356 - G9: an agent no longer a role or no longer declaring host ends with its code, spent + --- + duration_ms: 72.216814 + type: 'test' + ... +# Subtest: G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing +ok 357 - G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing + --- + duration_ms: 513.14053 + type: 'test' + ... +# Subtest: G15: no event, message or decision holds the private key +ok 358 - G15: no event, message or decision holds the private key + --- + duration_ms: 489.515096 + type: 'test' + ... +# Subtest: G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line +ok 359 - G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line + --- + duration_ms: 528.4072 + type: 'test' + ... +# Subtest: G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep +ok 360 - G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep + --- + duration_ms: 791.395049 + type: 'test' + ... +# Subtest: G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep +ok 361 - G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep + --- + duration_ms: 867.759375 + type: 'test' + ... +# Subtest: G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy +ok 362 - G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy + --- + duration_ms: 505.757734 + type: 'test' + ... +# Subtest: G24: names at 64 characters with . and _ give distinct tags of the fixed length +ok 363 - G24: names at 64 characters with . and _ give distinct tags of the fixed length + --- + duration_ms: 0.41656 + type: 'test' + ... +# Subtest: G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then +ok 364 - G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then + --- + duration_ms: 219.678548 + type: 'test' + ... +# Subtest: G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line +ok 365 - G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line + --- + duration_ms: 215.637428 + type: 'test' + ... +# Subtest: G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host +ok 366 - G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host + --- + duration_ms: 518.818304 + type: 'test' + ... +# Subtest: G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later +ok 367 - G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later + --- + duration_ms: 69.121534 + type: 'test' + ... +# Subtest: G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint +ok 368 - G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint + --- + duration_ms: 285.181397 + type: 'test' + ... +# Subtest: G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it +ok 369 - G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it + --- + duration_ms: 529.480126 + type: 'test' + ... +# Subtest: N1 (G27): the start sweep unlinks host. files with no record in loaded businesses only, and refuses a store dir that is not private +ok 370 - N1 (G27): the start sweep unlinks host. files with no record in loaded businesses only, and refuses a store dir that is not private + --- + duration_ms: 6.242701 + type: 'test' + ... +# Subtest: G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker +ok 371 - G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker + --- + duration_ms: 651.334124 + type: 'test' + ... +# Subtest: G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse +ok 372 - G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse + --- + duration_ms: 216.342066 + type: 'test' + ... +# Subtest: G13: a revoke during install aborts the executor, which ends revoked, and the line goes +ok 373 - G13: a revoke during install aborts the executor, which ends revoked, and the line goes + --- + duration_ms: 563.096488 + type: 'test' + ... +# Subtest: G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's +ok 374 - G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's + --- + duration_ms: 507.933972 + type: 'test' + ... +# Subtest: row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records +ok 375 - row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records + --- + duration_ms: 658.907016 + type: 'test' + ... +# Subtest: G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then +ok 376 - G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then + --- + duration_ms: 688.32569 + type: 'test' + ... +# Subtest: G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened +ok 377 - G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened + --- + duration_ms: 947.624599 + type: 'test' + ... +# Subtest: G27: a key file a revoke could not unlink is reported left and goes at the next start +ok 378 - G27: a key file a revoke could not unlink is reported left and goes at the next start + --- + duration_ms: 659.543396 + type: 'test' + ... +# Subtest: G28: a commands change, then a revoke, then a restart leave no record, key, reference or line +ok 379 - G28: a commands change, then a revoke, then a restart leave no record, key, reference or line + --- + duration_ms: 663.319608 + type: 'test' + ... +# Subtest: G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left +ok 380 - G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left + --- + duration_ms: 956.421096 + type: 'test' + ... +# Subtest: G12: the local steps finish before the host step, so a host that hangs leaves the agent no access +ok 381 - G12: the local steps finish before the host step, so a host that hangs leaves the agent no access + --- + duration_ms: 712.146826 + type: 'test' + ... +# Subtest: G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked +ok 382 - G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked + --- + duration_ms: 215.231482 + type: 'test' + ... +# Subtest: G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line +ok 383 - G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line + --- + duration_ms: 672.975041 + type: 'test' + ... +# Subtest: G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep +ok 384 - G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep + --- + duration_ms: 664.54922 + type: 'test' + ... +# Subtest: G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight +ok 385 - G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight + --- + duration_ms: 1178.550608 + type: 'test' + ... +# Subtest: mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote +ok 386 - mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote + --- + duration_ms: 66.804172 + type: 'test' + ... +# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record +ok 387 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record + --- + duration_ms: 521.150786 + type: 'test' + ... +# Subtest: G1 (host): only the chief raises a host grant, a grant on any other action refuses, and nothing is stored +ok 388 - G1 (host): only the chief raises a host grant, a grant on any other action refuses, and nothing is stored + --- + duration_ms: 32.536699 + type: 'test' + ... +# Subtest: G1, R4: the grant takes exactly method, agent, host, commands and rotateBy, and an unknown method refuses +ok 389 - G1, R4: the grant takes exactly method, agent, host, commands and rotateBy, and an unknown method refuses + --- + duration_ms: 43.361888 + type: 'test' + ... +# Subtest: row 236 (\#1742): a gitea grant on a broker with no Gitea path refuses gitea-not-configured, and nothing is stored +ok 390 - row 236 (\#1742): a gitea grant on a broker with no Gitea path refuses gitea-not-configured, and nothing is stored + --- + duration_ms: 21.720881 + type: 'test' + ... +# Subtest: G2: an agent whose definition lacks host refuses host-not-declared, and an unknown agent unknown-role +ok 391 - G2: an agent whose definition lacks host refuses host-not-declared, and an unknown agent unknown-role + --- + duration_ms: 25.536856 + type: 'test' + ... +# Subtest: mos-1163: a grant whose agent is a creative role refuses host-creative-role, even when its definition declares host +ok 392 - mos-1163: a grant whose agent is a creative role refuses host-creative-role, even when its definition declares host + --- + duration_ms: 23.556607 + type: 'test' + ... +# Subtest: G3: wildcard, shell, empty and other 210 D6 argv prefixes refuse invalid-request +ok 393 - G3: wildcard, shell, empty and other 210 D6 argv prefixes refuse invalid-request + --- + duration_ms: 50.629804 + type: 'test' + ... +# Subtest: R4 rotateBy (sage-1782): a real calendar day after today UTC, or invalid-request +ok 394 - R4 rotateBy (sage-1782): a real calendar day after today UTC, or invalid-request + --- + duration_ms: 40.278358 + type: 'test' + ... +# Subtest: G19: a grant naming a host that is pending-install refuses host-not-ready, and an unknown host host-unknown +ok 395 - G19: a grant naming a host that is pending-install refuses host-not-ready, and an unknown host host-unknown + --- + duration_ms: 27.519948 + type: 'test' + ... +# Subtest: R4, G5: the raise routes to the human and its event body binds the eight fields with their hashes +ok 396 - R4, G5: the raise routes to the human and its event body binds the eight fields with their hashes + --- + duration_ms: 24.661542 + type: 'test' + ... +# Subtest: G4 (host block): the broker appends the host, each prefix, the rotate date and new key or change +ok 397 - G4 (host block): the broker appends the host, each prefix, the rotate date and new key or change + --- + duration_ms: 44.124965 + type: 'test' + ... +# Subtest: 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard +ok 398 - 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard + --- + duration_ms: 84.599994 + type: 'test' + ... +# Subtest: a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact +ok 399 - a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact + --- + duration_ms: 102.492321 + type: 'test' + ... +# Subtest: the 3i engine refuses a migrated store, migrating or not, and leaves it as it was +ok 400 - the 3i engine refuses a migrated store, migrating or not, and leaves it as it was + --- + duration_ms: 89.337856 + type: 'test' + ... +# Subtest: A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it +ok 401 - A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it + --- + duration_ms: 81.509389 + type: 'test' + ... +# Subtest: the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor +ok 402 - the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor + --- + duration_ms: 15.985022 + type: 'test' + ... +# Subtest: hosts: one record per business and host, a ready host has its installer and check, grants need the host +ok 403 - hosts: one record per business and host, a ready host has its installer and check, grants need the host + --- + duration_ms: 12.713666 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 298 runtime: human scope approval writes the file and organization history at the supplied revision +ok 404 - row 298 runtime: human scope approval writes the file and organization history at the supplied revision + --- + duration_ms: 80.244348 + type: 'test' + ... +# Subtest: row 298 (Q3): only the human at the cli reads or sets the scope; agents, the tester, a reader and the Console refuse +ok 405 - row 298 (Q3): only the human at the cli reads or sets the scope; agents, the tester, a reader and the Console refuse + --- + duration_ms: 92.30507 + type: 'test' + ... +# Subtest: row 298 (Q1): organization.set and limits.set refuse a grantScope key, and nothing is written +ok 406 - row 298 (Q1): organization.set and limits.set refuse a grantScope key, and nothing is written + --- + duration_ms: 59.764875 + type: 'test' + ... +# Subtest: row 298 (Q3): the human verb writes the scope and a grant.scope record with the human proof and both sha256 +ok 407 - row 298 (Q3): the human verb writes the scope and a grant.scope record with the human proof and both sha256 + --- + duration_ms: 52.739967 + type: 'test' + ... +# Subtest: row 298 (Q4): an in-scope Gitea grant is issued with no inbox item, logged with 236 records, and revocable +ok 408 - row 298 (Q4): an in-scope Gitea grant is issued with no inbox item, logged with 236 records, and revocable + --- + duration_ms: 155.759924 + type: 'test' + ... +# Subtest: row 298: an out-of-scope Gitea grant waits for the human, whose Approve still issues it +ok 409 - row 298: an out-of-scope Gitea grant waits for the human, whose Approve still issues it + --- + duration_ms: 116.843754 + type: 'test' + ... +# Subtest: row 298: with no scope, a bad scope or an unreadable file, an in-scope-looking grant waits +ok 410 - row 298: with no scope, a bad scope or an unreadable file, an in-scope-looking grant waits + --- + duration_ms: 144.644756 + type: 'test' + ... +# Subtest: row 298 (Q6): a chief-of-staff instance that is not launch.by never raises in scope +ok 411 - row 298 (Q6): a chief-of-staff instance that is not launch.by never raises in scope + --- + duration_ms: 48.767366 + type: 'test' + ... +# Subtest: row 298 (Q5): a scope narrowed between the raise and the spend ends the grant scope-changed +ok 412 - row 298 (Q5): a scope narrowed between the raise and the spend ends the grant scope-changed + --- + duration_ms: 89.778801 + type: 'test' + ... +# Subtest: row 298 (Q2): an in-scope host grant is spent with no Approve; ls never covers lsblk, nor a scope command extra arguments +ok 413 - row 298 (Q2): an in-scope host grant is spent with no Approve; ls never covers lsblk, nor a scope command extra arguments + --- + duration_ms: 80.36904 + type: 'test' + ... +# Subtest: row 298 (Q5): a host scope narrowed before the spend ends scope-changed +ok 414 - row 298 (Q5): a host scope narrowed before the spend ends scope-changed + --- + duration_ms: 68.628818 + type: 'test' + ... +# Subtest: row 298 Q4: missing scope evidence or a bad scope digest cannot authorize execution +ok 415 - row 298 Q4: missing scope evidence or a bad scope digest cannot authorize execution + --- + duration_ms: 92.874302 + type: 'test' + ... +# Subtest: row 298 T4/T8: an in-scope host grant issues, records and revokes through the existing executor +ok 416 - row 298 T4/T8: an in-scope host grant issues, records and revokes through the existing executor + --- + duration_ms: 75.414258 + type: 'test' + ... +# Subtest: row 298 T6: host enrollment stays open for human Approve even with both methods in scope +ok 417 - row 298 T6: host enrollment stays open for human Approve even with both methods in scope + --- + duration_ms: 51.810209 + type: 'test' + ... +# Subtest: row 298: scope without an organization revision never closes automatically +ok 418 - row 298: scope without an organization revision never closes automatically + --- + duration_ms: 46.194473 + type: 'test' + ... +# Subtest: REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary +ok 419 - REQ-WAIT-1: the broker hard waits are exactly the list, and match the business vocabulary + --- + duration_ms: 1.194257 + type: 'test' + ... +# Subtest: REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable +ok 420 - REQ-WAIT-2: a business granting a hard wait at either class is refused; the actions that left are grantable + --- + duration_ms: 18.880648 + type: 'test' + ... +# Subtest: REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it +ok 421 - REQ-DEC-2: every hard wait goes to the human, cited or not, and the arbiter cannot resolve it + --- + duration_ms: 405.513798 + type: 'test' + ... +# Subtest: REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human +ok 422 - REQ-DEC-2: a gated raise citing the current spec goes to the arbiter for its domain; uncited, to the human + --- + duration_ms: 164.599351 + type: 'test' + ... +# Subtest: REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it +ok 423 - REQ-DEC-2: an arbiter-approved cited gated decision authorizes the raiser, and the human cannot resolve it + --- + duration_ms: 46.214724 + type: 'test' + ... +# Subtest: REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation +ok 424 - REQ-DEC-2: a cited merge raised by merge-gate goes to the technical arbiter; a merge raised without the grant routes by citation + --- + duration_ms: 65.733858 + type: 'test' + ... +# Subtest: REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human +ok 425 - REQ-DEC-2: a stale or unconfirmed citation refuses without a decision; an arbiter raising its own goes to the human + --- + duration_ms: 99.298445 + type: 'test' + ... +# Subtest: Q169: the chief of staff's end of the assistant stops every thread run; its own run and another ender's are refused +ok 426 - Q169: the chief of staff's end of the assistant stops every thread run; its own run and another ender's are refused + --- + duration_ms: 48.45652 + type: 'test' + ... +# Subtest: Q169: a revoke of the assistant the chief of staff raises goes to the human, cited or not, and no arbiter resolves it +ok 427 - Q169: a revoke of the assistant the chief of staff raises goes to the human, cited or not, and no arbiter resolves it + --- + duration_ms: 121.912958 + type: 'test' + ... +# Subtest: Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused +ok 428 - Q169: another role's cited revoke of the assistant, resolved by an arbiter, is refused + --- + duration_ms: 63.469148 + type: 'test' + ... +# Subtest: Q169: a revoke of the assistant citing a decision the human resolved stops its thread run +ok 429 - Q169: a revoke of the assistant citing a decision the human resolved stops its thread run + --- + duration_ms: 51.420343 + type: 'test' + ... +# Subtest: Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes +ok 430 - Q169: a cited revoke of a role not in END_PROTECTED still goes to the arbiter, and executes + --- + duration_ms: 52.100453 + type: 'test' + ... +# Subtest: Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human +ok 431 - Q169: a role granted role.revoke at either class still sends a revoke of the assistant to the human + --- + duration_ms: 66.580501 + type: 'test' + ... +# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd +ok 432 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd + --- + duration_ms: 87.4736 + type: 'test' + ... +# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range +ok 433 - row 280: every injected picker sample is unprivileged and outside the ephemeral range + --- + duration_ms: 0.350529 + type: 'test' + ... +# Subtest: the executor tests need sshd, ssh, ssh-agent, ssh-add, ssh-keygen and setpriv: a missing one fails, never skips +ok 434 - the executor tests need sshd, ssh, ssh-agent, ssh-add, ssh-keygen and setpriv: a missing one fails, never skips + --- + duration_ms: 0.119396 + type: 'test' + ... +# Subtest: T3: organization.set, limits.set and instances.set refuse hosts, and the writer never runs +ok 435 - T3: organization.set, limits.set and instances.set refuse hosts, and the writer never runs + --- + duration_ms: 35.751669 + type: 'test' + ... +# Subtest: T4: the value check takes one unencrypted ed25519 key and nothing else +ok 436 - T4: the value check takes one unencrypted ed25519 key and nothing else + --- + duration_ms: 173.780411 + type: 'test' + ... +# Subtest: T5 to T8: registry, grant, argv shape and allowlist refusals +ok 437 - T5 to T8: registry, grant, argv shape and allowlist refusals + --- + duration_ms: 518.345815 + type: 'test' + ... +# Subtest: T9: under 1.7 every call needs a decision bound to its host, argv and stdin, spent once +ok 438 - T9: under 1.7 every call needs a decision bound to its host, argv and stdin, spent once + --- + duration_ms: 283.972324 + type: 'test' + ... +# Subtest: T10, T11: argv reaches sudo unchanged after sudo -n -- +ok 439 - T10, T11: argv reaches sudo unchanged after sudo -n -- + --- + duration_ms: 268.500323 + type: 'test' + ... +# Subtest: T12, T13: exit code passes through, the timeout kills the group, output is capped +ok 440 - T12, T13: exit code passes through, the timeout kills the group, output is capped + --- + duration_ms: 1498.897121 + type: 'test' + ... +# Subtest: T14: a host key not in the registry refuses and nothing runs +ok 441 - T14: a host key not in the registry refuses and nothing runs + --- + duration_ms: 170.351349 + type: 'test' + ... +# Subtest: G18: hosts.check with a wrong pin refuses host-key-mismatch and runs nothing on the host +ok 442 - G18: hosts.check with a wrong pin refuses host-key-mismatch and runs nothing on the host + --- + duration_ms: 311.718009 + type: 'test' + ... +# Subtest: N3: a remote exit 255 that prints the pin refusal text is the command result, and an ssh failure keeps its message +ok 443 - N3: a remote exit 255 that prints the pin refusal text is the command result, and an ssh failure keeps its message + --- + duration_ms: 286.430234 + type: 'test' + ... +# Subtest: T15: ssh reads no config file and no user known_hosts +ok 444 - T15: ssh reads no config file and no user known_hosts + --- + duration_ms: 260.420454 + type: 'test' + ... +# Subtest: T16, T17: key material in output or stdin refuses credential-leak, and no event holds it +ok 445 - T16, T17: key material in output or stdin refuses credential-leak, and no event holds it + --- + duration_ms: 605.510394 + type: 'test' + ... +# Subtest: T18, T19, T20: one call at a time, no key in any argv or env, and nothing left after +ok 446 - T18, T19, T20: one call at a time, no key in any argv or env, and nothing left after + --- + duration_ms: 4658.157715 + type: 'test' + ... +# Subtest: T21: revoke kills the call in flight, and the next call refuses +ok 447 - T21: revoke kills the call in flight, and the next call refuses + --- + duration_ms: 286.758563 + type: 'test' + ... +# Subtest: T22: events carry host, address, user and argv in clear, and sizes and hashes only +ok 448 - T22: events carry host, address, user and argv in clear, and sizes and hashes only + --- + duration_ms: 255.528635 + type: 'test' + ... +# Subtest: T24: no literal gitea and vikunja kind list outside vocabulary.mjs, and the credential use sites are known +ok 449 - T24: no literal gitea and vikunja kind list outside vocabulary.mjs, and the credential use sites are known + --- + duration_ms: 28.269947 + type: 'test' + ... +# Subtest: T25: no role definition lists host.sudo while it is a hard wait +ok 450 - T25: no role definition lists host.sudo while it is a hard wait + --- + duration_ms: 0.439966 + type: 'test' + ... +# Subtest: T27: the bus child dying takes ssh and ssh-agent with it +ok 451 - T27: the bus child dying takes ssh and ssh-agent with it + --- + duration_ms: 309.454327 + type: 'test' + ... +# Subtest: T27: ssh-add -t drops the key from an agent the test keeps alive +ok 452 - T27: ssh-add -t drops the key from an agent the test keeps alive + --- + duration_ms: 3552.138907 + type: 'test' + ... +# Subtest: N2: a hung ssh-add is killed at its limit or on abort, and nothing is left running +ok 453 - N2: a hung ssh-add is killed at its limit or on abort, and nothing is left running + --- + duration_ms: 427.568532 + type: 'test' + ... +# Subtest: T27: the start sweep keeps a live bus dir and kills only a matching live process +ok 454 - T27: the start sweep keeps a live bus dir and kills only a matching live process + --- + duration_ms: 26.820722 + type: 'test' + ... +# Subtest: T27: the bus start sweeps /secrets/run before it listens, and a stray entry stops the start +ok 455 - T27: the bus start sweeps /secrets/run before it listens, and a stray entry stops the start + --- + duration_ms: 49.50046 + type: 'test' + ... +# Subtest: M3: host.run refuses host-not-granted unless the grant record has an approved, spent host grant +ok 456 - M3: host.run refuses host-not-granted unless the grant record has an approved, spent host grant + --- + duration_ms: 143.475902 + type: 'test' + ... +# Subtest: M3: a host_grants record gives Credentials a store reference at start, and a restart reads its key +ok 457 - M3: a host_grants record gives Credentials a store reference at start, and a restart reads its key + --- + duration_ms: 98.425402 + type: 'test' + ... +# Subtest: G16: the writer refuses each user, tag and key the design names, before any key file +ok 458 - G16: the writer refuses each user, tag and key the design names, before any key file + --- + duration_ms: 1970.624673 + type: 'test' + ... +# Subtest: G16: from= comes from the host file, a privileged user skips the group and sudo checks, and the line is exact +ok 459 - G16: from= comes from the host file, a privileged user skips the group and sudo checks, and the line is exact + --- + duration_ms: 502.714056 + type: 'test' + ... +# Subtest: G16: list shows tagged lines only, and add and remove never touch a line outside the tag pattern +ok 460 - G16: list shows tagged lines only, and add and remove never touch a line outside the tag pattern + --- + duration_ms: 253.369087 + type: 'test' + ... +# Subtest: G25: the writer refuses a symlinked dir or user file, a group-writable dir and an odd tmp, and writes 0644 +ok 461 - G25: the writer refuses a symlinked dir or user file, a group-writable dir and an odd tmp, and writes 0644 + --- + duration_ms: 370.554197 + type: 'test' + ... +# Subtest: G16: mosaic-keys passes the three requests to the writer through sudo and refuses anything else without it +ok 462 - G16: mosaic-keys passes the three requests to the writer through sudo and refuses anything else without it + --- + duration_ms: 73.54508 + type: 'test' + ... +# Subtest: E3: the sudoers line and the sshd drop-in are the design lines and parse +ok 463 - E3: the sudoers line and the sshd drop-in are the design lines and parse + --- + duration_ms: 12.203428 + type: 'test' + ... +# Subtest: human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse +ok 464 - human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse + --- + duration_ms: 1.593468 + type: 'test' + ... +# Subtest: process reader gets own kernel identity without exposing environment values +ok 465 - process reader gets own kernel identity without exposing environment values + --- + duration_ms: 0.406502 + type: 'test' + ... +# Subtest: EACCES ancestor environments skip only markers; commands and registered launches still refuse +ok 466 - EACCES ancestor environments skip only markers; commands and registered launches still refuse + --- + duration_ms: 0.726767 + type: 'test' + ... +# Subtest: real pid 1 remains inspectable when its environment is protected +ok 467 - real pid 1 remains inspectable when its environment is protected + --- + duration_ms: 0.273845 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 165: instances and instances.set refuse every non-human session but the tester, the chief of staff included, and pass the verified actor +ok 468 - row 165: instances and instances.set refuse every non-human session but the tester, the chief of staff included, and pass the verified actor + --- + duration_ms: 36.060772 + type: 'test' + ... +# Subtest: row 165 runtime: an add and a change reach the organization file with the human as actor; each refusal keeps the bytes and logs nothing +ok 469 - row 165 runtime: an add and a change reach the organization file with the human as actor; each refusal keeps the bytes and logs nothing + --- + duration_ms: 128.133303 + type: 'test' + ... +# Subtest: row 194 T12: agent and reader sessions refuse veto.set; the tester gets add and change but not delete or veto.set; the human passes the hook for each listed verb +ok 470 - row 194 T12: agent and reader sessions refuse veto.set; the tester gets add and change but not delete or veto.set; the human passes the hook for each listed verb + --- + duration_ms: 23.432429 + type: 'test' + ... +# Subtest: system Python is a resolved root-owned ELF, never a shim or home interpreter +ok 471 - system Python is a resolved root-owned ELF, never a shim or home interpreter + --- + duration_ms: 2.053198 + type: 'test' + ... +# Subtest: real system interpreter is available and safely inspected +ok 472 - real system interpreter is available and safely inspected + --- + duration_ms: 18.776593 + type: 'test' + ... +# Subtest: restart receipt appends actual replacement identity and refuses unsafe files +ok 473 - restart receipt appends actual replacement identity and refuses unsafe files + --- + duration_ms: 2.747485 + type: 'test' + ... +# Subtest: activation gate compares fresh startup receipt to the current interpreter identity +ok 474 - activation gate compares fresh startup receipt to the current interpreter identity + --- + duration_ms: 1.325179 + type: 'test' + ... +# Subtest: non-regular startup receipt refuses promptly without waiting on a FIFO peer +ok 475 - non-regular startup receipt refuses promptly without waiting on a FIFO peer + --- + duration_ms: 27.513124 + type: 'test' + ... +# Subtest: 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 +ok 476 - 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 + --- + duration_ms: 36.83899 + type: 'test' + ... +# Subtest: checkLand refuses on the decision and the review +ok 477 - checkLand refuses on the decision and the review + --- + duration_ms: 33.210461 + type: 'test' + ... +# Subtest: REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human +ok 478 - REQ-LAND-1: a gated merge decision refuses not-authorized, cited and approved by the arbiter or uncited and approved by the human + --- + duration_ms: 81.484345 + type: 'test' + ... +# Subtest: REQ-LAND-1: a within-role merge grant refuses not-authorized at the land +ok 479 - REQ-LAND-1: a within-role merge grant refuses not-authorized at the land + --- + duration_ms: 22.896034 + type: 'test' + ... +# Subtest: a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer +ok 480 - a cross-role merge that routes to the human, because merge-gate is its own arbiter, lands on the human's CLI answer + --- + duration_ms: 25.319026 + type: 'test' + ... +# Subtest: a merge option with no first line refuses no-subject, as land-work does +ok 481 - a merge option with no first line refuses no-subject, as land-work does + --- + duration_ms: 22.456441 + type: 'test' + ... +# Subtest: checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands +ok 482 - checkLand refuses with land-work's codes past the authority check, and a decision raised for refactor never lands + --- + duration_ms: 59.17997 + type: 'test' + ... +# Subtest: a ticket outlives the run that asked, and recordLand checks the task again +ok 483 - a ticket outlives the run that asked, and recordLand checks the task again + --- + duration_ms: 28.217017 + type: 'test' + ... +# Subtest: two tickets on one decision: the first recordLand lands, the second refuses decision-consumed and records nothing +ok 484 - two tickets on one decision: the first recordLand lands, the second refuses decision-consumed and records nothing + --- + duration_ms: 28.067112 + type: 'test' + ... +# Subtest: landRefused files the code on the task, tells the role only with notify, and ends the ticket +ok 485 - landRefused files the code on the task, tells the role only with notify, and ends the ticket + --- + duration_ms: 28.28677 + type: 'test' + ... +# Subtest: landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread +ok 486 - landHeld is true only for an approved, unspent cross-role merge decision this role raised for a task in this thread + --- + duration_ms: 27.493635 + type: 'test' + ... +# Subtest: landHolders lists a merge decision exactly while landHeld is true for its non-thread instance, in decision order +ok 487 - landHolders lists a merge decision exactly while landHeld is true for its non-thread instance, in decision order + --- + duration_ms: 36.956242 + type: 'test' + ... +# Subtest: landHolders leaves out a thread instance's decision, even one raised before its role became one +ok 488 - landHolders leaves out a thread instance's decision, even one raised before its role became one + --- + duration_ms: 22.249241 + type: 'test' + ... +# Subtest: landRelease releases the holding run by land-relaunch once it has asked message.receive and nothing delivered to it is unread, and waiting messages go to the next holder +ok 489 - landRelease releases the holding run by land-relaunch once it has asked message.receive and nothing delivered to it is unread, and waiting messages go to the next holder + --- + duration_ms: 36.175912 + type: 'test' + ... +# Subtest: a landing run started after the resolution passes checkLand for its held decision before any message.receive, and lands it +ok 490 - a landing run started after the resolution passes checkLand for its held decision before any message.receive, and lands it + --- + duration_ms: 28.581503 + type: 'test' + ... +# Subtest: the bus process answers landHolders and landRelease from their own lines, not as credentialStatus +ok 491 - the bus process answers landHolders and landRelease from their own lines, not as credentialStatus + --- + duration_ms: 135.379126 + type: 'test' + ... +# Subtest: usage.begin with a decision id needs it held for the run's instance, usage.end needs the begin, and the limit checks see the landing turn +ok 492 - usage.begin with a decision id needs it held for the run's instance, usage.end needs the begin, and the limit checks see the landing turn + --- + duration_ms: 34.530034 + type: 'test' + ... +# Subtest: no run may write the action.allowed for git.merge.protected itself +ok 493 - no run may write the action.allowed for git.merge.protected itself + --- + duration_ms: 16.981969 + type: 'test' + ... +# Subtest: a message to a stopped role sends launch.by one notice, and the result says so +ok 494 - a message to a stopped role sends launch.by one notice, and the result says so + --- + duration_ms: 27.046968 + type: 'test' + ... +# Subtest: a message to a role outside launch.instances says so in its result and in the notice +ok 495 - a message to a role outside launch.instances says so in its result and in the notice + --- + duration_ms: 19.466258 + type: 'test' + ... +# Subtest: a message to a running role sends no notice and its result is unchanged +ok 496 - a message to a running role sends no notice and its result is unchanged + --- + duration_ms: 13.849492 + type: 'test' + ... +# Subtest: a re-route at a claim, a release and claim, and a broker restart send no second notice +ok 497 - a re-route at a claim, a release and claim, and a broker restart send no second notice + --- + duration_ms: 21.365014 + type: 'test' + ... +# Subtest: a run launched but not yet claimed counts as no holder +ok 498 - a run launched but not yet claimed counts as no holder + --- + duration_ms: 12.856068 + type: 'test' + ... +# Subtest: no notice for a message to launch.by, from it, a refused one from a tester, to the human, or in a thread to a thread instance +ok 499 - no notice for a message to launch.by, from it, a refused one from a tester, to the human, or in a thread to a thread instance + --- + duration_ms: 24.632882 + type: 'test' + ... +# Subtest: a business with no launch block tells nobody and says there is no launcher +ok 500 - a business with no launch block tells nobody and says there is no launcher + --- + duration_ms: 10.637795 + type: 'test' + ... +# Subtest: the notice sender stays internal: no role is named _bus and no caller can send as it or to it +ok 501 - the notice sender stays internal: no role is named _bus and no caller can send as it or to it + --- + duration_ms: 32.257775 + type: 'test' + ... +# Subtest: row 302 a run threadIdle released answers launcher-released on receive, state, read and send, logs each, and claims nothing again +ok 502 - row 302 a run threadIdle released answers launcher-released on receive, state, read and send, logs each, and claims nothing again + --- + duration_ms: 41.553908 + type: 'test' + ... +# Subtest: row 302 with a run launcher-released, a run that lost its claim another way still answers not-holder +ok 503 - row 302 with a run launcher-released, a run that lost its claim another way still answers not-holder + --- + duration_ms: 33.636758 + type: 'test' + ... +# Subtest: row 302 a run landRelease released answers launcher-released, and claims nothing again +ok 504 - row 302 a run landRelease released answers launcher-released, and claims nothing again + --- + duration_ms: 32.086032 + type: 'test' + ... +# Subtest: C2-03b T6: the slot before any chief evidence, then the listed chief's live grant +ok 505 - C2-03b T6: the slot before any chief evidence, then the listed chief's live grant + --- + duration_ms: 36.42171 + type: 'test' + ... +# Subtest: C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended +ok 506 - C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended + --- + duration_ms: 289.106546 + type: 'test' + ... +# Subtest: C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again +ok 507 - C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again + --- + duration_ms: 33.329665 + type: 'test' + ... +# Subtest: C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant +ok 508 - C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant + --- + duration_ms: 32.63784 + type: 'test' + ... +# Subtest: C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses +ok 509 - C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses + --- + duration_ms: 15.247874 + type: 'test' + ... +# Subtest: C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 +ok 510 - C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 + --- + duration_ms: 760.645126 + type: 'test' + ... +# Subtest: C2-03a library.sync: every agent, the tester and a reader are refused before the adapter runs +ok 511 - C2-03a library.sync: every agent, the tester and a reader are refused before the adapter runs + --- + duration_ms: 23.684793 + type: 'test' + ... +# Subtest: C2-03a library.sync: the human fetches, accept passes through, and a held sync is a recorded refusal +ok 512 - C2-03a library.sync: the human fetches, accept passes through, and a held sync is a recorded refusal + --- + duration_ms: 17.305739 + type: 'test' + ... +# Subtest: C2-03a library.sync: a LibraryError keeps its code and a host without sync is not configured +ok 513 - C2-03a library.sync: a LibraryError keeps its code and a host without sync is not configured + --- + duration_ms: 26.816882 + type: 'test' + ... +# Subtest: C2-03a runtime: a librarySync from a boot config, with no function, is refused +ok 514 - C2-03a runtime: a librarySync from a boot config, with no function, is refused + --- + duration_ms: 1.306855 + type: 'test' + ... +# Subtest: C2-03a runtime: the timer syncs each entry with a user at start and on each tick, logs codes only, and stops on close +ok 515 - C2-03a runtime: the timer syncs each entry with a user at start and on each tick, logs codes only, and stops on close + --- + duration_ms: 571.394874 + type: 'test' + ... +# Subtest: row 254 human-cli: library.sync outlasts the 5 s client default, and library.status does not +ok 516 - row 254 human-cli: library.sync outlasts the 5 s client default, and library.status does not + --- + duration_ms: 6083.448736 + type: 'test' + ... +# Subtest: C2-04 M4: both verbs reject every agent before arguments or adapter access +ok 517 - C2-04 M4: both verbs reject every agent before arguments or adapter access + --- + duration_ms: 37.586 + type: 'test' + ... +# Subtest: C2-04 bus: human reads validate keys and return adapter results without path leakage +ok 518 - C2-04 bus: human reads validate keys and return adapter results without path leakage + --- + duration_ms: 14.345002 + type: 'test' + ... +# Subtest: C2-04 socket: each async library verb resolves its result rather than serializing {} +ok 519 - C2-04 socket: each async library verb resolves its result rather than serializing {} + --- + duration_ms: 80.180769 + type: 'test' + ... +# Subtest: C2-04 runtime: protectedRoots skips library but retains real code-root credential protection +ok 520 - C2-04 runtime: protectedRoots skips library but retains real code-root credential protection + --- + duration_ms: 120.174666 + type: 'test' + ... +# Subtest: C2-04 runtime: unsafe existing mirror refuses boot and never publishes a socket +ok 521 - C2-04 runtime: unsafe existing mirror refuses boot and never publishes a socket + --- + duration_ms: 30.445876 + type: 'test' + ... +# Subtest: C2-04 runtime: real library adapters reach the socket and lock waits leave other bus reads responsive +ok 522 - C2-04 runtime: real library adapters reach the socket and lock waits leave other bus reads responsive + --- + duration_ms: 257.316092 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store +ok 523 - T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store + --- + duration_ms: 102.996325 + type: 'test' + ... +# Subtest: T20 fire: an instance already delisted still has its tokens revoked and the file is left alone +ok 524 - T20 fire: an instance already delisted still has its tokens revoked and the file is left alone + --- + duration_ms: 67.690804 + type: 'test' + ... +# Subtest: T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on +ok 525 - T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on + --- + duration_ms: 68.323616 + type: 'test' + ... +# Subtest: T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot +ok 526 - T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot + --- + duration_ms: 113.433932 + type: 'test' + ... +# Subtest: T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses +ok 527 - T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses + --- + duration_ms: 118.423898 + type: 'test' + ... +# Subtest: T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything +ok 528 - T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything + --- + duration_ms: 80.847197 + type: 'test' + ... +# Subtest: row 281 T1 fire: a host. or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged +ok 529 - row 281 T1 fire: a host. or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged + --- + duration_ms: 69.504885 + type: 'test' + ... +# Subtest: row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued +ok 530 - row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued + --- + duration_ms: 65.2344 + type: 'test' + ... +# Subtest: row 194 T12: agent and reader sessions refuse the lifecycle verbs before any effect; the tester gets launch, end and the request read, never regenerate +ok 531 - row 194 T12: agent and reader sessions refuse the lifecycle verbs before any effect; the tester gets launch, end and the request read, never regenerate + --- + duration_ms: 43.760152 + type: 'test' + ... +# Subtest: row 194 V2 and V4 at the verb: the request is open, by the human, with a human.input; thread, retired, unknown and revoked refuse with no event +ok 532 - row 194 V2 and V4 at the verb: the request is open, by the human, with a human.input; thread, retired, unknown and revoked refuse with no event + --- + duration_ms: 21.58222 + type: 'test' + ... +# Subtest: row 194 D1.1 take: a request is taken once, closes once, and lifecycleRequests lists only what is not closed +ok 533 - row 194 D1.1 take: a request is taken once, closes once, and lifecycleRequests lists only what is not closed + --- + duration_ms: 17.681131 + type: 'test' + ... +# Subtest: row 194 D1.1 take: a launch.revoke after the request closes it launch-revoked, and a request past 60 s closes request-expired +ok 534 - row 194 D1.1 take: a launch.revoke after the request closes it launch-revoked, and a request past 60 s closes request-expired + --- + duration_ms: 19.48505 + type: 'test' + ... +# Subtest: row 194 T15 (bus): while halted, launch and regenerate refuse processing-halted at the verb and at the take, hire and fire refuse, terminate goes; an unreadable switch refuses with its code +ok 535 - row 194 T15 (bus): while halted, launch and regenerate refuse processing-halted at the verb and at the take, hire and fire refuse, terminate goes; an unreadable switch refuses with its code + --- + duration_ms: 28.671496 + type: 'test' + ... +# Subtest: row 194 T12a: the tester launches and ends on its own business with actor tester; bus.tester off in the file refuses the call and the take tester-off +ok 536 - row 194 T12a: the tester launches and ends on its own business with actor tester; bus.tester off in the file refuses the call and the take tester-off + --- + duration_ms: 22.792225 + type: 'test' + ... +# Subtest: row 194 V3 terminate: claims revoked, open requests cancelled, bound runs named, taken requests listed; nothing at all answers not-held +ok 537 - row 194 V3 terminate: claims revoked, open requests cancelled, bound runs named, taken requests listed; nothing at all answers not-held + --- + duration_ms: 30.825294 + type: 'test' + ... +# Subtest: row 194 V3 terminate of a thread instance: the human ends every thread, the tester only its own +ok 538 - row 194 V3 terminate of a thread instance: the human ends every thread, the tester only its own + --- + duration_ms: 21.433079 + type: 'test' + ... +# Subtest: row 194 T6 V5 order at the verb: the writer's named refusals, then instance-running, instance-starting, the last-listed refusal and the revision +ok 539 - row 194 T6 V5 order at the verb: the writer's named refusals, then instance-running, instance-starting, the last-listed refusal and the revision + --- + duration_ms: 41.683472 + type: 'test' + ... +# Subtest: row 194 V5: an open launch past its 60 s is not starting, as it can only close request-expired +ok 540 - row 194 V5: an open launch past its 60 s is not starting, as it can only close request-expired + --- + duration_ms: 15.094974 + type: 'test' + ... +# Subtest: row 194 V5 after the take: lifecycleDelete re-checks running and starting, then commits through the writer with the human as actor +ok 541 - row 194 V5 after the take: lifecycleDelete re-checks running and starting, then commits through the writer with the human as actor + --- + duration_ms: 26.542685 + type: 'test' + ... +# Subtest: row 194 V5 retry: a retired name deletes again only after workspace-rename-failed, and that request commits nothing +ok 542 - row 194 V5 retry: a retired name deletes again only after workspace-rename-failed, and that request commits nothing + --- + duration_ms: 19.508345 + type: 'test' + ... +# Subtest: row 194 V5 runtime: a delete request, the take and lifecycleDelete commit the file with retired, log the human and reload so the name no longer binds +ok 543 - row 194 V5 runtime: a delete request, the take and lifecycleDelete commit the file with retired, log the human and reload so the name no longer binds + --- + duration_ms: 134.567173 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers +ok 544 - REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers + --- + duration_ms: 1.26506 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names +ok 545 - REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names + --- + duration_ms: 0.209821 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced +ok 546 - REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced + --- + duration_ms: 13.912255 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count +ok 547 - REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count + --- + duration_ms: 13.031922 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through +ok 548 - REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through + --- + duration_ms: 11.765013 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time +ok 549 - REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time + --- + duration_ms: 13.311435 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code +ok 550 - REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code + --- + duration_ms: 11.793459 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer +ok 551 - REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer + --- + duration_ms: 14.485196 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded +ok 552 - REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded + --- + duration_ms: 10.700669 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check +ok 553 - REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check + --- + duration_ms: 9.446774 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report +ok 554 - REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report + --- + duration_ms: 10.721725 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws +ok 555 - REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws + --- + duration_ms: 9.817821 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report +ok 556 - REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report + --- + duration_ms: 0.466887 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set +ok 557 - REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set + --- + duration_ms: 23.628664 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name +ok 558 - REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name + --- + duration_ms: 9.89213 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 core reaches limit checks only through the plug-in loader +ok 559 - REQ-LIMIT-3 core reaches limit checks only through the plug-in loader + --- + duration_ms: 1.067177 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check +ok 560 - REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check + --- + duration_ms: 37.532084 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit +ok 561 - REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit + --- + duration_ms: 40.090543 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code +ok 562 - REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code + --- + duration_ms: 83.076687 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit +ok 563 - REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit + --- + duration_ms: 22.514973 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a broker with no limit checks configured never stops a run +ok 564 - REQ-LIMIT-4 a broker with no limit checks configured never stops a run + --- + duration_ms: 15.194081 + type: 'test' + ... +# limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0} +# organization: {"event":"reload-needs-restart","business":"demo"} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"8c4bc2c9-18d8-4776-b6f1-dbeb4ff6b057","source":"@none","code":"baseline-unknown"} +# limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1} +# usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"0605e06b-323b-4c38-9d64-84168beea1d9","source":"@none","code":"baseline-unknown"} +# Subtest: REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since +# organization: {"event":"reload-needs-restart","business":"demo"} +ok 565 - REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since + --- + duration_ms: 141.477096 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed +ok 566 - REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed + --- + duration_ms: 36.448903 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive +ok 567 - REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive + --- + duration_ms: 47.760222 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 +ok 568 - REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 + --- + duration_ms: 44.655441 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn +ok 569 - REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn + --- + duration_ms: 63.376842 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: limits binds actor from human proof and rejects role, reader, a tester set and forged actor +ok 570 - limits binds actor from human proof and rejects role, reader, a tester set and forged actor + --- + duration_ms: 21.361365 + type: 'test' + ... +# Subtest: runtime wires verified human settings to the actual shared file writer and actor receipt +ok 571 - runtime wires verified human settings to the actual shared file writer and actor receipt + --- + duration_ms: 104.332484 + type: 'test' + ... +# Subtest: uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled +ok 572 - uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled + --- + duration_ms: 54.520269 + type: 'test' + ... +# Subtest: within-role sends cite an open gated launch decision without spending it or naming it in grants +ok 573 - within-role sends cite an open gated launch decision without spending it or naming it in grants + --- + duration_ms: 26.807702 + type: 'test' + ... +# Subtest: missing and foreign-business citations refuse and roll back message and grant +ok 574 - missing and foreign-business citations refuse and roll back message and grant + --- + duration_ms: 20.015646 + type: 'test' + ... +# Subtest: cross-role sends still need a matching resolved decision and consume it once +ok 575 - cross-role sends still need a matching resolved decision and consume it once + --- + duration_ms: 22.078016 + type: 'test' + ... +# Subtest: trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester +ok 576 - trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester + --- + duration_ms: 24.104149 + type: 'test' + ... +# Subtest: replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester +ok 577 - replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester + --- + duration_ms: 23.891823 + type: 'test' + ... +# Subtest: trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events +ok 578 - trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events + --- + duration_ms: 30.105041 + type: 'test' + ... +# Subtest: replies leaves out other users thread messages and still fills a page +ok 579 - replies leaves out other users thread messages and still fills a page + --- + duration_ms: 175.926679 + type: 'test' + ... +# Subtest: messages in the business human and tester threads are not hidden (row 177 unchanged) +ok 580 - messages in the business human and tester threads are not hidden (row 177 unchanged) + --- + duration_ms: 35.60489 + type: 'test' + ... +# Subtest: governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages +ok 581 - governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages + --- + duration_ms: 95.598839 + type: 'test' + ... +# Subtest: messages pages all human messages newest first without writes; read state is history +ok 582 - messages pages all human messages newest first without writes; read state is history + --- + duration_ms: 298.683989 + type: 'test' + ... +# Subtest: messages refuses role callers, invalid paging and cursors outside this human feed +ok 583 - messages refuses role callers, invalid paging and cursors outside this human feed + --- + duration_ms: 24.854496 + type: 'test' + ... +# Subtest: views messages passes only its paging arguments through +ok 584 - views messages passes only its paging arguments through + --- + duration_ms: 0.228533 + type: 'test' + ... +# Subtest: messages isolates businesses even with a valid foreign cursor +ok 585 - messages isolates businesses even with a valid foreign cursor + --- + duration_ms: 18.036171 + type: 'test' + ... +# Subtest: the assistant sends to the user and to the chief of staff only +ok 586 - the assistant sends to the user and to the chief of staff only + --- + duration_ms: 40.346578 + type: 'test' + ... +# Subtest: an assistant send to any other role, or to the tester, is refused and logged +ok 587 - an assistant send to any other role, or to the tester, is refused and logged + --- + duration_ms: 32.417651 + type: 'test' + ... +# Subtest: only the user and the chief of staff may send to the assistant; the tester is refused by default +ok 588 - only the user and the chief of staff may send to the assistant; the tester is refused by default + --- + duration_ms: 34.831639 + type: 'test' + ... +# Subtest: REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing +ok 589 - REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing + --- + duration_ms: 25.349315 + type: 'test' + ... +# Subtest: a sender-side list alone refuses a send to a role that has no list +ok 590 - a sender-side list alone refuses a send to a role that has no list + --- + duration_ms: 27.757806 + type: 'test' + ... +# Subtest: a target-side list alone refuses a send from a role that has no list +ok 591 - a target-side list alone refuses a send from a role that has no list + --- + duration_ms: 28.584595 + type: 'test' + ... +# Subtest: the sender list is checked before the target list +ok 592 - the sender list is checked before the target list + --- + duration_ms: 25.81129 + type: 'test' + ... +# Subtest: roles without the field behave exactly as before +ok 593 - roles without the field behave exactly as before + --- + duration_ms: 37.530432 + type: 'test' + ... +# Subtest: a business with no role definitions at all is unlimited +ok 594 - a business with no role definitions at all is unlimited + --- + duration_ms: 31.367715 + type: 'test' + ... +# Subtest: a malformed messaging field refuses at boot +ok 595 - a malformed messaging field refuses at boot + --- + duration_ms: 12.497128 + type: 'test' + ... +# Subtest: the assistant's review.request to a reviewer is refused and logged, even with an approved decision +ok 596 - the assistant's review.request to a reviewer is refused and logged, even with an approved decision + --- + duration_ms: 30.50603 + type: 'test' + ... +# Subtest: a review.verdict to the assistant from a role outside its receiveFrom is refused and logged +ok 597 - a review.verdict to the assistant from a role outside its receiveFrom is refused and logged + --- + duration_ms: 33.872167 + type: 'test' + ... +# Subtest: review requests and verdicts between roles without the field are unchanged +ok 598 - review requests and verdicts between roles without the field are unchanged + --- + duration_ms: 26.84018 + type: 'test' + ... +# Subtest: 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name +ok 599 - 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name + --- + duration_ms: 89.494763 + type: 'test' + ... +# Subtest: REQ-MSG-2: the chief of staff names an instance under its within-role grant, and the write is logged +ok 600 - REQ-MSG-2: the chief of staff names an instance under its within-role grant, and the write is logged + --- + duration_ms: 23.665242 + type: 'test' + ... +# Subtest: REQ-MSG-2: the human names an instance through the CLI +ok 601 - REQ-MSG-2: the human names an instance through the CLI + --- + duration_ms: 17.236511 + type: 'test' + ... +# Subtest: REQ-MSG-2: a role without the grant, or holding it cross-role, is refused not-authorized +ok 602 - REQ-MSG-2: a role without the grant, or holding it cross-role, is refused not-authorized + --- + duration_ms: 20.880013 + type: 'test' + ... +# Subtest: REQ-MSG-2: a name is unique in the business and is never an instance key or a role name +ok 603 - REQ-MSG-2: a name is unique in the business and is never an instance key or a role name + --- + duration_ms: 32.739925 + type: 'test' + ... +# Subtest: REQ-MSG-2: a send by name reaches the instance and records both; a send by instance key is unchanged +ok 604 - REQ-MSG-2: a send by name reaches the instance and records both; a send by instance key is unchanged + --- + duration_ms: 26.641161 + type: 'test' + ... +# Subtest: REQ-MSG-2: an instance key beats a name that equals it, as when a later instance takes the key +ok 605 - REQ-MSG-2: an instance key beats a name that equals it, as when a later instance takes the key + --- + duration_ms: 18.067083 + type: 'test' + ... +# Subtest: REQ-MSG-2: a role name beats a name that equals it, as when a later definition takes the word (sage-0590) +ok 606 - REQ-MSG-2: a role name beats a name that equals it, as when a later definition takes the word (sage-0590) + --- + duration_ms: 19.799296 + type: 'test' + ... +# Subtest: proof receives actual peer, cap traffic never invokes helper and transient cap disconnects +ok 607 - proof receives actual peer, cap traffic never invokes helper and transient cap disconnects + --- + duration_ms: 5.798121 + type: 'test' + ... +# Subtest: proof helper error and disconnect during verification never dispatch or bind +ok 608 - proof helper error and disconnect during verification never dispatch or bind + --- + duration_ms: 1.297327 + type: 'test' + ... +# Subtest: Client receives explicit proof refusal codes without dispatch, not outcome-unknown +ok 609 - Client receives explicit proof refusal codes without dispatch, not outcome-unknown + --- + duration_ms: 38.953161 + type: 'test' + ... +# Subtest: asynchronous proof calls release their transient session on success, failure and timeout +ok 610 - asynchronous proof calls release their transient session on success, failure and timeout + --- + duration_ms: 27.091022 + type: 'test' + ... +# Subtest: T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit +ok 611 - T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit + --- + duration_ms: 245.56009 + type: 'test' + ... +# Subtest: helper output and failures fail closed including unsafe gid +ok 612 - helper output and failures fail closed including unsafe gid + --- + duration_ms: 1.695402 + type: 'test' + ... +# Subtest: helper timeout, capacity and shutdown refuse without leaving children +ok 613 - helper timeout, capacity and shutdown refuse without leaving children + --- + duration_ms: 26.179811 + type: 'test' + ... +# Subtest: missing or non-regular peer helper refuses at construction before opening the bus +ok 614 - missing or non-regular peer helper refuses at construction before opening the bus + --- + duration_ms: 0.379855 + type: 'test' + ... +# Subtest: shutdown waits for killed helper close before returning +ok 615 - shutdown waits for killed helper close before returning + --- + duration_ms: 5.982503 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor +ok 616 - plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor + --- + duration_ms: 31.219158 + type: 'test' + ... +# Subtest: 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 +ok 617 - 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 + --- + duration_ms: 117.33373 + type: 'test' + ... +# Subtest: vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed +ok 618 - vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed + --- + duration_ms: 52.487505 + type: 'test' + ... +# Subtest: principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body +ok 619 - principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body + --- + duration_ms: 1.93002 + type: 'test' + ... +# Subtest: user requires its own nonce and full walk plus immediate same-tree Console parent +ok 620 - user requires its own nonce and full walk plus immediate same-tree Console parent + --- + duration_ms: 0.563249 + type: 'test' + ... +# Subtest: tester deliberately admits agent parents but rejects managed runs and another nonce +ok 621 - tester deliberately admits agent parents but rejects managed runs and another nonce + --- + duration_ms: 0.328337 + type: 'test' + ... +# Subtest: human leaf identity is reread after walking the parents +ok 622 - human leaf identity is reread after walking the parents + --- + duration_ms: 0.206987 + type: 'test' + ... +# Subtest: console requires its own wrapper, nonce and serve parent, and a configured owner from the spawn env +ok 623 - console requires its own wrapper, nonce and serve parent, and a configured owner from the spawn env + --- + duration_ms: 1.521562 + type: 'test' + ... +# Subtest: broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly +ok 624 - broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly + --- + duration_ms: 170.904689 + type: 'test' + ... +# Subtest: startup token refusal returns safe code without value or partial listening broker +ok 625 - startup token refusal returns safe code without value or partial listening broker + --- + duration_ms: 142.856395 + type: 'test' + ... +# Subtest: loaded fixture token is absent from socket replies and SQLite, including refusal evidence +ok 626 - loaded fixture token is absent from socket replies and SQLite, including refusal evidence + --- + duration_ms: 140.088235 + type: 'test' + ... +# Subtest: killed broker leaves an explicit stale lock; another process cannot silently reclaim it +ok 627 - killed broker leaves an explicit stale lock; another process cannot silently reclaim it + --- + duration_ms: 253.576032 + type: 'test' + ... +# Subtest: trusted host registers later launches; socket clients never have a registration verb +ok 628 - trusted host registers later launches; socket clients never have a registration verb + --- + duration_ms: 156.112228 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 the broker process answers the launcher's mayLaunch op with the limits' awaited decision +ok 629 - REQ-LIMIT-4 the broker process answers the launcher's mayLaunch op with the limits' awaited decision + --- + duration_ms: 133.896498 + type: 'test' + ... +# Subtest: runtime excludes declared project roots even when host supplies no repoRoots +ok 630 - runtime excludes declared project roots even when host supplies no repoRoots + --- + duration_ms: 108.056673 + type: 'test' + ... +# Subtest: a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it +ok 631 - a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it + --- + duration_ms: 139.80203 + type: 'test' + ... +# Subtest: real runtime injects the coordinator, stops its workload and mirrors stable stop events across restart +ok 632 - real runtime injects the coordinator, stops its workload and mirrors stable stop events across restart + --- + duration_ms: 171.491239 + type: 'test' + ... +# Subtest: invalid state still starts the control bus and human halt then resume repairs it +ok 633 - invalid state still starts the control bus and human halt then resume repairs it + --- + duration_ms: 65.885318 + type: 'test' + ... +# Subtest: processing halt and resume extend only the socket timeout while ordinary status retains the explicit timeout +ok 634 - processing halt and resume extend only the socket timeout while ordinary status retains the explicit timeout + --- + duration_ms: 183.263505 + type: 'test' + ... +# Subtest: a root halt aborts the active search-source signal before the normal web deadline +ok 635 - a root halt aborts the active search-source signal before the normal web deadline + --- + duration_ms: 43.883199 + type: 'test' + ... +# Subtest: processing.halt refuses agent reader and tester before any transition +ok 636 - processing.halt refuses agent reader and tester before any transition + --- + duration_ms: 22.542857 + type: 'test' + ... +# Subtest: processing.resume refuses agent reader and tester before any transition +ok 637 - processing.resume refuses agent reader and tester before any transition + --- + duration_ms: 16.327443 + type: 'test' + ... +# Subtest: human halt and clear each have one event with verified actor; launch.restore cannot clear +ok 638 - human halt and clear each have one event with verified actor; launch.restore cannot clear + --- + duration_ms: 17.516119 + type: 'test' + ... +# Subtest: all ordinary work verbs refuse before dispatch while pure reads remain available +ok 639 - all ordinary work verbs refuse before dispatch while pure reads remain available + --- + duration_ms: 30.263793 + type: 'test' + ... +# Subtest: task web authorization and bind paths refuse before external work +ok 640 - task web authorization and bind paths refuse before external work + --- + duration_ms: 15.778926 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.halt +ok 641 - recordEvent cannot forge processing.halt + --- + duration_ms: 11.181292 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.resume +ok 642 - recordEvent cannot forge processing.resume + --- + duration_ms: 11.333247 + type: 'test' + ... +# Subtest: recordEvent cannot forge processing.stop +ok 643 - recordEvent cannot forge processing.stop + --- + duration_ms: 10.661989 + type: 'test' + ... +# Subtest: recordTask poll cannot forge a processing action through its kinds filter +ok 644 - recordTask poll cannot forge a processing action through its kinds filter + --- + duration_ms: 11.112471 + type: 'test' + ... +# Subtest: recordTask self cannot forge a processing action through its kinds filter +ok 645 - recordTask self cannot forge a processing action through its kinds filter + --- + duration_ms: 10.701523 + type: 'test' + ... +# Subtest: spec read remains a read but cannot release new write work after an await +ok 646 - spec read remains a read but cannot release new write work after an await + --- + duration_ms: 14.53791 + type: 'test' + ... +# Subtest: the real socket awaits halt and resume beyond the ordinary idle deadline +ok 647 - the real socket awaits halt and resume beyond the ordinary idle deadline + --- + duration_ms: 53.242423 + type: 'test' + ... +# Subtest: a malformed processing reader never silently admits agent work +ok 648 - a malformed processing reader never silently admits agent work + --- + duration_ms: 15.80115 + type: 'test' + ... +# Subtest: halt refuses the newly landed host executor path before credentials or effects +ok 649 - halt refuses the newly landed host executor path before credentials or effects + --- + duration_ms: 14.579315 + type: 'test' + ... +# Subtest: D1: committed write with a failed receipt refuses outcome-unknown without action.allowed +ok 650 - D1: committed write with a failed receipt refuses outcome-unknown without action.allowed + --- + duration_ms: 20.576848 + type: 'test' + ... +# Subtest: D2: spec.read refuses without content if its role is released during the read +ok 651 - D2: spec.read refuses without content if its role is released during the read + --- + duration_ms: 14.475562 + type: 'test' + ... +# Subtest: D3: spec.read secret check refuses flagged content without content +ok 652 - D3: spec.read secret check refuses flagged content without content + --- + duration_ms: 13.431877 + type: 'test' + ... +# Subtest: D3: spec.read secret check refuses flagged subject without content +ok 653 - D3: spec.read secret check refuses flagged subject without content + --- + duration_ms: 13.482037 + type: 'test' + ... +# Subtest: a human lists, opens and saves; the save is one commit by the business human +ok 654 - a human lists, opens and saves; the save is one commit by the business human + --- + duration_ms: 107.867265 + type: 'test' + ... +# Subtest: an agent and a reader refuse every file verb and nothing is written +ok 655 - an agent and a reader refuse every file verb and nothing is written + --- + duration_ms: 46.981396 + type: 'test' + ... +# Subtest: a stale base refuses stale-base and writes nothing +ok 656 - a stale base refuses stale-base and writes nothing + --- + duration_ms: 68.715129 + type: 'test' + ... +# Subtest: paths outside the spec and docs refuse, as do unknown projects, missing files and odd arguments +ok 657 - paths outside the spec and docs refuse, as do unknown projects, missing files and odd arguments + --- + duration_ms: 55.957198 + type: 'test' + ... +# Subtest: without a project adapter the file verbs refuse project-not-configured +ok 658 - without a project adapter the file verbs refuse project-not-configured + --- + duration_ms: 25.999746 + type: 'test' + ... +# Subtest: on the socket a save may carry 1 MiB of text; every other request keeps the 64 KiB limit +ok 659 - on the socket a save may carry 1 MiB of text; every other request keeps the 64 KiB limit + --- + duration_ms: 229.560076 + type: 'test' + ... +# Subtest: a request that names the save verb first and another verb last is refused at 64 KiB +ok 660 - a request that names the save verb first and another verb last is refused at 64 KiB + --- + duration_ms: 59.898692 + type: 'test' + ... +# Subtest: two saves racing for one repository make one commit +ok 661 - two saves racing for one repository make one commit + --- + duration_ms: 131.192848 + type: 'test' + ... +# Subtest: Broker keeps the sandbox client import closure: only the listed imports, no lazy project import +ok 662 - Broker keeps the sandbox client import closure: only the listed imports, no lazy project import + --- + duration_ms: 2.272305 + type: 'test' + ... +# Subtest: without a trusted project adapter all three async paths refuse project-not-configured +ok 663 - without a trusted project adapter all three async paths refuse project-not-configured + --- + duration_ms: 46.04872 + type: 'test' + ... +# Subtest: real startBroker injects the project adapter for socket reads and bound-author record writes +ok 664 - real startBroker injects the project adapter for socket reads and bound-author record writes + --- + duration_ms: 191.119447 + type: 'test' + ... +# Subtest: a raise with no recorded push refuses no-push; a raise binds the latest push and shows it +ok 665 - a raise with no recorded push refuses no-push; a raise binds the latest push and shows it + --- + duration_ms: 28.578479 + type: 'test' + ... +# Subtest: happy path: the fork is the upstream repo under the agent's own user, the destination is host-built +ok 666 - happy path: the fork is the upstream repo under the agent's own user, the destination is host-built + --- + duration_ms: 24.227239 + type: 'test' + ... +# Subtest: a hard wait: no decision refuses, and a decision for another task refuses +ok 667 - a hard wait: no decision refuses, and a decision for another task refuses + --- + duration_ms: 22.905721 + type: 'test' + ... +# Subtest: r4 B4: approve while the latest push is A, push B, publish refuses decision-mismatch +ok 668 - r4 B4: approve while the latest push is A, push B, publish refuses decision-mismatch + --- + duration_ms: 45.670144 + type: 'test' + ... +# Subtest: grant and fork refusals +ok 669 - grant and fork refusals + --- + duration_ms: 39.813509 + type: 'test' + ... +# Subtest: remote-not-fork, compared without case, and remote-host-mismatch, at push +ok 670 - remote-not-fork, compared without case, and remote-host-mismatch, at push + --- + duration_ms: 82.707298 + type: 'test' + ... +# Subtest: two agents granted one project each get their own fork +ok 671 - two agents granted one project each get their own fork + --- + duration_ms: 42.318988 + type: 'test' + ... +# Subtest: the request cannot name the fork, the user or the destination +ok 672 - the request cannot name the fork, the user or the destination + --- + duration_ms: 19.513663 + type: 'test' + ... +# Subtest: one decision, one open publish: a second ticket refuses publish-busy, whatever its branch +ok 673 - one decision, one open publish: a second ticket refuses publish-busy, whatever its branch + --- + duration_ms: 46.988579 + type: 'test' + ... +# Subtest: publishRefused files the code on the task's trail and drops the ticket +ok 674 - publishRefused files the code on the task's trail and drops the ticket + --- + duration_ms: 20.635824 + type: 'test' + ... +# Subtest: git.push.remote is in neither ROUTED list and no shipped role grants it +ok 675 - git.push.remote is in neither ROUTED list and no shipped role grants it + --- + duration_ms: 0.688072 + type: 'test' + ... +# Subtest: runtime: withGitea keys from the open ticket only, and the store root is the organization dir +ok 676 - runtime: withGitea keys from the open ticket only, and the store root is the organization dir + --- + duration_ms: 96.289427 + type: 'test' + ... +# Subtest: the bus process answers the publish ops from their own lines, not launch-op-refused +ok 677 - the bus process answers the publish ops from their own lines, not launch-op-refused + --- + duration_ms: 152.579871 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 a create goes live with no restart: the new instance binds at once and the answer says restart false +ok 678 - T14 a create goes live with no restart: the new instance binds at once and the answer says restart false + --- + duration_ms: 83.176827 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 every committed verb reloads once, limits.set, routes.set, plugins.set and veto.set included, and a refused one does not +ok 679 - T14 every committed verb reloads once, limits.set, routes.set, plugins.set and veto.set included, and a refused one does not + --- + duration_ms: 87.551226 + type: 'test' + ... +# Subtest: T14 a definition change on a running instance refuses instance-running; a vars change still goes live +ok 680 - T14 a definition change on a running instance refuses instance-running; a vars change still goes live + --- + duration_ms: 85.841444 + type: 'test' + ... +# Subtest: T14 a file whose credential references differ from the boot copy is not reloaded and the write answers restart true +ok 681 - T14 a file whose credential references differ from the boot copy is not reloaded and the write answers restart true + --- + duration_ms: 60.845015 + type: 'test' + ... +# Subtest: T14 a date-only change to a credential reference still reloads: row 199 issue rewrites the date outside the reload +ok 682 - T14 a date-only change to a credential reference still reloads: row 199 issue rewrites the date outside the reload + --- + duration_ms: 48.643731 + type: 'test' + ... +# Subtest: T19 a credentialed create answers restart true; issue works only after a restart, and a later vars change goes live +ok 683 - T19 a credentialed create answers restart true; issue works only after a restart, and a later vars change goes live + --- + duration_ms: 95.832852 + type: 'test' + ... +# Subtest: T14 after a refused reload veto.set, instance.hire and instance.fire answer restart true, and a fire of a name kept since refuses before step A +ok 684 - T14 after a refused reload veto.set, instance.hire and instance.fire answer restart true, and a fire of a name kept since refuses before step A + --- + duration_ms: 101.51919 + type: 'test' + ... +# Subtest: T14 a file whose project root differs from the boot copy is not reloaded, because the Credentials store protects the boot roots +ok 685 - T14 a file whose project root differs from the boot copy is not reloaded, because the Credentials store protects the boot roots + --- + duration_ms: 46.103976 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: T14 a file whose library mapping differs from the boot copy is not reloaded, because the mirror is ensured at start +ok 686 - T14 a file whose library mapping differs from the boot copy is not reloaded, because the mirror is ensured at start + --- + duration_ms: 194.264727 + type: 'test' + ... +# Subtest: T14 reloadBusiness refuses an unknown business, a changed human and a document the boot check refuses +ok 687 - T14 reloadBusiness refuses an unknown business, a changed human and a document the boot check refuses + --- + duration_ms: 10.563363 + type: 'test' + ... +# Subtest: a reply is listed for human and reader sessions, and its delivery rows are unchanged +ok 688 - a reply is listed for human and reader sessions, and its delivery rows are unchanged + --- + duration_ms: 37.07065 + type: 'test' + ... +# Subtest: the reply still reaches the human message.receive (mosaic talk) after the Console showed it +ok 689 - the reply still reaches the human message.receive (mosaic talk) after the Console showed it + --- + duration_ms: 20.085963 + type: 'test' + ... +# Subtest: a message with no reply gives an empty list +ok 690 - a message with no reply gives an empty list + --- + duration_ms: 16.131811 + type: 'test' + ... +# Subtest: replies come oldest first and stop at REPLIES +ok 691 - replies come oldest first and stop at REPLIES + --- + duration_ms: 76.299988 + type: 'test' + ... +# Subtest: an id that names no message in the business refuses message-not-found, and the refusal is recorded +ok 692 - an id that names no message in the business refuses message-not-found, and the refusal is recorded + --- + duration_ms: 28.014181 + type: 'test' + ... +# Subtest: strict arguments; a role session gets human-required +ok 693 - strict arguments; a role session gets human-required + --- + duration_ms: 33.046613 + type: 'test' + ... +# Subtest: views passes replies through as one call with the id +ok 694 - views passes replies through as one call with the id + --- + duration_ms: 0.270426 + type: 'test' + ... +# Subtest: requirements returns the committed list to a holding role session, and no one else +ok 695 - requirements returns the committed list to a holding role session, and no one else + --- + duration_ms: 34.169394 + type: 'test' + ... +# Subtest: the PM's prd.approve with no task, when no id fits, reaches the human's Inbox +ok 696 - the PM's prd.approve with no task, when no id fits, reaches the human's Inbox + --- + duration_ms: 21.855336 + type: 'test' + ... +# Subtest: the PM's non-blocking role.revoke with no task reaches the human's Inbox +ok 697 - the PM's non-blocking role.revoke with no task reaches the human's Inbox + --- + duration_ms: 19.29264 + type: 'test' + ... +# Subtest: a push is recorded as the action.allowed for git.push.working on the task, and only the host records one +ok 698 - a push is recorded as the action.allowed for git.push.working on the task, and only the host records one + --- + duration_ms: 33.703364 + type: 'test' + ... +# Subtest: review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST +ok 699 - review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST + --- + duration_ms: 24.313702 + type: 'test' + ... +# Subtest: review.request says which run holds the reviewer role, or null, and a null request waits for a claim +ok 700 - review.request says which run holds the reviewer role, or null, and a null request waits for a claim + --- + duration_ms: 25.886736 + type: 'test' + ... +# Subtest: review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action +ok 701 - review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action + --- + duration_ms: 34.225197 + type: 'test' + ... +# Subtest: reviewFetch answers only the addressed reviewer, for the request it cites +ok 702 - reviewFetch answers only the addressed reviewer, for the request it cites + --- + duration_ms: 24.42539 + type: 'test' + ... +# Subtest: review.verdict answers one request once, to the role that asked +ok 703 - review.verdict answers one request once, to the role that asked + --- + duration_ms: 30.367535 + type: 'test' + ... +# Subtest: task.close on a pushed task needs an approve verdict for the latest push +ok 704 - task.close on a pushed task needs an approve verdict for the latest push + --- + duration_ms: 46.579391 + type: 'test' + ... +# Subtest: a refusal the host decided is filed on the task it names, and only a task ref counts +ok 705 - a refusal the host decided is filed on the task it names, and only a task ref counts + --- + duration_ms: 22.208783 + type: 'test' + ... +# Subtest: row 306 T1: a run the timer sweep ended answers thread-revoked on every claim-needing call, logged, and its claim still refuses run-revoked +ok 706 - row 306 T1: a run the timer sweep ended answers thread-revoked on every claim-needing call, logged, and its claim still refuses run-revoked + --- + duration_ms: 37.632142 + type: 'test' + ... +# Subtest: row 306 T1: a user's request and access.reload end the run the same way, and it answers thread-revoked +ok 707 - row 306 T1: a user's request and access.reload end the run the same way, and it answers thread-revoked + --- + duration_ms: 52.370478 + type: 'test' + ... +# Subtest: row 306 T2: after the sweep, a run the human stopped and a run the limit stop ended still answer not-holder +ok 708 - row 306 T2: after the sweep, a run the human stopped and a run the limit stop ended still answer not-holder + --- + duration_ms: 32.088197 + type: 'test' + ... +# Subtest: C2-10c room.read carries exactly the thread check and current file last +ok 709 - C2-10c room.read carries exactly the thread check and current file last + --- + duration_ms: 64.25892 + type: 'test' + ... +# Subtest: C2-10c check hydration preserves unchecked rows and one broadcast with two addressees +ok 710 - C2-10c check hydration preserves unchecked rows and one broadcast with two addressees + --- + duration_ms: 14.358185 + type: 'test' + ... +# Subtest: room.open sorts all threaded instances, creates defaults, and reuses caller-owned threads +ok 711 - room.open sorts all threaded instances, creates defaults, and reuses caller-owned threads + --- + duration_ms: 23.313517 + type: 'test' + ... +# Subtest: room.open preflights instance collisions atomically +ok 712 - room.open preflights instance collisions atomically + --- + duration_ms: 15.384655 + type: 'test' + ... +# Subtest: room.open preflights owner collisions atomically +ok 713 - room.open preflights owner collisions atomically + --- + duration_ms: 14.560382 + type: 'test' + ... +# Subtest: room verbs require the human, and none is a tester verb +ok 714 - room verbs require the human, and none is a tester verb + --- + duration_ms: 19.752589 + type: 'test' + ... +# Subtest: room verbs refuse missing projects and zero member businesses +ok 715 - room verbs refuse missing projects and zero member businesses + --- + duration_ms: 32.385252 + type: 'test' + ... +# Subtest: send/read refuse a missing canonical member without effects +ok 716 - send/read refuse a missing canonical member without effects + --- + duration_ms: 16.082983 + type: 'test' + ... +# Subtest: send/read refuse a foreign-owner canonical member without effects +ok 717 - send/read refuse a foreign-owner canonical member without effects + --- + duration_ms: 16.827309 + type: 'test' + ... +# Subtest: send/read refuse a wrong-instance canonical member without effects +ok 718 - send/read refuse a wrong-instance canonical member without effects + --- + duration_ms: 17.475282 + type: 'test' + ... +# Subtest: room.send targets a key, broadcasts without tags, and preserves original text and ordinary route/input rows +ok 719 - room.send targets a key, broadcasts without tags, and preserves original text and ordinary route/input rows + --- + duration_ms: 19.577598 + type: 'test' + ... +# Subtest: current display names and repeated tags resolve once; a replaced display name is unknown +ok 720 - current display names and repeated tags resolve once; a replaced display name is unknown + --- + duration_ms: 19.106644 + type: 'test' + ... +# Subtest: a legacy name colliding with another member key is ambiguous; its own key resolves once +ok 721 - a legacy name colliding with another member key is ambiguous; its own key resolves once + --- + duration_ms: 19.465815 + type: 'test' + ... +# Subtest: unknown or non-member addressees and tags-only bodies leave no message effects +ok 722 - unknown or non-member addressees and tags-only bodies leave no message effects + --- + duration_ms: 22.66161 + type: 'test' + ... +# Subtest: messaging denial on the last target rolls back the entire broadcast; allowed subset still works +ok 723 - messaging denial on the last target rolls back the entire broadcast; allowed subset still works + --- + duration_ms: 17.129149 + type: 'test' + ... +# Subtest: a clearing last member fences the whole send; another active target still accepts +ok 724 - a clearing last member fences the whole send; another active target still accepts + --- + duration_ms: 21.23987 + type: 'test' + ... +# Subtest: room.read groups one send, pages by the last grouped id, and rejects foreign or absent cursors +ok 725 - room.read groups one send, pages by the last grouped id, and rejects foreign or absent cursors + --- + duration_ms: 31.869128 + type: 'test' + ... +# Subtest: room.read keeps identical sends at the same timestamp separate and includes every session +ok 726 - room.read keeps identical sends at the same timestamp separate and includes every session + --- + duration_ms: 30.401554 + type: 'test' + ... +# Subtest: room.read defaults and caps the number of merged entries, not recipient rows +ok 727 - room.read defaults and caps the number of merged entries, not recipient rows + --- + duration_ms: 474.858392 + type: 'test' + ... +# Subtest: room.read includes an agent reply with its thread and instance without merging it with human rows +ok 728 - room.read includes an agent reply with its thread and instance without merging it with human rows + --- + duration_ms: 20.966746 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 65: routes and routes.set refuse every non-human session, the chief of staff included, the tester may read and set, and each passes the verified actor +ok 729 - row 65: routes and routes.set refuse every non-human session, the chief of staff included, the tester may read and set, and each passes the verified actor + --- + duration_ms: 32.088478 + type: 'test' + ... +# Subtest: row 65: a new launch binds only on a switched-on harness with a module name, and a run an earlier broker bound binds again after its harness is switched off +ok 730 - row 65: a new launch binds only on a switched-on harness with a module name, and a run an earlier broker bound binds again after its harness is switched off + --- + duration_ms: 23.179088 + type: 'test' + ... +# Subtest: row 65 runtime: harnessLevels answers each module in the tree, and null for a name with no module +ok 731 - row 65 runtime: harnessLevels answers each module in the tree, and null for a name with no module + --- + duration_ms: 40.64105 + type: 'test' + ... +# Subtest: row 65 runtime: routes and routes.set reach the organization file with the human as actor, a new bind reads plugins.harness, and each refusal keeps the bytes and logs nothing +ok 732 - row 65 runtime: routes and routes.set reach the organization file with the human as actor, a new bind reads plugins.harness, and each refusal keeps the bytes and logs nothing + --- + duration_ms: 90.062862 + type: 'test' + ... +# Subtest: v3b prototype refusals, views and append-only mutations +ok 733 - v3b prototype refusals, views and append-only mutations + --- + duration_ms: 86.886176 + type: 'test' + ... +# Subtest: T4 D7: a clear of a held default session fences it, drains at the next receive, retires at the exit proof and moves the default +ok 734 - T4 D7: a clear of a held default session fences it, drains at the next receive, retires at the exit proof and moves the default + --- + duration_ms: 42.034413 + type: 'test' + ... +# Subtest: T4 D7: an unheld session drains at accept, its proof is run null, and a non-default clear leaves the default +ok 735 - T4 D7: an unheld session drains at accept, its proof is run null, and a non-default clear leaves the default + --- + duration_ms: 19.240459 + type: 'test' + ... +# Subtest: T4 D7: a run that ends before its next receive drains at its end, with its generation +ok 736 - T4 D7: a run that ends before its next receive drains at its end, with its generation + --- + duration_ms: 18.242668 + type: 'test' + ... +# Subtest: T4 D7: a run whose turn is running (delivered, unread) stays clearing; uncertain is recorded once and nothing more +ok 737 - T4 D7: a run whose turn is running (delivered, unread) stays clearing; uncertain is recorded once and nothing more + --- + duration_ms: 26.446496 + type: 'test' + ... +# Subtest: T4 D7 B1: undelivered inputs are cancelled with receipts at accept, never delivered to the successor, and a routed reply is cancelled at arrival +ok 738 - T4 D7 B1: undelivered inputs are cancelled with receipts at accept, never delivered to the successor, and a routed reply is cancelled at arrival + --- + duration_ms: 30.336095 + type: 'test' + ... +# Subtest: T4 D7: repeat, conflict, a second op, a stale revision, confirm and a halt +ok 739 - T4 D7: repeat, conflict, a second op, a stale revision, confirm and a halt + --- + duration_ms: 28.155122 + type: 'test' + ... +# Subtest: T4 Q4: the successor takes -N, the next N free, and a bound name stays taken +ok 740 - T4 Q4: the successor takes -N, the next N free, and a bound name stays taken + --- + duration_ms: 21.654175 + type: 'test' + ... +# Subtest: T4 D8: the successor start is held, refused or started, each report on its own counter +ok 741 - T4 D8: the successor start is held, refused or started, each report on its own counter + --- + duration_ms: 21.286109 + type: 'test' + ... +# Subtest: T4 D7 N4: a halt at retirement waits and writes nothing; retirement goes once processing resumes +ok 742 - T4 D7 N4: a halt at retirement waits and writes nothing; retirement goes once processing resumes + --- + duration_ms: 17.531835 + type: 'test' + ... +# Subtest: T4 sage-2828: a cancel before retirement makes the session active again, keeps the claim and the cancelled messages, and never makes the successor +ok 743 - T4 sage-2828: a cancel before retirement makes the session active again, keeps the claim and the cancelled messages, and never makes the successor + --- + duration_ms: 29.555212 + type: 'test' + ... +# Subtest: T4 sage-2828 sage-2830: a cancel after retirement ends the startup only, and a later thread-only send makes the successor pending as new input +ok 744 - T4 sage-2828 sage-2830: a cancel after retirement ends the startup only, and a later thread-only send makes the successor pending as new input + --- + duration_ms: 21.624268 + type: 'test' + ... +# Subtest: T4 N4: a user's thread whose grant is gone by retirement ends the clear failed, writes no successor, and leaves the session as it was +ok 745 - T4 N4: a user's thread whose grant is gone by retirement ends the clear failed, writes no successor, and leaves the session as it was + --- + duration_ms: 20.487869 + type: 'test' + ... +# Subtest: T4 N4: a user's thread whose grant is live at retirement retires the session and makes its successor +ok 746 - T4 N4: a user's thread whose grant is live at retirement retires the session and makes its successor + --- + duration_ms: 21.955631 + type: 'test' + ... +# Subtest: T4 sage-2828: a cancel after the successor started refuses session-clear-complete +ok 747 - T4 sage-2828: a cancel after the successor started refuses session-clear-complete + --- + duration_ms: 19.782013 + type: 'test' + ... +# Subtest: T4 B2: a run bound to a clearing session refuses its claim, and claims again once the clear is cancelled +ok 748 - T4 B2: a run bound to a clearing session refuses its claim, and claims again once the clear is cancelled + --- + duration_ms: 21.823956 + type: 'test' + ... +# Subtest: T4 mos-1325: the tester clears its own thread; its clear, cancel and operation on a human-owned thread refuse thread-not-owned and write nothing +ok 749 - T4 mos-1325: the tester clears its own thread; its clear, cancel and operation on a human-owned thread refuse thread-not-owned and write nothing + --- + duration_ms: 27.730781 + type: 'test' + ... +# Subtest: T4 schema: session_ops and message_cancels are append-only, and a second open clear of a session is refused below the broker +ok 750 - T4 schema: session_ops and message_cancels are append-only, and a second open clear of a session is refused below the broker + --- + duration_ms: 21.376795 + type: 'test' + ... +# Subtest: T4 schema: a 3m store migrates to 3n, session_ops and message_cancels are new and empty, and every other row stays as it was +ok 751 - T4 schema: a 3m store migrates to 3n, session_ops and message_cancels are new and empty, and every other row stays as it was + --- + duration_ms: 93.584469 + type: 'test' + ... +# Subtest: T4 schema: the 3m engine refuses a 3n store, migrating or not, and leaves it as it was +ok 752 - T4 schema: the 3m engine refuses a 3n store, migrating or not, and leaves it as it was + --- + duration_ms: 168.186776 + type: 'test' + ... +# Subtest: session.list rows carry the reader count for each session, with its store identity +ok 753 - session.list rows carry the reader count for each session, with its store identity + --- + duration_ms: 19.778808 + type: 'test' + ... +# Subtest: a legacy session is asked for with legacy true +ok 754 - a legacy session is asked for with legacy true + --- + duration_ms: 14.669614 + type: 'test' + ... +# Subtest: without a reader the count is unknown, never 0; a reader that throws is store-unreadable +ok 755 - without a reader the count is unknown, never 0; a reader that throws is store-unreadable + --- + duration_ms: 25.475833 + type: 'test' + ... +# Subtest: compactions must be a function +ok 756 - compactions must be a function + --- + duration_ms: 8.652113 + type: 'test' + ... +# Subtest: T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies +ok 757 - T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies + --- + duration_ms: 47.418883 + type: 'test' + ... +# Subtest: T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder +ok 758 - T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder + --- + duration_ms: 39.48068 + type: 'test' + ... +# Subtest: T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing +ok 759 - T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing + --- + duration_ms: 47.819079 + type: 'test' + ... +# Subtest: session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads +ok 760 - session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads + --- + duration_ms: 31.278136 + type: 'test' + ... +# Subtest: the 3l triggers keep sessions in their thread and session ids apart from thread ids +ok 761 - the 3l triggers keep sessions in their thread and session ids apart from thread ids + --- + duration_ms: 64.898096 + type: 'test' + ... +# Subtest: T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs +ok 762 - T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs + --- + duration_ms: 98.588296 + type: 'test' + ... +# Subtest: T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was +ok 763 - T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was + --- + duration_ms: 147.519575 + type: 'test' + ... +# Subtest: gated approval authorizes once, survives store reopen, and fresh approval works +ok 764 - gated approval authorizes once, survives store reopen, and fresh approval works + --- + duration_ms: 30.650407 + type: 'test' + ... +# Subtest: another run of the same instance consumes an approval once; a failed check leaves it usable +ok 765 - another run of the same instance consumes an approval once; a failed check leaves it usable + --- + duration_ms: 20.062275 + type: 'test' + ... +# Subtest: two scheduled callers have exactly one grant and one consumed refusal +ok 766 - two scheduled callers have exactly one grant and one consumed refusal + --- + duration_ms: 14.941929 + type: 'test' + ... +# Subtest: failed commit rolls consumption back; cross-role consumes and within-role stays reusable +ok 767 - failed commit rolls consumption back; cross-role consumes and within-role stays reusable + --- + duration_ms: 27.989222 + type: 'test' + ... +# Subtest: class drift gated to cross-role refuses before consumption +ok 768 - class drift gated to cross-role refuses before consumption + --- + duration_ms: 20.406146 + type: 'test' + ... +# Subtest: class drift cross-role to gated refuses before consumption +ok 769 - class drift cross-role to gated refuses before consumption + --- + duration_ms: 21.732807 + type: 'test' + ... +# Subtest: class drift gated to within-role refuses before consumption +ok 770 - class drift gated to within-role refuses before consumption + --- + duration_ms: 21.810831 + type: 'test' + ... +# Subtest: class drift cross-role to within-role refuses before consumption +ok 771 - class drift cross-role to within-role refuses before consumption + --- + duration_ms: 22.007166 + type: 'test' + ... +# Subtest: class drift within-role to gated refuses before consumption +ok 772 - class drift within-role to gated refuses before consumption + --- + duration_ms: 19.22907 + type: 'test' + ... +# Subtest: class drift within-role to cross-role refuses before consumption +ok 773 - class drift within-role to cross-role refuses before consumption + --- + duration_ms: 19.388643 + type: 'test' + ... +# Subtest: message.send consumes approval and prevents a later send or authorize +ok 774 - message.send consumes approval and prevents a later send or authorize + --- + duration_ms: 22.306165 + type: 'test' + ... +# Subtest: role.revoke consumes approval and prevents a later revoke or authorize +ok 775 - role.revoke consumes approval and prevents a later revoke or authorize + --- + duration_ms: 25.096563 + type: 'test' + ... +# Subtest: 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations +ok 776 - 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations + --- + duration_ms: 93.443858 + type: 'test' + ... +# Subtest: a human spec save sends one notice to each pm and cto, naming the commit, and each commit sends its own +ok 777 - a human spec save sends one notice to each pm and cto, naming the commit, and each commit sends its own + --- + duration_ms: 120.231577 + type: 'test' + ... +# Subtest: no notice for a docs save, an agent record commit, a git commit outside the Console, or a refused save +ok 778 - no notice for a docs save, an agent record commit, a git commit outside the Console, or a refused save + --- + duration_ms: 139.481148 + type: 'test' + ... +# Subtest: a notice to a role no run holds waits for a claim, and launches nobody and tells nobody +ok 779 - a notice to a role no run holds waits for a claim, and launches nobody and tells nobody + --- + duration_ms: 71.038568 + type: 'test' + ... +# Subtest: a business without a pm or a cto saves the spec and sends nothing +ok 780 - a business without a pm or a cto saves the spec and sends nothing + --- + duration_ms: 59.566056 + type: 'test' + ... +# Subtest: a notice that cannot be stored answers outcome-unknown, and the commit stands +ok 781 - a notice that cannot be stored answers outcome-unknown, and the commit stands + --- + duration_ms: 67.964104 + type: 'test' + ... +# Subtest: a BLOCK reaches the chief of staff, the chief relays it to the assistant in the user's thread, and the commit stands +ok 782 - a BLOCK reaches the chief of staff, the chief relays it to the assistant in the user's thread, and the commit stands + --- + duration_ms: 81.072339 + type: 'test' + ... +# Subtest: with no thread a BLOCK still reaches the chief of staff, and the relay to the assistant is refused +ok 783 - with no thread a BLOCK still reaches the chief of staff, and the relay to the assistant is refused + --- + duration_ms: 70.218188 + type: 'test' + ... +# Subtest: within the notice's project the relay lands in the user's most recently opened thread +ok 784 - within the notice's project the relay lands in the user's most recently opened thread + --- + duration_ms: 75.586557 + type: 'test' + ... +# Subtest: a more recently opened thread in another project does not take the relay +ok 785 - a more recently opened thread in another project does not take the relay + --- + duration_ms: 73.712295 + type: 'test' + ... +# Subtest: a BLOCK is refused from anyone but a pm or cto, to anyone but the chief of staff, and outside a reply to its own notice +ok 786 - a BLOCK is refused from anyone but a pm or cto, to anyone but the chief of staff, and outside a reply to its own notice + --- + duration_ms: 80.687063 + type: 'test' + ... +# Subtest: a role cannot forge a spec notice: its text opens neither a BLOCK nor the assistant's thread +ok 787 - a role cannot forge a spec notice: its text opens neither a BLOCK nor the assistant's thread + --- + duration_ms: 72.048113 + type: 'test' + ... +# Subtest: the bus receives nothing: a reply to a notice addressed to _bus is refused +ok 788 - the bus receives nothing: a reply to a notice addressed to _bus is refused + --- + duration_ms: 80.673018 + type: 'test' + ... +# Subtest: real socket awaits spec reads, record writes and cited raises; other requests still return normally +ok 789 - real socket awaits spec reads, record writes and cited raises; other requests still return normally + --- + duration_ms: 112.211165 + type: 'test' + ... +# Subtest: real socket preserves asynchronous refusal codes and disconnects its transient proof +ok 790 - real socket preserves asynchronous refusal codes and disconnects its transient proof + --- + duration_ms: 65.18993 + type: 'test' + ... +# Subtest: two real socket writes to one repository yield one commit and one project-busy refusal +ok 791 - two real socket writes to one repository yield one commit and one project-busy refusal + --- + duration_ms: 63.158542 + type: 'test' + ... +# Subtest: client disconnect during await tolerates late reply +ok 792 - client disconnect during await tolerates late reply + --- + duration_ms: 59.716908 + type: 'test' + ... +# Subtest: client disconnect during await tolerates late refusal +ok 793 - client disconnect during await tolerates late refusal + --- + duration_ms: 46.31777 + type: 'test' + ... +# Subtest: N-a: slow admitted record.write returns its committed result after the idle deadline +ok 794 - N-a: slow admitted record.write returns its committed result after the idle deadline + --- + duration_ms: 216.715296 + type: 'test' + ... +# Subtest: current citation is recorded; docs commits do not stale it and a new spec never reopens settlement +ok 795 - current citation is recorded; docs commits do not stale it and a new spec never reopens settlement + --- + duration_ms: 99.561693 + type: 'test' + ... +# Subtest: stale, unconfirmed, missing and partial spec citations refuse without inserting a decision +ok 796 - stale, unconfirmed, missing and partial spec citations refuse without inserting a decision + --- + duration_ms: 97.39063 + type: 'test' + ... +# Subtest: uncited raises retain their synchronous path and spec read is available to any held role in its business +ok 797 - uncited raises retain their synchronous path and spec read is available to any held role in its business + --- + duration_ms: 46.991425 + type: 'test' + ... +# Subtest: record writes bind the session author, require authority and refuse spec and impersonation paths +ok 798 - record writes bind the session author, require authority and refuse spec and impersonation paths + --- + duration_ms: 52.331073 + type: 'test' + ... +# Subtest: REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it +ok 799 - REQ-COS-1: the pm asks the chief of staff for roles and counts; the chief receives a STAFF-REQUEST and answers it + --- + duration_ms: 31.295589 + type: 'test' + ... +# Subtest: REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing +ok 800 - REQ-COS-1: only the pm can send a staff request; every other session is refused and the chief of staff hears nothing + --- + duration_ms: 29.674913 + type: 'test' + ... +# Subtest: REQ-COS-1: a pm without message.send is refused like any other gated action +ok 801 - REQ-COS-1: a pm without message.send is refused like any other gated action + --- + duration_ms: 14.424075 + type: 'test' + ... +# Subtest: REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff +ok 802 - REQ-COS-1: the request goes to the business launcher, and only when that is a chief of staff + --- + duration_ms: 37.953984 + type: 'test' + ... +# Subtest: 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 +ok 803 - 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 + --- + duration_ms: 36.111035 + type: 'test' + ... +# Subtest: 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 +ok 804 - 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 + --- + duration_ms: 33.175765 + type: 'test' + ... +# Subtest: REQ-COS-1: a refused staff request leaves no staff.request action.allowed event +ok 805 - REQ-COS-1: a refused staff request leaves no staff.request action.allowed event + --- + duration_ms: 19.242909 + type: 'test' + ... +# Subtest: REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient +ok 806 - REQ-ASSIST-2: the role definitions' messaging lists hold for a staff request, sender and recipient + --- + duration_ms: 54.408204 + type: 'test' + ... +# Subtest: a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted +ok 807 - a staff request names a task, 1 to 10 distinct roles and counts of 1 to 20; nothing else is accepted + --- + duration_ms: 37.294063 + type: 'test' + ... +# Subtest: REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before +ok 808 - REQ-COS-1: a staff request grants nothing: the pm still can't launch and the chief of staff launches as before + --- + duration_ms: 20.409833 + type: 'test' + ... +# Subtest: a business that never switched launches reads allowed with no time and no event +ok 809 - a business that never switched launches reads allowed with no time and no event + --- + duration_ms: 19.230268 + type: 'test' + ... +# Subtest: launches revoked and then restored read allowed, with the restore time and event id +ok 810 - launches revoked and then restored read allowed, with the restore time and event id + --- + duration_ms: 15.015862 + type: 'test' + ... +# Subtest: a task closed on the tracker leaves the open list, and total counts the open ones +ok 811 - a task closed on the tracker leaves the open list, and total counts the open ones + --- + duration_ms: 14.629683 + type: 'test' + ... +# Subtest: a tombstone is not open +ok 812 - a tombstone is not open + --- + duration_ms: 12.777473 + type: 'test' + ... +# Subtest: the open list stops at the cap and says so; total still counts every open task +ok 813 - the open list stops at the cap and says so; total still counts every open task + --- + duration_ms: 15.731084 + type: 'test' + ... +# Subtest: a role and a reader session read state; arguments, and an unbound cap, refuse +ok 814 - a role and a reader session read state; arguments, and an unbound cap, refuse + --- + duration_ms: 13.968109 + type: 'test' + ... +# Subtest: a human session reads the same state, with the same cap +ok 815 - a human session reads the same state, with the same cap + --- + duration_ms: 15.801145 + type: 'test' + ... +# Subtest: reading state writes nothing: every table keeps its row count +ok 816 - reading state writes nothing: every table keeps its row count + --- + duration_ms: 15.797167 + type: 'test' + ... +# Subtest: creates private WAL store and excludes a second writer until explicit close +ok 817 - creates private WAL store and excludes a second writer until explicit close + --- + duration_ms: 12.319696 + type: 'test' + ... +# Subtest: rollback is atomic and schema metadata is checked against trusted DDL, not just itself +ok 818 - rollback is atomic and schema metadata is checked against trusted DDL, not just itself + --- + duration_ms: 12.750579 + type: 'test' + ... +# Subtest: existing empty database and symlink runtime directory refuse, never initialize over damage +ok 819 - existing empty database and symlink runtime directory refuse, never initialize over damage + --- + duration_ms: 12.875142 + type: 'test' + ... +# Subtest: crash during a transaction recovers no partial event after explicit fixture-only lock removal +ok 820 - crash during a transaction recovers no partial event after explicit fixture-only lock removal + --- + duration_ms: 64.716007 + type: 'test' + ... +# Subtest: writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers +ok 821 - writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers + --- + duration_ms: 9.865595 + type: 'test' + ... +# Subtest: async transactions refuse before invoking their function +ok 822 - async transactions refuse before invoking their function + --- + duration_ms: 7.885608 + type: 'test' + ... +# Subtest: usage_records refuses non-canonical timestamps atomically +ok 823 - usage_records refuses non-canonical timestamps atomically + --- + duration_ms: 8.369434 + type: 'test' + ... +# Subtest: the session default fits under the reply cap and pages to the end with next +ok 824 - the session default fits under the reply cap and pages to the end with next + --- + duration_ms: 125.499195 + type: 'test' + ... +# Subtest: the short form: no description, assignees by role, every listed key +ok 825 - the short form: no description, assignees by role, every listed key + --- + duration_ms: 74.959266 + type: 'test' + ... +# Subtest: each filter, alone and together, and total counts every match +ok 826 - each filter, alone and together, and total counts every match + --- + duration_ms: 161.411301 + type: 'test' + ... +# Subtest: task_ref reads one task in full, as the whole board has it +ok 827 - task_ref reads one task in full, as the whole board has it + --- + duration_ms: 96.156621 + type: 'test' + ... +# Subtest: no arguments is the read the Console and mosaic make, unchanged +ok 828 - no arguments is the read the Console and mosaic make, unchanged + --- + duration_ms: 143.971766 + type: 'test' + ... +# Subtest: an unknown argument or a bad value refuses invalid-request +ok 829 - an unknown argument or a bad value refuses invalid-request + --- + duration_ms: 312.36179 + type: 'test' + ... +# Subtest: tasks rows carry priority and requirement for every session that reads tasks +ok 830 - tasks rows carry priority and requirement for every session that reads tasks + --- + duration_ms: 36.038195 + type: 'test' + ... +# Subtest: the read model rebuilds from the ledger: a reopened bus and each trail give the same values +ok 831 - the read model rebuilds from the ledger: a reopened bus and each trail give the same values + --- + duration_ms: 39.663505 + type: 'test' + ... +# Subtest: an empty business and one with snapshots but no task.created read cleanly +ok 832 - an empty business and one with snapshots but no task.created read cleanly + --- + duration_ms: 12.43722 + type: 'test' + ... +# Subtest: recordTask keeps sync reads and a role write apart +ok 833 - recordTask keeps sync reads and a role write apart + --- + duration_ms: 27.553493 + type: 'test' + ... +# Subtest: read_at must be one canonical UTC format, so the projection compares strings safely +ok 834 - read_at must be one canonical UTC format, so the projection compares strings safely + --- + duration_ms: 10.655865 + type: 'test' + ... +# Subtest: a bad entry refuses the whole record +ok 835 - a bad entry refuses the whole record + --- + duration_ms: 10.788998 + type: 'test' + ... +# Subtest: taskView reads the projection for one business +ok 836 - taskView reads the projection for one business + --- + duration_ms: 13.603085 + type: 'test' + ... +# Subtest: requestTask hands only a holder and a task verb to the handler, and records refusals +ok 837 - requestTask hands only a holder and a task verb to the handler, and records refusals + --- + duration_ms: 23.656154 + type: 'test' + ... +# Subtest: the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous +ok 838 - the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous + --- + duration_ms: 300.989456 + type: 'test' + ... +# Subtest: without an adapter the server refuses every task verb +ok 839 - without an adapter the server refuses every task verb + --- + duration_ms: 42.172436 + type: 'test' + ... +# Subtest: the runtime refuses an invalid adapter and closes a valid one +ok 840 - the runtime refuses an invalid adapter and closes a valid one + --- + duration_ms: 52.364387 + type: 'test' + ... +# Subtest: the process loads the S3 adapter from plain-data trackers +ok 841 - the process loads the S3 adapter from plain-data trackers + --- + duration_ms: 260.045688 + type: 'test' + ... +# Subtest: row 177 T1: a tester thread is owned by tester, and neither side reaches or lists the other +ok 842 - row 177 T1: a tester thread is owned by tester, and neither side reaches or lists the other + --- + duration_ms: 29.495896 + type: 'test' + ... +# Subtest: row 177 T2: the tester thread.send is from tester-cli with no human.input; its open is by tester +ok 843 - row 177 T2: the tester thread.send is from tester-cli with no human.input; its open is by tester + --- + duration_ms: 17.454135 + type: 'test' + ... +# Subtest: row 177 T3: the lists read the tester as the human in its own thread, and nowhere else +ok 844 - row 177 T3: the lists read the tester as the human in its own thread, and nowhere else + --- + duration_ms: 15.76682 + type: 'test' + ... +# Subtest: row 177 T3: an assistant that would not hear the human refuses the tester too +ok 845 - row 177 T3: an assistant that would not hear the human refuses the tester too + --- + duration_ms: 15.473332 + type: 'test' + ... +# Subtest: row 177 T4: the tester thread run answers the tester, never the human +ok 846 - row 177 T4: the tester thread run answers the tester, never the human + --- + duration_ms: 29.391823 + type: 'test' + ... +# Subtest: row 177 T5: each stop revokes only its own threads, recorded by its own actor +ok 847 - row 177 T5: each stop revokes only its own threads, recorded by its own actor + --- + duration_ms: 21.164987 + type: 'test' + ... +# Subtest: row 177 T5: the human stop never ends a tester run +ok 848 - row 177 T5: the human stop never ends a tester run + --- + duration_ms: 16.502943 + type: 'test' + ... +# Subtest: row 177 T6: a business whose human is tester refuses invalid-business +ok 849 - row 177 T6: a business whose human is tester refuses invalid-business + --- + duration_ms: 10.325911 + type: 'test' + ... +# Subtest: row 177 T7: the human trail shows a tester thread message as the tester +ok 850 - row 177 T7: the human trail shows a tester thread message as the tester + --- + duration_ms: 19.803804 + type: 'test' + ... +# Subtest: row 177 T8: a tester-thread run never raises a decision to the human; a human-thread run still does +ok 851 - row 177 T8: a tester-thread run never raises a decision to the human; a human-thread run still does + --- + duration_ms: 20.036099 + type: 'test' + ... +# Subtest: row 177 T8: a tester-thread raise routed to the arbiter stays allowed +ok 852 - row 177 T8: a tester-thread raise routed to the arbiter stays allowed + --- + duration_ms: 16.625049 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply into the human's thread refuses thread-not-owned and stores nothing +ok 853 - row 182 T9: a tester reply into the human's thread refuses thread-not-owned and stores nothing + --- + duration_ms: 19.588347 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply into its own thread lands there +ok 854 - row 182 T9: a tester reply into its own thread lands there + --- + duration_ms: 20.659479 + type: 'test' + ... +# Subtest: row 182 T9: the chief's reply up a chain into a tester's thread lands there +ok 855 - row 182 T9: the chief's reply up a chain into a tester's thread lands there + --- + duration_ms: 27.087281 + type: 'test' + ... +# Subtest: row 182 T9: a tester reply to a spec notice refuses thread-not-owned; the chief's relay still lands +ok 856 - row 182 T9: a tester reply to a spec notice refuses thread-not-owned; the chief's relay still lands + --- + duration_ms: 23.031729 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# organization: {"event":"reload-needs-restart","business":"demo"} +# Subtest: row 175: TESTER_VERBS and the organization branch tester set are pinned +ok 857 - row 175: TESTER_VERBS and the organization branch tester set are pinned + --- + duration_ms: 1.079566 + type: 'test' + ... +# Subtest: row 175: each of the six reads as the tester deep-equals the human read +ok 858 - row 175: each of the six reads as the tester deep-equals the human read + --- + duration_ms: 76.981032 + type: 'test' + ... +# Subtest: row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human +ok 859 - row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human + --- + duration_ms: 69.914532 + type: 'test' + ... +# Subtest: row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing +ok 860 - row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing + --- + duration_ms: 62.181322 + type: 'test' + ... +# Subtest: row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were +ok 861 - row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were + --- + duration_ms: 60.210315 + type: 'test' + ... +# Subtest: row 175: W4 as the tester writes by tester and keeps every name check +ok 862 - row 175: W4 as the tester writes by tester and keeps every name check + --- + duration_ms: 18.966456 + type: 'test' + ... +# Subtest: row 175: W6 as the tester records created_by tester; the human records the human +ok 863 - row 175: W6 as the tester records created_by tester; the human records the human + --- + duration_ms: 12.588329 + type: 'test' + ... +# Subtest: row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs +ok 864 - row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs + --- + duration_ms: 47.612037 + type: 'test' + ... +# Subtest: the tester binds only when the business sets bus.tester to exactly true +ok 865 - the tester binds only when the business sets bus.tester to exactly true + --- + duration_ms: 77.142311 + type: 'test' + ... +# Subtest: a business may not name a role tester, so the tester address is never a role +ok 866 - a business may not name a role tester, so the tester address is never a role + --- + duration_ms: 23.503014 + type: 'test' + ... +# Subtest: every verb outside the tester list refuses tester-refused and is recorded against the tester +ok 867 - every verb outside the tester list refuses tester-refused and is recorded against the tester + --- + duration_ms: 44.558286 + type: 'test' + ... +# Subtest: a tester message is from tester, needs no prefix, and writes no human.input or authority +ok 868 - a tester message is from tester, needs no prefix, and writes no human.input or authority + --- + duration_ms: 19.863269 + type: 'test' + ... +# Subtest: a tester message to a role no run holds refuses tester-target-not-running and stores nothing +ok 869 - a tester message to a role no run holds refuses tester-target-not-running and stores nothing + --- + duration_ms: 13.464225 + type: 'test' + ... +# Subtest: a tester message is refused while the run is only launched, and routes once it claims +ok 870 - a tester message is refused while the run is only launched, and routes once it claims + --- + duration_ms: 20.421915 + type: 'test' + ... +# Subtest: a human message to a role no run holds still waits and tells launch.by +ok 871 - a human message to a role no run holds still waits and tells launch.by + --- + duration_ms: 14.920592 + type: 'test' + ... +# Subtest: a role answers a tester only in reply to a tester message, and the answer never reaches the human +ok 872 - a role answers a tester only in reply to a tester message, and the answer never reaches the human + --- + duration_ms: 28.524241 + type: 'test' + ... +# Subtest: the tester reads the human views a reader reads +ok 873 - the tester reads the human views a reader reads + --- + duration_ms: 28.592328 + type: 'test' + ... +# Subtest: tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent +ok 874 - tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent + --- + duration_ms: 1.1804 + type: 'test' + ... +# Subtest: neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable +ok 875 - neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable + --- + duration_ms: 0.352035 + type: 'test' + ... +# Subtest: testerNonce reads only the tester's variable and gives null on any read error +ok 876 - testerNonce reads only the tester's variable and gives null on any read error + --- + duration_ms: 0.192905 + type: 'test' + ... +# Subtest: an envelope carries exactly one of cap, human and tester; no tester authenticator refuses +ok 877 - an envelope carries exactly one of cap, human and tester; no tester authenticator refuses + --- + duration_ms: 96.273972 + type: 'test' + ... +# Subtest: tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker +ok 878 - tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker + --- + duration_ms: 1078.424978 + type: 'test' + ... +# Subtest: T1: the human and the reader see a held thread claim; agents still lists the role only +ok 879 - T1: the human and the reader see a held thread claim; agents still lists the role only + --- + duration_ms: 82.457156 + type: 'test' + ... +# Subtest: T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row +ok 880 - T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row + --- + duration_ms: 99.495711 + type: 'test' + ... +# Subtest: T3: a role session refuses human-required and the tester refuses tester-refused +ok 881 - T3: a role session refuses human-required and the tester refuses tester-refused + --- + duration_ms: 89.683696 + type: 'test' + ... +# Subtest: T4: agents answers each session the same before and after a thread run claims +ok 882 - T4: agents answers each session the same before and after a thread run claims + --- + duration_ms: 75.384435 + type: 'test' + ... +# Subtest: T5: the result carries neither the thread name a user wrote nor a message body +ok 883 - T5: the result carries neither the thread name a user wrote nor a message body + --- + duration_ms: 87.31546 + type: 'test' + ... +# Subtest: T6: two held sessions of one thread list as two rows, each its session's latest claim +ok 884 - T6: two held sessions of one thread list as two rows, each its session's latest claim + --- + duration_ms: 96.447613 + type: 'test' + ... +# Subtest: REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written +ok 885 - REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written + --- + duration_ms: 356.935049 + type: 'test' + ... +# Subtest: REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables +ok 886 - REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables + --- + duration_ms: 225.861302 + type: 'test' + ... +# Subtest: REQ-THREAD-1: the offline command prints the kept-message counts before the ready line +ok 887 - REQ-THREAD-1: the offline command prints the kept-message counts before the ready line + --- + duration_ms: 340.523417 + type: 'test' + ... +# Subtest: a share lets the sharee read the thread and nothing else: every write verb stays the owner's (mutants 7, 9) +ok 888 - a share lets the sharee read the thread and nothing else: every write verb stays the owner's (mutants 7, 9) + --- + duration_ms: 117.56652 + type: 'test' + ... +# Subtest: the business human shares too, and a `*` share reaches every covered principal but the tester +ok 889 - the business human shares too, and a `*` share reaches every covered principal but the tester + --- + duration_ms: 91.254063 + type: 'test' + ... +# Subtest: mutant 2: a share never widens a grant; when the sharee's grant stops covering the thread, its reads end +ok 890 - mutant 2: a share never widens a grant; when the sharee's grant stops covering the thread, its reads end + --- + duration_ms: 94.267023 + type: 'test' + ... +# Subtest: mutant 3: a thread whose user owner has lost coverage is hidden from its sharees, the owner's board included +ok 891 - mutant 3: a thread whose user owner has lost coverage is hidden from its sharees, the owner's board included + --- + duration_ms: 100.828928 + type: 'test' + ... +# Subtest: mutant 4: a share's state is its latest row, so an unshare ends it and a share after it starts it again +ok 892 - mutant 4: a share's state is its latest row, so an unshare ends it and a share after it starts it again + --- + duration_ms: 110.011904 + type: 'test' + ... +# Subtest: mutant 8: a user target needs a live grant of any level covering the thread, else share-not-covered +ok 893 - mutant 8: a user target needs a live grant of any level covering the thread, else share-not-covered + --- + duration_ms: 90.865304 + type: 'test' + ... +# Subtest: a viewer reads a thread shared with it, and share, unshare and shares refuse a viewer access-refused (design 4.3) +ok 894 - a viewer reads a thread shared with it, and share, unshare and shares refuse a viewer access-refused (design 4.3) + --- + duration_ms: 90.394824 + type: 'test' + ... +# Subtest: a share target is `user:`, the business human or `*`, and never the sharer +ok 895 - a share target is `user:`, the business human or `*`, and never the sharer + --- + duration_ms: 159.684939 + type: 'test' + ... +# Subtest: a user whose collaborator grant no longer covers its own thread can't share, unshare or list its shares +ok 896 - a user whose collaborator grant no longer covers its own thread can't share, unshare or list its shares + --- + duration_ms: 89.085931 + type: 'test' + ... +# Subtest: the tester and a reader session never share: each verb refuses and writes nothing +ok 897 - the tester and a reader session never share: each verb refuses and writes nothing + --- + duration_ms: 143.369028 + type: 'test' + ... +# Subtest: the owner's trail and replies show a user's message only while that user's thread is shared with the owner +ok 898 - the owner's trail and replies show a user's message only while that user's thread is shared with the owner + --- + duration_ms: 108.965339 + type: 'test' + ... +# Subtest: a share covers every session of the thread +ok 899 - a share covers every session of the thread + --- + duration_ms: 92.848795 + type: 'test' + ... +# Subtest: a sharee can't list the thread's sessions: session.list stays owner-only (Q7, sage-2818 Q1) +ok 900 - a sharee can't list the thread's sessions: session.list stays owner-only (Q7, sage-2818 Q1) + --- + duration_ms: 95.994019 + type: 'test' + ... +# Subtest: only a human principal matches a share: an agent bound to the thread and the tester match none (sage-2818 Q2) +ok 901 - only a human principal matches a share: an agent bound to the thread and the tester match none (sage-2818 Q2) + --- + duration_ms: 126.066336 + type: 'test' + ... +# Subtest: a 3l store migrates to 3m: thread_shares is new and empty, and every other row stays as it was +ok 902 - a 3l store migrates to 3m: thread_shares is new and empty, and every other row stays as it was + --- + duration_ms: 532.131126 + type: 'test' + ... +# Subtest: the 3l engine refuses a 3m store, migrating or not, and leaves it as it was +ok 903 - the 3l engine refuses a 3m store, migrating or not, and leaves it as it was + --- + duration_ms: 968.403661 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger +ok 904 - REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger + --- + duration_ms: 138.04602 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker +ok 905 - REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker + --- + duration_ms: 486.347492 + type: 'test' + ... +# Subtest: REQ-MSG-1: a message to or from the assistant names its thread, or is refused +ok 906 - REQ-MSG-1: a message to or from the assistant names its thread, or is refused + --- + duration_ms: 131.123332 + type: 'test' + ... +# Subtest: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work +ok 907 - REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work + --- + duration_ms: 2155.046559 + type: 'test' + ... +# Subtest: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance +ok 908 - REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance + --- + duration_ms: 109.452323 + type: 'test' + ... +# Subtest: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder +ok 909 - REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder + --- + duration_ms: 121.092485 + type: 'test' + ... +# Subtest: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it +ok 910 - REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it + --- + duration_ms: 129.910384 + type: 'test' + ... +# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder +ok 911 - REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder + --- + duration_ms: 136.010644 + type: 'test' + ... +# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder +ok 912 - REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder + --- + duration_ms: 123.363399 + type: 'test' + ... +# Subtest: REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant +ok 913 - REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant + --- + duration_ms: 115.605709 + type: 'test' + ... +# Subtest: Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's +ok 914 - Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's + --- + duration_ms: 169.32793 + type: 'test' + ... +# Subtest: REQ-USER-2: the human verbs refuse another owner's thread +ok 915 - REQ-USER-2: the human verbs refuse another owner's thread + --- + duration_ms: 126.983407 + type: 'test' + ... +# Subtest: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one +ok 916 - REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one + --- + duration_ms: 103.305062 + type: 'test' + ... +# Subtest: REQ-ORG-2: projects and threads are named once, and the repo names a business project +ok 917 - REQ-ORG-2: projects and threads are named once, and the repo names a business project + --- + duration_ms: 114.611254 + type: 'test' + ... +# Subtest: REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing +ok 918 - REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing + --- + duration_ms: 388.640596 + type: 'test' + ... +# Subtest: project.create refuses a repository name without its matching repo before any write +ok 919 - project.create refuses a repository name without its matching repo before any write + --- + duration_ms: 67.614375 + type: 'test' + ... +# Subtest: project.create keeps unrelated names with and without a repository +ok 920 - project.create keeps unrelated names with and without a repository + --- + duration_ms: 54.128387 + type: 'test' + ... +# Subtest: C2-09a: explicit creative instances bind independent threads, default sessions and holders +ok 921 - C2-09a: explicit creative instances bind independent threads, default sessions and holders + --- + duration_ms: 204.926136 + type: 'test' + ... +# Subtest: C2-09a: explicit missing, non-thread and malformed selectors create no thread or session +ok 922 - C2-09a: explicit missing, non-thread and malformed selectors create no thread or session + --- + duration_ms: 86.590363 + type: 'test' + ... +# Subtest: C2-09a: creative bindLaunch without a thread refuses thread-required +ok 923 - C2-09a: creative bindLaunch without a thread refuses thread-required + --- + duration_ms: 45.920441 + type: 'test' + ... +# Subtest: socket capability stamps launch identity; shared views use wire, no SQL client +ok 924 - socket capability stamps launch identity; shared views use wire, no SQL client + --- + duration_ms: 112.784821 + type: 'test' + ... +# Subtest: two wire claims serialize; a lost reply never automatically retries +ok 925 - two wire claims serialize; a lost reply never automatically retries + --- + duration_ms: 102.686198 + type: 'test' + ... +# Subtest: malformed, oversized and identity-forging envelopes refuse without echoing input +ok 926 - malformed, oversized and identity-forging envelopes refuse without echoing input + --- + duration_ms: 75.75664 + type: 'test' + ... +# Subtest: client preserves UTF-8 when a response divides a multibyte character +ok 927 - client preserves UTF-8 when a response divides a multibyte character + --- + duration_ms: 11.774794 + type: 'test' + ... +# Subtest: committed mutation followed by dropped reply reports unknown and is never retried +ok 928 - committed mutation followed by dropped reply reports unknown and is never retried + --- + duration_ms: 86.634346 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses +ok 929 - REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses + --- + duration_ms: 92.220052 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty +ok 930 - REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty + --- + duration_ms: 450.698152 + type: 'test' + ... +# Subtest: REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket +ok 931 - REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket + --- + duration_ms: 78.91966 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once +ok 932 - REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once + --- + duration_ms: 21.983591 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 cut: unknown is durable and logged next to every total +ok 933 - REQ-LIMIT-4 cut: unknown is durable and logged next to every total + --- + duration_ms: 13.553579 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 disabled: unknown is durable and logged next to every total +ok 934 - REQ-LIMIT-4 disabled: unknown is durable and logged next to every total + --- + duration_ms: 13.597695 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total +ok 935 - REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total + --- + duration_ms: 12.105981 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total +ok 936 - REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total + --- + duration_ms: 14.449766 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total +ok 937 - REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total + --- + duration_ms: 12.571796 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts +ok 938 - REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts + --- + duration_ms: 13.434704 + type: 'test' + ... +# Subtest: usage records are append-only +ok 939 - usage records are append-only + --- + duration_ms: 13.7348 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 parse failure logs its safe code, never transcript content +ok 940 - REQ-LIMIT-4 parse failure logs its safe code, never transcript content + --- + duration_ms: 14.246627 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow +ok 941 - REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow + --- + duration_ms: 17.023402 + type: 'test' + ... +# Subtest: REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript +ok 942 - REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript + --- + duration_ms: 13.110055 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run +ok 943 - REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run + --- + duration_ms: 11.588347 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled +ok 944 - REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled + --- + duration_ms: 15.07388 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded +ok 945 - REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded + --- + duration_ms: 9.820567 + type: 'test' + ... +# Subtest: row 65 a run bound without a transcript directory records no-transcript +ok 946 - row 65 a run bound without a transcript directory records no-transcript + --- + duration_ms: 10.545933 + type: 'test' + ... +# Subtest: R3: bindUser binds a granted user and refuses one with no live grant +ok 947 - R3: bindUser binds a granted user and refuses one with no live grant + --- + duration_ms: 15.21507 + type: 'test' + ... +# Subtest: R3: a user named like the business human, the tester or a principal word is refused, whatever the grants say +ok 948 - R3: a user named like the business human, the tester or a principal word is refused, whatever the grants say + --- + duration_ms: 10.455453 + type: 'test' + ... +# Subtest: R3: each collaborator verb is allowed to a granted user +ok 949 - R3: each collaborator verb is allowed to a granted user + --- + duration_ms: 20.033533 + type: 'test' + ... +# Subtest: R3: every verb off the collaborator list refuses a user access-refused before its own checks +ok 950 - R3: every verb off the collaborator list refuses a user access-refused before its own checks + --- + duration_ms: 109.912029 + type: 'test' + ... +# Subtest: R3: task, web and host verbs refuse a user access-refused +ok 951 - R3: task, web and host verbs refuse a user access-refused + --- + duration_ms: 24.499932 + type: 'test' + ... +# Subtest: R3 leak: project.list shows granted projects only +ok 952 - R3 leak: project.list shows granted projects only + --- + duration_ms: 14.474768 + type: 'test' + ... +# Subtest: R3 leak: thread.create needs the project and the thread instance granted, and an ungranted id reads as one that does not exist +ok 953 - R3 leak: thread.create needs the project and the thread instance granted, and an ungranted id reads as one that does not exist + --- + duration_ms: 17.080886 + type: 'test' + ... +# Subtest: R3 leak: thread.list shows the user its own threads that are still granted, never others +ok 954 - R3 leak: thread.list shows the user its own threads that are still granted, never others + --- + duration_ms: 39.035299 + type: 'test' + ... +# Subtest: R3 leak: names shows granted instances only +ok 955 - R3 leak: names shows granted instances only + --- + duration_ms: 16.94332 + type: 'test' + ... +# Subtest: R3: thread.send is from user: and writes no human.input +ok 956 - R3: thread.send is from user: and writes no human.input + --- + duration_ms: 14.378191 + type: 'test' + ... +# Subtest: R3: a reply-chain message.send into another user thread is refused +ok 957 - R3: a reply-chain message.send into another user thread is refused + --- + duration_ms: 17.516411 + type: 'test' + ... +# Subtest: R3: the run reply to a user message reaches that user thread.messages, with no waiting and no notice +ok 958 - R3: the run reply to a user message reaches that user thread.messages, with no waiting and no notice + --- + duration_ms: 19.344727 + type: 'test' + ... +# Subtest: R3: a reply to: user without a matching in_reply_to is refused user-reply-required +ok 959 - R3: a reply to: user without a matching in_reply_to is refused user-reply-required + --- + duration_ms: 31.245106 + type: 'test' + ... +# Subtest: R3: a non-thread run, the human and the tester cannot send to: user +ok 960 - R3: a non-thread run, the human and the tester cannot send to: user + --- + duration_ms: 18.222181 + type: 'test' + ... +# Subtest: R3: a user thread run cannot message the owner, while its uncited gated raise reaches only the owner inbox, B9 +ok 961 - R3: a user thread run cannot message the owner, while its uncited gated raise reaches only the owner inbox, B9 + --- + duration_ms: 20.932433 + type: 'test' + ... +# Subtest: R3: a removed or expired grant refuses the next request access-revoked, and the file is read per request +ok 962 - R3: a removed or expired grant refuses the next request access-revoked, and the file is read per request + --- + duration_ms: 20.866871 + type: 'test' + ... +# Subtest: R3: a user refusal is recorded as action.refused by user: +ok 963 - R3: a user refusal is recorded as action.refused by user: + --- + duration_ms: 14.866986 + type: 'test' + ... +# Subtest: R3: a business with a role keyed user refuses invalid-business +ok 964 - R3: a business with a role keyed user refuses invalid-business + --- + duration_ms: 10.331427 + type: 'test' + ... +# Subtest: R3: name.set refuses the name user +ok 965 - R3: name.set refuses the name user + --- + duration_ms: 10.607078 + type: 'test' + ... +# Subtest: R3 r4: while halted, a granted user's thread.send refuses processing-halted and thread.messages still answers +ok 966 - R3 r4: while halted, a granted user's thread.send refuses processing-halted and thread.messages still answers + --- + duration_ms: 15.211966 + type: 'test' + ... +# Subtest: R3 r4: the chief's hire refuses an instance named user with the code it gives human and tester +ok 967 - R3 r4: the chief's hire refuses an instance named user with the code it gives human and tester + --- + duration_ms: 15.904243 + type: 'test' + ... +# Subtest: R3 r4: a non-function access throws before the store is read +ok 968 - R3 r4: a non-function access throws before the store is read + --- + duration_ms: 0.140454 + type: 'test' + ... +# Subtest: C2-09a: naming an instance cannot bypass its collaborator grant or disclose an ungranted project +ok 969 - C2-09a: naming an instance cannot bypass its collaborator grant or disclose an ungranted project + --- + duration_ms: 18.332708 + type: 'test' + ... +# Subtest: 264e deferred B6: a reply cannot cite the same user in a sibling session +ok 970 - 264e deferred B6: a reply cannot cite the same user in a sibling session + --- + duration_ms: 21.809409 + type: 'test' + ... +# Subtest: 275: VIEWER_VERBS is the ruled read list, inside USER_VERBS +ok 971 - 275: VIEWER_VERBS is the ruled read list, inside USER_VERBS + --- + duration_ms: 1.098238 + type: 'test' + ... +# Subtest: 275: a viewer binds, and each viewer verb answers with what its grant covers +ok 972 - 275: a viewer binds, and each viewer verb answers with what its grant covers + --- + duration_ms: 27.931383 + type: 'test' + ... +# Subtest: 275: a viewer is refused thread.create, thread.open and thread.send access-refused, and nothing is stored +ok 973 - 275: a viewer is refused thread.create, thread.open and thread.send access-refused, and nothing is stored + --- + duration_ms: 22.482951 + type: 'test' + ... +# Subtest: 275: every verb off the user list refuses a viewer access-refused before its own checks +ok 974 - 275: every verb off the user list refuses a viewer access-refused before its own checks + --- + duration_ms: 100.385233 + type: 'test' + ... +# Subtest: 275: mixed grants, collaborator on one project and viewer on another, take the level per project +ok 975 - 275: mixed grants, collaborator on one project and viewer on another, take the level per project + --- + duration_ms: 27.114753 + type: 'test' + ... +# Subtest: 275: board reads refuse users and viewers access-refused +ok 976 - 275: board reads refuse users and viewers access-refused + --- + duration_ms: 77.151363 + type: 'test' + ... +# Subtest: governance pin, user side: decisions, inbox entries, claims, tasks and project files are the owner's, the user reads its messages +ok 977 - governance pin, user side: decisions, inbox entries, claims, tasks and project files are the owner's, the user reads its messages + --- + duration_ms: 42.306221 + type: 'test' + ... +# Subtest: web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query +ok 978 - web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query + --- + duration_ms: 21.856045 + type: 'test' + ... +# Subtest: web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url +ok 979 - web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url + --- + duration_ms: 20.672611 + type: 'test' + ... +# Subtest: a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched +ok 980 - a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched + --- + duration_ms: 19.256669 + type: 'test' + ... +# Subtest: a broker with no web service refuses a granted role +ok 981 - a broker with no web service refuses a granted role + --- + duration_ms: 14.238874 + type: 'test' + ... +# Subtest: bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session +ok 982 - bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session + --- + duration_ms: 18.192852 + type: 'test' + ... +# Subtest: a session that is not the role holder is refused +ok 983 - a session that is not the role holder is refused + --- + duration_ms: 11.984789 + type: 'test' + ... +# Subtest: web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason +ok 984 - web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason + --- + duration_ms: 39.225327 + type: 'test' + ... +# Subtest: web.search with no search source configured is a refused result, not an error +ok 985 - web.search with no search source configured is a refused result, not an error + --- + duration_ms: 14.799285 + type: 'test' + ... +# Subtest: a search source that fails with its own refusal, or that throws, is handled +ok 986 - a search source that fails with its own refusal, or that throws, is handled + --- + duration_ms: 18.728782 + type: 'test' + ... +# Subtest: a slow search source ends in a refusal at the deadline +ok 987 - a slow search source ends in a refusal at the deadline + --- + duration_ms: 65.443801 + type: 'test' + ... +# Subtest: a secret in the arguments is refused before anything is trailed or fetched +ok 988 - a secret in the arguments is refused before anything is trailed or fetched + --- + duration_ms: 12.923999 + type: 'test' + ... +# Subtest: over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured +ok 989 - over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured + --- + duration_ms: 77.990624 + type: 'test' + ... +# Subtest: busBusiness: the web grant comes from "web" in the resolved tool limit +ok 990 - busBusiness: the web grant comes from "web" in the resolved tool limit + --- + duration_ms: 0.31622 + type: 'test' + ... +# Subtest: webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured +ok 991 - webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured + --- + duration_ms: 45.872663 + type: 'test' + ... +# Subtest: an ungranted call is refused at once: no admission, no wait, nothing touched +ok 992 - an ungranted call is refused at once: no admission, no wait, nothing touched + --- + duration_ms: 17.919619 + type: 'test' + ... +# Subtest: over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait +ok 993 - over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait + --- + duration_ms: 350.791247 + type: 'test' + ... +# Subtest: a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) +ok 994 - a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) + --- + duration_ms: 75.28296 + type: 'test' + ... +# Subtest: a fetch that stalls is cut off at the deadline: the request is destroyed, not left running +ok 995 - a fetch that stalls is cut off at the deadline: the request is destroyed, not left running + --- + duration_ms: 94.990062 + type: 'test' + ... +# Subtest: 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 +ok 996 - 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 + --- + duration_ms: 19.130732 + type: 'test' + ... +# Subtest: merge-gate's technical raise is cross-role, goes to the cto, and only merge-gate can use the approval +ok 997 - merge-gate's technical raise is cross-role, goes to the cto, and only merge-gate can use the approval + --- + duration_ms: 39.024098 + type: 'test' + ... +# Subtest: merge-gate has no message.send, and without a domain its raise goes to the delivery arbiter +ok 998 - merge-gate has no message.send, and without a domain its raise goes to the delivery arbiter + --- + duration_ms: 25.130671 + type: 'test' + ... +# Subtest: the cto must be able to message merge-gate, or the technical raise is refused (row 133) +ok 999 - the cto must be able to message merge-gate, or the technical raise is refused (row 133) + --- + duration_ms: 22.605176 + type: 'test' + ... +# Subtest: security-reviewer answers a review with its verdict alone; it holds no message.send +ok 1000 - security-reviewer answers a review with its verdict alone; it holds no message.send + --- + duration_ms: 28.193715 + type: 'test' + ... +1..1000 +# tests 1000 +# suites 0 +# pass 1000 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 142855.181505 diff --git a/agents/fethry/work/queue-266/evidence/editor-build.tap b/agents/fethry/work/queue-266/evidence/editor-build.tap new file mode 100644 index 000000000..df084e9f6 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/editor-build.tap @@ -0,0 +1,16 @@ +npm notice run @mosaic/webui@0.1.0 build:editor +npm notice run node editor/build.mjs +▲ [WARNING] Ignoring this import because "third_party/editor/prosemirror-transform/src/mark.ts" was marked as having no side effects [ignored-bare-import] + + third_party/editor/prosemirror-transform/src/index.ts:10:7: + 10 │ import "./mark" + ╵ ~~~~~~~~ + + "sideEffects" is false in the enclosing "package.json" file: + + third_party/editor/prosemirror-transform/package.json:13:2: + 13 │ "sideEffects": false, + ╵ ~~~~~~~~~~~~~ + +editor.js 9c881b13740fae2408717ad75fa1d85bfcfe3fa8b3af0f1b3f2e706c90e80fee (133 inputs) +editor.css 8654ac57d1e7a561110138ecd7f701c34a074017ff8c4cd2768d8083908ee61f diff --git a/agents/fethry/work/queue-266/evidence/gate-summary.json b/agents/fethry/work/queue-266/evidence/gate-summary.json new file mode 100644 index 000000000..148fe0a46 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/gate-summary.json @@ -0,0 +1,63 @@ +[ + { + "step": "editor-build", + "command": [ + "npm", + "run", + "build:editor" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui", + "outerSeconds": 120, + "exit": 0, + "seconds": 0.214, + "cleanupSignals": [] + }, + { + "step": "webui-full", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/webui/tests/" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 900, + "exit": 0, + "seconds": 270.066, + "cleanupSignals": [] + }, + { + "step": "plugins-full", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/plugins/tests/" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 300, + "exit": 0, + "seconds": 0.866, + "cleanupSignals": [] + }, + { + "step": "bus-full", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/bus/tests/" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 1, + "seconds": 132.9, + "cleanupSignals": [] + } +] diff --git a/agents/fethry/work/queue-266/evidence/plugin-green.tap b/agents/fethry/work/queue-266/evidence/plugin-green.tap new file mode 100644 index 000000000..c58871440 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/plugin-green.tap @@ -0,0 +1,16 @@ +TAP version 13 +# Subtest: C2-10c webui permits exactly the three added room verbs and preserves core refusals +ok 1 - C2-10c webui permits exactly the three added room verbs and preserves core refusals + --- + duration_ms: 1.543022 + type: 'test' + ... +1..1 +# tests 1 +# suites 0 +# pass 1 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 45.19296 diff --git a/agents/fethry/work/queue-266/evidence/plugin-red.tap b/agents/fethry/work/queue-266/evidence/plugin-red.tap new file mode 100644 index 000000000..300f99035 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/plugin-red.tap @@ -0,0 +1,28 @@ +TAP version 13 +# Subtest: C2-10c webui permits exactly the three added room verbs and preserves core refusals +not ok 1 - C2-10c webui permits exactly the three added room verbs and preserves core refusals + --- + duration_ms: 0.69237 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/plugins/tests/room-channel.test.mjs:5:1' + failureType: 'testCodeFailure' + error: 'unsupported channel operation' + code: 'channel-operation' + name: 'PluginError' + stack: |- + dispatch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/plugins/channel/webui/index.mjs:23:31) + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/plugins/tests/room-channel.test.mjs:8:28) + Test.runInAsyncScope (node:async_hooks:226:14) + Test.run (node:internal/test_runner/test:1402:25) + Test.start (node:internal/test_runner/test:1262:17) + startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) + ... +1..1 +# tests 1 +# suites 0 +# pass 0 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 46.133256 diff --git a/agents/fethry/work/queue-266/evidence/plugins-full.tap b/agents/fethry/work/queue-266/evidence/plugins-full.tap new file mode 100644 index 000000000..474769d67 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/plugins-full.tap @@ -0,0 +1,730 @@ +TAP version 13 +# Subtest: channel registry requires dispatch at interface 1 and switches a list +ok 1 - channel registry requires dispatch at interface 1 and switches a list + --- + duration_ms: 1.093033 + type: 'test' + ... +# Subtest: channel shipped modules load and preserve every supported operation and bus refusal +ok 2 - channel shipped modules load and preserve every supported operation and bus refusal + --- + duration_ms: 2.329081 + type: 'test' + ... +# Subtest: channel snapshot is a frozen matched pair and a captured array survives reload +ok 3 - channel snapshot is a frozen matched pair and a captured array survives reload + --- + duration_ms: 3.672804 + type: 'test' + ... +# Subtest: channel guards refuse bad names, missing paths, exports and versions while retaining last good +ok 4 - channel guards refuse bad names, missing paths, exports and versions while retaining last good + --- + duration_ms: 3.25585 + type: 'test' + ... +# Subtest: channel guards refuse symlinked module, index and kind directories +ok 5 - channel guards refuse symlinked module, index and kind directories + --- + duration_ms: 2.246923 + type: 'test' + ... +# Subtest: channel caller re-reads settings and keeps off switches independent by module name +ok 6 - channel caller re-reads settings and keeps off switches independent by module name + --- + duration_ms: 1.351401 + type: 'test' + ... +# Subtest: channel caller malformed settings refuse without a chat operation and no unrelated kind loads +ok 7 - channel caller malformed settings refuse without a chat operation and no unrelated kind loads + --- + duration_ms: 0.435438 + type: 'test' + ... +# Subtest: channel caller uses last good after loader refusal and fails closed on first load +ok 8 - channel caller uses last good after loader refusal and fails closed on first load + --- + duration_ms: 0.580004 + type: 'test' + ... +# Subtest: channel dispatch holds no selection lock while a slow send is awaiting +ok 9 - channel dispatch holds no selection lock while a slow send is awaiting + --- + duration_ms: 0.491762 + type: 'test' + ... +# Subtest: channel last realpath check refuses an index swapped after component checks +ok 10 - channel last realpath check refuses an index swapped after component checks + --- + duration_ms: 2.241815 + type: 'test' + ... +# Subtest: channel caller refuses invalid core construction +ok 11 - channel caller refuses invalid core construction + --- + duration_ms: 0.150251 + type: 'test' + ... +# Subtest: channel caller invokes the selected loaded module instead of bypassing dispatch +ok 12 - channel caller invokes the selected loaded module instead of bypassing dispatch + --- + duration_ms: 2.065095 + type: 'test' + ... +# Subtest: channel caller keeps the selected module operation filter in front of the core transport +ok 13 - channel caller keeps the selected module operation filter in front of the core transport + --- + duration_ms: 0.241841 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report +ok 14 - REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report + --- + duration_ms: 4.156727 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since +ok 15 - REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since + --- + duration_ms: 12.582509 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota +ok 16 - REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota + --- + duration_ms: 0.329543 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 an unknown turn adds nothing and is counted apart +ok 17 - REQ-LIMIT-4 an unknown turn adds nothing and is counted apart + --- + duration_ms: 0.442314 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's +ok 18 - REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's + --- + duration_ms: 0.682365 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long +ok 19 - REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long + --- + duration_ms: 0.387921 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long +ok 20 - REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long + --- + duration_ms: 0.330814 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap +ok 21 - REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap + --- + duration_ms: 1.372326 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one +ok 22 - REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one + --- + duration_ms: 0.4571 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again +ok 23 - REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again + --- + duration_ms: 1.027459 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 counts past the safe integer range come back as digit strings +ok 24 - REQ-LIMIT-2 counts past the safe integer range come back as digit strings + --- + duration_ms: 0.350076 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments +ok 25 - REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments + --- + duration_ms: 2.155059 + type: 'test' + ... +# Subtest: REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty +ok 26 - REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty + --- + duration_ms: 0.190579 + type: 'test' + ... +# Subtest: row 307 pi answers what row 270 read: plain +ok 27 - row 307 pi answers what row 270 read: plain + --- + duration_ms: 2.273277 + type: 'test' + ... +# Subtest: row 307 pi answers what row 270 read: budget +ok 28 - row 307 pi answers what row 270 read: budget + --- + duration_ms: 0.560346 + type: 'test' + ... +# Subtest: row 307 pi answers what row 270 read: cap +ok 29 - row 307 pi answers what row 270 read: cap + --- + duration_ms: 0.447806 + type: 'test' + ... +# Subtest: row 307 pi answers what row 270 read: shrank +ok 30 - row 307 pi answers what row 270 read: shrank + --- + duration_ms: 0.41824 + type: 'test' + ... +# Subtest: row 307 pi answers what row 270 read: header +ok 31 - row 307 pi answers what row 270 read: header + --- + duration_ms: 0.525662 + type: 'test' + ... +# Subtest: row 307 pi's first collection over Claude history answers harness-unsupported without a scan, and a later one scans +ok 32 - row 307 pi's first collection over Claude history answers harness-unsupported without a scan, and a later one scans + --- + duration_ms: 0.854402 + type: 'test' + ... +# Subtest: row 307 claude-code reads nothing and answers harness-unsupported with no version +ok 33 - row 307 claude-code reads nothing and answers harness-unsupported with no version + --- + duration_ms: 0.145488 + type: 'test' + ... +# Subtest: row 307 a harness module without compactions doesn't load: missing-export +ok 34 - row 307 a harness module without compactions doesn't load: missing-export + --- + duration_ms: 2.544641 + type: 'test' + ... +# Subtest: row 65 both harness modules load through the loader with every export the kind names +ok 35 - row 65 both harness modules load through the loader with every export the kind names + --- + duration_ms: 7.887813 + type: 'test' + ... +# Subtest: row 65 each module answers for its own harness: adapter, levels, account, web, turn end and session files +ok 36 - row 65 each module answers for its own harness: adapter, levels, account, web, turn end and session files + --- + duration_ms: 0.743006 + type: 'test' + ... +# Subtest: row 65 claude-code preflight: a missing credential, then a missing or relative binary, each refuse with their code +ok 37 - row 65 claude-code preflight: a missing credential, then a missing or relative binary, each refuse with their code + --- + duration_ms: 3.607123 + type: 'test' + ... +# Subtest: row 65 claude-code version asks MOSAIC_CLAUDE_BIN when set, else claude on PATH, else null +ok 38 - row 65 claude-code version asks MOSAIC_CLAUDE_BIN when set, else claude on PATH, else null + --- + duration_ms: 3.846673 + type: 'test' + ... +# Subtest: row 65 pi preflight passes with the repository's pi, and its version is the package pin +ok 39 - row 65 pi preflight passes with the repository's pi, and its version is the package pin + --- + duration_ms: 8.397292 + type: 'test' + ... +# Subtest: row 65 env passes the thinking level to both adapters, and claude-code's bundle writes its hook and MCP files +ok 40 - row 65 env passes the thinking level to both adapters, and claude-code's bundle writes its hook and MCP files + --- + duration_ms: 1.435832 + type: 'test' + ... +# Subtest: row 65 a route's thinking reaches pi as --thinking and claude as --effort, through each module's env and adapter +ok 41 - row 65 a route's thinking reaches pi as --thinking and claude as --effort, through each module's env and adapter + --- + duration_ms: 15.483026 + type: 'test' + ... +# Subtest: row 65 no core source outside packages/plugins names a harness, apart from the listed exceptions +ok 42 - row 65 no core source outside packages/plugins names a harness, apart from the listed exceptions + --- + duration_ms: 14.005572 + type: 'test' + ... +# Subtest: row 65 the grep's pattern catches a quoted name and a regex alternation, and not a word in prose +ok 43 - row 65 the grep's pattern catches a quoted name and a regex alternation, and not a word in prose + --- + duration_ms: 0.162322 + type: 'test' + ... +# Subtest: REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list +ok 44 - REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list + --- + duration_ms: 1.063022 + type: 'test' + ... +# Subtest: REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included +ok 45 - REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included + --- + duration_ms: 0.24919 + type: 'test' + ... +# Subtest: REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates +ok 46 - REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates + --- + duration_ms: 0.939348 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a kind that switches on one module takes one name, not a list +ok 47 - REQ-PLUG-1 a kind that switches on one module takes one name, not a list + --- + duration_ms: 0.155413 + type: 'test' + ... +# Subtest: REQ-PLUG-1 checkPlugins reports through the caller's fail callback +ok 48 - REQ-PLUG-1 checkPlugins reports through the caller's fail callback + --- + duration_ms: 0.16264 + type: 'test' + ... +# Subtest: REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed +ok 49 - REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed + --- + duration_ms: 9.287009 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting +ok 50 - REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting + --- + duration_ms: 3.680508 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting +ok 51 - REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting + --- + duration_ms: 3.446331 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting +ok 52 - REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting + --- + duration_ms: 2.671649 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting +ok 53 - REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting + --- + duration_ms: 2.37595 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) +ok 54 - REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) + --- + duration_ms: 25.90956 + type: 'test' + ... +# Subtest: REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check +ok 55 - REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check + --- + duration_ms: 2.906707 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting +ok 56 - REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting + --- + duration_ms: 2.796915 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath +ok 57 - REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath + --- + duration_ms: 2.400995 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a module that fails to load refuses and keeps the old setting +ok 58 - REQ-PLUG-1 a module that fails to load refuses and keeps the old setting + --- + duration_ms: 2.69425 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a missing export refuses and keeps the old setting +ok 59 - REQ-PLUG-1 a missing export refuses and keeps the old setting + --- + duration_ms: 3.312634 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a different interface version refuses and keeps the old setting +ok 60 - REQ-PLUG-1 a different interface version refuses and keeps the old setting + --- + duration_ms: 2.951412 + type: 'test' + ... +# Subtest: REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays +ok 61 - REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays + --- + duration_ms: 2.585281 + type: 'test' + ... +# Subtest: REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name +ok 62 - REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name + --- + duration_ms: 1.87625 + type: 'test' + ... +# Subtest: REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything +ok 63 - REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything + --- + duration_ms: 2.675823 + type: 'test' + ... +# Subtest: REQ-PLUG-1 loads run one at a time, so the last requested setting wins +ok 64 - REQ-PLUG-1 loads run one at a time, so the last requested setting wins + --- + duration_ms: 102.001355 + type: 'test' + ... +# Subtest: REQ-PLUG-1 the loader needs a log callback +ok 65 - REQ-PLUG-1 the loader needs a log callback + --- + duration_ms: 1.130584 + type: 'test' + ... +# Subtest: C2-10c webui permits exactly the three added room verbs and preserves core refusals +ok 66 - C2-10c webui permits exactly the three added room verbs and preserves core refusals + --- + duration_ms: 1.532674 + type: 'test' + ... +# Subtest: REQ-PLUG-2 the real tree's searxng-url module switches on as the search-source and answers +ok 67 - REQ-PLUG-2 the real tree's searxng-url module switches on as the search-source and answers + --- + duration_ms: 2.616283 + type: 'test' + ... +# Subtest: REQ-PLUG-2 a SearXNG that refuses JSON (403) is search-down, a bad settings url throws +ok 68 - REQ-PLUG-2 a SearXNG that refuses JSON (403) is search-down, a bad settings url throws + --- + duration_ms: 1.153042 + type: 'test' + ... +# Subtest: REQ-PLUG-2 search-source takes one name, not a list +ok 69 - REQ-PLUG-2 search-source takes one name, not a list + --- + duration_ms: 0.232651 + type: 'test' + ... +# Subtest: REQ-PLUG-2 searxng-bundled queries the fixed loopback address and ignores web.searxng +ok 70 - REQ-PLUG-2 searxng-bundled queries the fixed loopback address and ignores web.searxng + --- + duration_ms: 0.766974 + type: 'test' + ... +# Subtest: REQ-PLUG-2 harness-builtin switches on, serves no broker search, and refuses if called +ok 71 - REQ-PLUG-2 harness-builtin switches on, serves no broker search, and refuses if called + --- + duration_ms: 0.633341 + type: 'test' + ... +# Subtest: the searxng modules end the request when the broker's AbortSignal fires +ok 72 - the searxng modules end the request when the broker's AbortSignal fires + --- + duration_ms: 41.975824 + type: 'test' + ... +# Subtest: hasModule: true for a shipped module, false for a missing one, an unknown kind or a bad name +ok 73 - hasModule: true for a shipped module, false for a missing one, an unknown kind or a bad name + --- + duration_ms: 0.572554 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report +ok 74 - REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report + --- + duration_ms: 4.069294 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 each subject kind refuses at its limit and allows under it +ok 75 - REQ-LIMIT-3 each subject kind refuses at its limit and allows under it + --- + duration_ms: 1.264429 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a limit covers only its own subject's records and launches +ok 76 - REQ-LIMIT-3 a limit covers only its own subject's records and launches + --- + duration_ms: 0.310153 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart +ok 77 - REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart + --- + duration_ms: 0.245871 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a reset moves since: records before it no longer count +ok 78 - REQ-LIMIT-3 a reset moves since: records before it no longer count + --- + duration_ms: 0.178373 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named +ok 79 - REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named + --- + duration_ms: 0.159818 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) +ok 80 - REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) + --- + duration_ms: 0.172512 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 counts past the safe integer range come back as digit strings +ok 81 - REQ-LIMIT-3 counts past the safe integer range come back as digit strings + --- + duration_ms: 0.145224 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments +ok 82 - REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments + --- + duration_ms: 0.661745 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty +ok 83 - REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty + --- + duration_ms: 0.624533 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) +ok 84 - REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) + --- + duration_ms: 0.133942 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi: reports all token kinds and deduplicates assistant ids +ok 85 - REQ-LIMIT-4 pi: reports all token kinds and deduplicates assistant ids + --- + duration_ms: 2.821247 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code: reports all token kinds and deduplicates assistant ids +ok 86 - REQ-LIMIT-4 claude-code: reports all token kinds and deduplicates assistant ids + --- + duration_ms: 0.696333 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi cut line is unknown, never zero or content +ok 87 - REQ-LIMIT-4 pi cut line is unknown, never zero or content + --- + duration_ms: 1.007977 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi invalid UTF-8 is unknown, never zero or content +ok 88 - REQ-LIMIT-4 pi invalid UTF-8 is unknown, never zero or content + --- + duration_ms: 0.493409 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi missing input is unknown, never zero or content +ok 89 - REQ-LIMIT-4 pi missing input is unknown, never zero or content + --- + duration_ms: 0.57636 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi negative count is unknown, never zero or content +ok 90 - REQ-LIMIT-4 pi negative count is unknown, never zero or content + --- + duration_ms: 0.49758 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi fractional count is unknown, never zero or content +ok 91 - REQ-LIMIT-4 pi fractional count is unknown, never zero or content + --- + duration_ms: 0.422118 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi unsafe integer is unknown, never zero or content +ok 92 - REQ-LIMIT-4 pi unsafe integer is unknown, never zero or content + --- + duration_ms: 0.397082 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi file size is unknown, never zero or content +ok 93 - REQ-LIMIT-4 pi file size is unknown, never zero or content + --- + duration_ms: 6.459547 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi line size is unknown, never zero or content +ok 94 - REQ-LIMIT-4 pi line size is unknown, never zero or content + --- + duration_ms: 3.92269 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi symlink file is unknown, never zero or content +ok 95 - REQ-LIMIT-4 pi symlink file is unknown, never zero or content + --- + duration_ms: 0.488148 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi hardlink file is unknown, never zero or content +ok 96 - REQ-LIMIT-4 pi hardlink file is unknown, never zero or content + --- + duration_ms: 0.325503 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code cut line is unknown, never zero or content +ok 97 - REQ-LIMIT-4 claude-code cut line is unknown, never zero or content + --- + duration_ms: 0.377051 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code invalid UTF-8 is unknown, never zero or content +ok 98 - REQ-LIMIT-4 claude-code invalid UTF-8 is unknown, never zero or content + --- + duration_ms: 0.388899 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code missing input is unknown, never zero or content +ok 99 - REQ-LIMIT-4 claude-code missing input is unknown, never zero or content + --- + duration_ms: 0.403653 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code negative count is unknown, never zero or content +ok 100 - REQ-LIMIT-4 claude-code negative count is unknown, never zero or content + --- + duration_ms: 0.356921 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code fractional count is unknown, never zero or content +ok 101 - REQ-LIMIT-4 claude-code fractional count is unknown, never zero or content + --- + duration_ms: 0.388944 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code unsafe integer is unknown, never zero or content +ok 102 - REQ-LIMIT-4 claude-code unsafe integer is unknown, never zero or content + --- + duration_ms: 0.377099 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code file size is unknown, never zero or content +ok 103 - REQ-LIMIT-4 claude-code file size is unknown, never zero or content + --- + duration_ms: 6.07976 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code line size is unknown, never zero or content +ok 104 - REQ-LIMIT-4 claude-code line size is unknown, never zero or content + --- + duration_ms: 1.893556 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code symlink file is unknown, never zero or content +ok 105 - REQ-LIMIT-4 claude-code symlink file is unknown, never zero or content + --- + duration_ms: 0.403314 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code hardlink file is unknown, never zero or content +ok 106 - REQ-LIMIT-4 claude-code hardlink file is unknown, never zero or content + --- + duration_ms: 0.316423 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 pi a symlink directory anywhere in the root refuses +ok 107 - REQ-LIMIT-4 pi a symlink directory anywhere in the root refuses + --- + duration_ms: 0.322364 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code a symlink directory anywhere in the root refuses +ok 108 - REQ-LIMIT-4 claude-code a symlink directory anywhere in the root refuses + --- + duration_ms: 0.311861 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 bounded directory entries refuse before scanning an arbitrary tree +ok 109 - REQ-LIMIT-4 bounded directory entries refuse before scanning an arbitrary tree + --- + duration_ms: 8.32832 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 conflicting repeated usage refuses rather than double counting +ok 110 - REQ-LIMIT-4 conflicting repeated usage refuses rather than double counting + --- + duration_ms: 0.528438 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 oversized metadata refuses before reading any transcript bytes +ok 111 - REQ-LIMIT-4 oversized metadata refuses before reading any transcript bytes + --- + duration_ms: 5.788996 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a file growing after fstat cannot exceed the streaming byte budget +ok 112 - REQ-LIMIT-4 a file growing after fstat cannot exceed the streaming byte budget + --- + duration_ms: 4.822522 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 a same-size edit during a read is unknown rather than a stable snapshot +ok 113 - REQ-LIMIT-4 a same-size edit during a read is unknown rather than a stable snapshot + --- + duration_ms: 0.77981 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 record count is bounded even when each record is tiny +ok 114 - REQ-LIMIT-4 record count is bounded even when each record is tiny + --- + duration_ms: 7.87409 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 missing assistant usage, malformed JSON and conflicting identities are unknown +ok 115 - REQ-LIMIT-4 missing assistant usage, malformed JSON and conflicting identities are unknown + --- + duration_ms: 0.831847 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 caller roots, unsupported harnesses and non-object JSON never become zero usage +ok 116 - REQ-LIMIT-4 caller roots, unsupported harnesses and non-object JSON never become zero usage + --- + duration_ms: 0.640367 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 even a complete JSON record with no final newline is an unknown cut line +ok 117 - REQ-LIMIT-4 even a complete JSON record with no final newline is an unknown cut line + --- + duration_ms: 0.331929 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 final file opens are nonblocking before hostile file type is known +ok 118 - REQ-LIMIT-4 final file opens are nonblocking before hostile file type is known + --- + duration_ms: 0.469933 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 invalid transcript entry names refuse before file lookup +ok 119 - REQ-LIMIT-4 invalid transcript entry names refuse before file lookup + --- + duration_ms: 0.279053 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 claude-code refuses a symlinked project directory +ok 120 - REQ-LIMIT-4 claude-code refuses a symlinked project directory + --- + duration_ms: 0.491358 + type: 'test' + ... +1..120 +# tests 120 +# suites 0 +# pass 120 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 829.707835 diff --git a/agents/fethry/work/queue-266/evidence/raw-log-provenance.json b/agents/fethry/work/queue-266/evidence/raw-log-provenance.json new file mode 100644 index 000000000..f1d3ecc07 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/raw-log-provenance.json @@ -0,0 +1,200 @@ +[ + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/bus-full.tap", + "display": "bus-full.tap", + "rawSHA256": "cecdb996f0d0f34b592bdc1d8f7015cf1fcef48b7235f34237fb7edf8c194d5c", + "displaySHA256": "21e5b1cecc5a1499a7ae12b73fef50adaad8ada5f6ad8c222ed098e0add2fe0c" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/editor-build.tap", + "display": "editor-build.tap", + "rawSHA256": "6e4fb4cbdd36ff817c8246e727f382ada773d4667f314e0a5a187369c2c994ba", + "displaySHA256": "6e4fb4cbdd36ff817c8246e727f382ada773d4667f314e0a5a187369c2c994ba" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/plugin-green.tap", + "display": "plugin-green.tap", + "rawSHA256": "812b4fe16ba42152021741cd518913c68a834afb2b41da2a704c9f1eea87ba3e", + "displaySHA256": "812b4fe16ba42152021741cd518913c68a834afb2b41da2a704c9f1eea87ba3e" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/plugin-red.tap", + "display": "plugin-red.tap", + "rawSHA256": "a03dbb651717487be38b57bd793727e5627f37c8d3efd19483dbe979d2c7db46", + "displaySHA256": "a03dbb651717487be38b57bd793727e5627f37c8d3efd19483dbe979d2c7db46" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/plugins-full.tap", + "display": "plugins-full.tap", + "rawSHA256": "287e1f34ebab1c9290d7553ac4ba5319bf6c660ce26b430b2c69535dd803013c", + "displaySHA256": "287e1f34ebab1c9290d7553ac4ba5319bf6c660ce26b430b2c69535dd803013c" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-browser-final.tap", + "display": "room-browser-final.tap", + "rawSHA256": "9061501c7cc991c2710df07f1db7f564dc2bf6119de11ec9835ebd23e62f9137", + "displaySHA256": "9061501c7cc991c2710df07f1db7f564dc2bf6119de11ec9835ebd23e62f9137" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-browser-final2.tap", + "display": "room-browser-final2.tap", + "rawSHA256": "e20f05a46438679273ab94a3bf8e718421e647c38068283bccb6895a5e2938c3", + "displaySHA256": "e20f05a46438679273ab94a3bf8e718421e647c38068283bccb6895a5e2938c3" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-browser-green.tap", + "display": "room-browser-green.tap", + "rawSHA256": "a5197d7417efef5ba7dfa9c480516e26719e366adaeaeef49cbcfa9ae96285ee", + "displaySHA256": "a5197d7417efef5ba7dfa9c480516e26719e366adaeaeef49cbcfa9ae96285ee" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-browser-green2.tap", + "display": "room-browser-green2.tap", + "rawSHA256": "d00a8f2842a74adbd304020dd4536bd0328a8fe50d10462267673bb87b93a69e", + "displaySHA256": "d00a8f2842a74adbd304020dd4536bd0328a8fe50d10462267673bb87b93a69e" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-browser-red.tap", + "display": "room-browser-red.tap", + "rawSHA256": "0049cf34649eb250262a365dfa65f579f02d50cc1df4c0139c3e2c17c37d91a5", + "displaySHA256": "0049cf34649eb250262a365dfa65f579f02d50cc1df4c0139c3e2c17c37d91a5" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-check-green.tap", + "display": "room-check-green.tap", + "rawSHA256": "efd5ac58b3cc94f4b5d831b5372c96cf1390af2eaf4215a55c179b97ad72bb64", + "displaySHA256": "efd5ac58b3cc94f4b5d831b5372c96cf1390af2eaf4215a55c179b97ad72bb64" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-check-red.tap", + "display": "room-check-red.tap", + "rawSHA256": "b2917225a113bdf5a9cc2ff9efceb336f0cb8cbc4593bf8b4b2aa2292b025a9d", + "displaySHA256": "c41c959a330ff01db5941da91ee64e5ac398850710127920809ec0368b32026c" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-http-final.tap", + "display": "room-http-final.tap", + "rawSHA256": "25844a7bcca478617d95ec23460dd58aca539232d2eb3047d6537b5b4b5f3261", + "displaySHA256": "25844a7bcca478617d95ec23460dd58aca539232d2eb3047d6537b5b4b5f3261" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-http-green.tap", + "display": "room-http-green.tap", + "rawSHA256": "d2a309b9e9b9859f4c4ba4352cc70ecf70cdfded31c187b8361250071b508140", + "displaySHA256": "d2a309b9e9b9859f4c4ba4352cc70ecf70cdfded31c187b8361250071b508140" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-http-red.tap", + "display": "room-http-red.tap", + "rawSHA256": "9d642f087190461f71d26d8a2e5802ed329f9499a07eafa763eacc1b1a7cde6e", + "displaySHA256": "2c27ec9c7ee06484440705b2166f95042c8db357a2879930f55b68fb62557f72" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/room-http-validation-red.tap", + "display": "room-http-validation-red.tap", + "rawSHA256": "12ebb7b83c3f59bfefc5ea3964f40a868b2405661533a74f01644486baf6fe12", + "displaySHA256": "fbddc50f3cf24c42520b4b7fd7649c83f52409346cc177ddd946286ac712cc02" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/t9-rerun-1.tap", + "display": "t9-rerun-1.tap", + "rawSHA256": "221bae8b7e9e8dee198580e8c3985dc7cef88f2b049b2c2f536df67cbb0d7ac9", + "displaySHA256": "221bae8b7e9e8dee198580e8c3985dc7cef88f2b049b2c2f536df67cbb0d7ac9" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/t9-rerun-2.tap", + "display": "t9-rerun-2.tap", + "rawSHA256": "13cc40f64acd8311cc48d695a8f97c277ca115bf7e5dc72dbe3696b8144fc8be", + "displaySHA256": "13cc40f64acd8311cc48d695a8f97c277ca115bf7e5dc72dbe3696b8144fc8be" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/t9-rerun-3.tap", + "display": "t9-rerun-3.tap", + "rawSHA256": "d398bd81d1f86a599bd8da59d5d45c6a534d75f656046880042d687ca1b2f07f", + "displaySHA256": "d398bd81d1f86a599bd8da59d5d45c6a534d75f656046880042d687ca1b2f07f" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-auth.tap", + "display": "test-auth.tap", + "rawSHA256": "f91fc95a173339137f981e24fbf630acfde957e32c3cd71e28304532083c6a77", + "displaySHA256": "f91fc95a173339137f981e24fbf630acfde957e32c3cd71e28304532083c6a77" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-conductor.tap", + "display": "test-conductor.tap", + "rawSHA256": "c50ff64b098027711e20445f4c02612a9a2db0c316b17160811f8beadf183ad6", + "displaySHA256": "c50ff64b098027711e20445f4c02612a9a2db0c316b17160811f8beadf183ad6" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-config.tap", + "display": "test-config.tap", + "rawSHA256": "92ea8ce5e66d892fefacc76b87d140bcfb8c5a51dc77bdf4a47a6213ac5d2898", + "displaySHA256": "92ea8ce5e66d892fefacc76b87d140bcfb8c5a51dc77bdf4a47a6213ac5d2898" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-discord.tap", + "display": "test-discord.tap", + "rawSHA256": "9b482b7a3f0672c872923c06e71d5a88ff085a08170905a6cabe1d2b6fc283b6", + "displaySHA256": "9b482b7a3f0672c872923c06e71d5a88ff085a08170905a6cabe1d2b6fc283b6" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-extension-package.tap", + "display": "test-extension-package.tap", + "rawSHA256": "3aae7d4f584eb86c19a87fc2589ede0159617c1cc59d35e1e326ebf1830a4bfc", + "displaySHA256": "3aae7d4f584eb86c19a87fc2589ede0159617c1cc59d35e1e326ebf1830a4bfc" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-federation-acceptance.tap", + "display": "test-federation-acceptance.tap", + "rawSHA256": "674d778090229d0d9adcad089e8cbeaf811c5e797380655a57dce37ca7fc768e", + "displaySHA256": "674d778090229d0d9adcad089e8cbeaf811c5e797380655a57dce37ca7fc768e" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-foundation.tap", + "display": "test-foundation.tap", + "rawSHA256": "83dfaa21c4e4ad941088efab3f69e87ebd2f6bd3cc72ede938e21dc06da8a34f", + "displaySHA256": "83dfaa21c4e4ad941088efab3f69e87ebd2f6bd3cc72ede938e21dc06da8a34f" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-land-work.tap", + "display": "test-land-work.tap", + "rawSHA256": "3e2f8024027592e77790db2bbe039803060915ebf37c7b67f04071a7e83d20dc", + "displaySHA256": "3e2f8024027592e77790db2bbe039803060915ebf37c7b67f04071a7e83d20dc" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-push-check.tap", + "display": "test-push-check.tap", + "rawSHA256": "5d9a170308927264d212e3dd00e87463a21d55811cf9b4cb51dce74d6a10fea5", + "displaySHA256": "5d9a170308927264d212e3dd00e87463a21d55811cf9b4cb51dce74d6a10fea5" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-queue.tap", + "display": "test-queue.tap", + "rawSHA256": "ac1a44f25384f67386ebc0864b4d8c853bb3991eb5c75c5fc9b882841797850a", + "displaySHA256": "ac1a44f25384f67386ebc0864b4d8c853bb3991eb5c75c5fc9b882841797850a" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-release.tap", + "display": "test-release.tap", + "rawSHA256": "9f9dd11e2631a24ad55aaf7becc61965c592b00da08a4e72b98e0384d3a13ec7", + "displaySHA256": "9f9dd11e2631a24ad55aaf7becc61965c592b00da08a4e72b98e0384d3a13ec7" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/test-task.tap", + "display": "test-task.tap", + "rawSHA256": "a065947f07d70a4721b423da597968630bc8ec1659db14681af42bb3f974077d", + "displaySHA256": "a065947f07d70a4721b423da597968630bc8ec1659db14681af42bb3f974077d" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/webui-full.tap", + "display": "webui-full.tap", + "rawSHA256": "42fc6cc8d2d90ff8730a150942a16a12b3e1777c8b95c966a045c27c88c7777e", + "displaySHA256": "42fc6cc8d2d90ff8730a150942a16a12b3e1777c8b95c966a045c27c88c7777e" + }, + { + "raw": "/mnt/storage/scratch/tmp/KV9rHb/bus-rerun.tap", + "display": "bus-rerun.tap", + "rawSHA256": "3a1901f3e1b7f80a0faa72d07b156bd9b8480a3d5e16f74d0d76401e2f26d456", + "displaySHA256": "3a1901f3e1b7f80a0faa72d07b156bd9b8480a3d5e16f74d0d76401e2f26d456" + } +] diff --git a/agents/fethry/work/queue-266/evidence/rerun-summary.json b/agents/fethry/work/queue-266/evidence/rerun-summary.json new file mode 100644 index 000000000..e69e23fa0 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/rerun-summary.json @@ -0,0 +1,66 @@ +[ + { + "step": "t9-rerun-1", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/bus/tests/library-credential.test.mjs" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 120, + "exit": 0, + "seconds": 1.367, + "cleanupSignals": [] + }, + { + "step": "t9-rerun-2", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/bus/tests/library-credential.test.mjs" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 120, + "exit": 0, + "seconds": 1.367, + "cleanupSignals": [] + }, + { + "step": "t9-rerun-3", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/bus/tests/library-credential.test.mjs" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 120, + "exit": 0, + "seconds": 1.367, + "cleanupSignals": [] + }, + { + "step": "bus-rerun", + "command": [ + "node", + "--test", + "--test-reporter=tap", + "--test-concurrency=1", + "--test-timeout=30000", + "packages/bus/tests/" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 142.919, + "cleanupSignals": [] + } +] diff --git a/agents/fethry/work/queue-266/evidence/room-browser-final.tap b/agents/fethry/work/queue-266/evidence/room-browser-final.tap new file mode 100644 index 000000000..878ffc76d --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-browser-final.tap @@ -0,0 +1,74 @@ +TAP version 13 +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +ok 1 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 579.685618 + type: 'test' + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +ok 2 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 590.781432 + type: 'test' + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +not ok 3 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 477.156559 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:103:1' + failureType: 'testCodeFailure' + error: 'Uncaught: SyntaxError: missing ) after argument list' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:122:16) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +ok 4 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 446.373694 + type: 'test' + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +ok 5 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 467.224249 + type: 'test' + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +ok 6 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 429.347385 + type: 'test' + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +ok 7 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 481.360271 + type: 'test' + ... +# Subtest: C2-10c quiet members complete in an empty room, and Escape closes suggestions +ok 8 - C2-10c quiet members complete in an empty room, and Escape closes suggestions + --- + duration_ms: 431.26383 + type: 'test' + ... +# Subtest: C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft +ok 9 - C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft + --- + duration_ms: 445.816871 + type: 'test' + ... +1..9 +# tests 9 +# suites 0 +# pass 8 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 4457.473253 diff --git a/agents/fethry/work/queue-266/evidence/room-browser-final2.tap b/agents/fethry/work/queue-266/evidence/room-browser-final2.tap new file mode 100644 index 000000000..26bf99f1b --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-browser-final2.tap @@ -0,0 +1,64 @@ +TAP version 13 +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +ok 1 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 612.127424 + type: 'test' + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +ok 2 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 523.14041 + type: 'test' + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +ok 3 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 575.124776 + type: 'test' + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +ok 4 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 503.401984 + type: 'test' + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +ok 5 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 496.507579 + type: 'test' + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +ok 6 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 461.20871 + type: 'test' + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +ok 7 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 528.355937 + type: 'test' + ... +# Subtest: C2-10c quiet members complete in an empty room, and Escape closes suggestions +ok 8 - C2-10c quiet members complete in an empty room, and Escape closes suggestions + --- + duration_ms: 557.487691 + type: 'test' + ... +# Subtest: C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft +ok 9 - C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft + --- + duration_ms: 497.125002 + type: 'test' + ... +1..9 +# tests 9 +# suites 0 +# pass 9 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 4864.325898 diff --git a/agents/fethry/work/queue-266/evidence/room-browser-green.tap b/agents/fethry/work/queue-266/evidence/room-browser-green.tap new file mode 100644 index 000000000..b8314f4ec --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-browser-green.tap @@ -0,0 +1,72 @@ +TAP version 13 +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +ok 1 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 478.675099 + type: 'test' + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +ok 2 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 482.553437 + type: 'test' + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +not ok 3 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 3478.222635 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:101:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: window.__writes.length===1 && !document.querySelector("#chat-room-body").disabled: undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:113:3) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +ok 4 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 469.757127 + type: 'test' + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +not ok 5 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 3452.43392 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:128:1' + failureType: 'testCodeFailure' + error: "Uncaught (in promise) Error: window.__writes.length===1 && !document.querySelector('#chat-room-body').disabled: undefined" + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:134:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +ok 6 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 450.601494 + type: 'test' + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +ok 7 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 505.231021 + type: 'test' + ... +1..7 +# tests 7 +# suites 0 +# pass 5 +# fail 2 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 9422.414756 diff --git a/agents/fethry/work/queue-266/evidence/room-browser-green2.tap b/agents/fethry/work/queue-266/evidence/room-browser-green2.tap new file mode 100644 index 000000000..e05d2350f --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-browser-green2.tap @@ -0,0 +1,52 @@ +TAP version 13 +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +ok 1 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 461.849386 + type: 'test' + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +ok 2 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 457.623189 + type: 'test' + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +ok 3 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 458.150891 + type: 'test' + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +ok 4 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 608.340525 + type: 'test' + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +ok 5 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 497.894326 + type: 'test' + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +ok 6 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 460.087976 + type: 'test' + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +ok 7 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 600.261859 + type: 'test' + ... +1..7 +# tests 7 +# suites 0 +# pass 7 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 3647.620295 diff --git a/agents/fethry/work/queue-266/evidence/room-browser-red.tap b/agents/fethry/work/queue-266/evidence/room-browser-red.tap new file mode 100644 index 000000000..55ffc3a9a --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-browser-red.tap @@ -0,0 +1,131 @@ +TAP version 13 +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +not ok 1 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 3628.090522 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:77:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:78:29) + async Test.run (node:internal/test_runner/test:1409:7) + async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +not ok 2 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 429.638963 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:94:1' + failureType: 'testCodeFailure' + error: |- + Uncaught: TypeError: Cannot read properties of null (reading 'click') + at :1:42 + code: 'ERR_TEST_FAILURE' + stack: |- + :1:42 + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:97:3) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +not ok 3 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 3424.260935 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:101:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:102:28) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +not ok 4 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 3423.200884 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:118:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:119:22) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +not ok 5 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 3450.058918 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:128:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:129:34) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +not ok 6 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 3443.193406 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:142:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:143:22) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +not ok 7 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 3457.523072 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:150:1' + failureType: 'testCodeFailure' + error: 'Uncaught (in promise) Error: document.querySelector(".chat-room"): undefined' + code: 'ERR_TEST_FAILURE' + stack: |- + Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/browser.mjs:49:35) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:74:3) + async TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-browser.test.mjs:151:28) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +1..7 +# tests 7 +# suites 0 +# pass 0 +# fail 7 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 21368.466856 diff --git a/agents/fethry/work/queue-266/evidence/room-check-green.tap b/agents/fethry/work/queue-266/evidence/room-check-green.tap new file mode 100644 index 000000000..edd34707b --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-check-green.tap @@ -0,0 +1,22 @@ +TAP version 13 +# Subtest: C2-10c room.read carries exactly the thread check and current file last +ok 1 - C2-10c room.read carries exactly the thread check and current file last + --- + duration_ms: 66.788688 + type: 'test' + ... +# Subtest: C2-10c check hydration preserves unchecked rows and one broadcast with two addressees +ok 2 - C2-10c check hydration preserves unchecked rows and one broadcast with two addressees + --- + duration_ms: 14.902072 + type: 'test' + ... +1..2 +# tests 2 +# suites 0 +# pass 2 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 154.8326 diff --git a/agents/fethry/work/queue-266/evidence/room-check-red.tap b/agents/fethry/work/queue-266/evidence/room-check-red.tap new file mode 100644 index 000000000..f33ac499f --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-check-red.tap @@ -0,0 +1,55 @@ +TAP version 13 +# Subtest: C2-10c room.read carries exactly the thread check and current file last +not ok 1 - C2-10c room.read carries exactly the thread check and current file last + --- + duration_ms: 68.925074 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/tests/room-check.test.mjs:10:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly deep-equal: + + actual - expected + + + undefined + - { + - citations: [ + - { + - agent: null, + - file: 'e46ffb32a683035cf812aa05e1773ba95f2c9ee4', + - last: 'e46ffb32a683035cf812aa05e1773ba95f2c9ee4', + - scope: 'canon' + - } + - ] + - } + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: + citations: + 0: + scope: 'canon' + agent: ~ + file: 'e46ffb32a683035cf812aa05e1773ba95f2c9ee4' + last: 'e46ffb32a683035cf812aa05e1773ba95f2c9ee4' + operator: 'deepStrictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/bus/tests/room-check.test.mjs:20:10) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) + ... +# Subtest: C2-10c check hydration preserves unchecked rows and one broadcast with two addressees +ok 2 - C2-10c check hydration preserves unchecked rows and one broadcast with two addressees + --- + duration_ms: 16.111117 + type: 'test' + ... +1..2 +# tests 2 +# suites 0 +# pass 1 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 159.952195 diff --git a/agents/fethry/work/queue-266/evidence/room-http-final.tap b/agents/fethry/work/queue-266/evidence/room-http-final.tap new file mode 100644 index 000000000..18ae36c8d --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-http-final.tap @@ -0,0 +1,52 @@ +TAP version 13 +# Subtest: C2-10c seam exposes three fixed room calls without thread.messages fanout +ok 1 - C2-10c seam exposes three fixed room calls without thread.messages fanout + --- + duration_ms: 10.41166 + type: 'test' + ... +# Subtest: C2-10c HTTP preserves original send, member receipt and the last grouped paging id +ok 2 - C2-10c HTTP preserves original send, member receipt and the last grouped paging id + --- + duration_ms: 11.761026 + type: 'test' + ... +# Subtest: C2-10c room write fences and strict keys reject before transport +ok 3 - C2-10c room write fences and strict keys reject before transport + --- + duration_ms: 9.734065 + type: 'test' + ... +# Subtest: C2-10c all four room refusals are409 with fixed text, never transport prose +ok 4 - C2-10c all four room refusals are409 with fixed text, never transport prose + --- + duration_ms: 4.365649 + type: 'test' + ... +# Subtest: C2-10c malformed/lost write receipts are unknown and never retried +ok 5 - C2-10c malformed/lost write receipts are unknown and never retried + --- + duration_ms: 2.682212 + type: 'test' + ... +# Subtest: C2-10c room receipts reject coerced member keys and duplicate grouped ids +ok 6 - C2-10c room receipts reject coerced member keys and duplicate grouped ids + --- + duration_ms: 2.090283 + type: 'test' + ... +# Subtest: C2-10c granted-user room calls never borrow the owner transport +ok 7 - C2-10c granted-user room calls never borrow the owner transport + --- + duration_ms: 0.625202 + type: 'test' + ... +1..7 +# tests 7 +# suites 0 +# pass 7 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 144.565659 diff --git a/agents/fethry/work/queue-266/evidence/room-http-green.tap b/agents/fethry/work/queue-266/evidence/room-http-green.tap new file mode 100644 index 000000000..94d6f615f --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-http-green.tap @@ -0,0 +1,40 @@ +TAP version 13 +# Subtest: C2-10c seam exposes three fixed room calls without thread.messages fanout +ok 1 - C2-10c seam exposes three fixed room calls without thread.messages fanout + --- + duration_ms: 9.140924 + type: 'test' + ... +# Subtest: C2-10c HTTP preserves original send, member receipt and the last grouped paging id +ok 2 - C2-10c HTTP preserves original send, member receipt and the last grouped paging id + --- + duration_ms: 10.424582 + type: 'test' + ... +# Subtest: C2-10c room write fences and strict keys reject before transport +ok 3 - C2-10c room write fences and strict keys reject before transport + --- + duration_ms: 9.318333 + type: 'test' + ... +# Subtest: C2-10c all four room refusals are409 with fixed text, never transport prose +ok 4 - C2-10c all four room refusals are409 with fixed text, never transport prose + --- + duration_ms: 3.458143 + type: 'test' + ... +# Subtest: C2-10c malformed/lost write receipts are unknown and never retried +ok 5 - C2-10c malformed/lost write receipts are unknown and never retried + --- + duration_ms: 3.395395 + type: 'test' + ... +1..5 +# tests 5 +# suites 0 +# pass 5 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 135.694931 diff --git a/agents/fethry/work/queue-266/evidence/room-http-red.tap b/agents/fethry/work/queue-266/evidence/room-http-red.tap new file mode 100644 index 000000000..3fc6e3e20 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-http-red.tap @@ -0,0 +1,127 @@ +TAP version 13 +# Subtest: C2-10c seam exposes three fixed room calls without thread.messages fanout +not ok 1 - C2-10c seam exposes three fixed room calls without thread.messages fanout + --- + duration_ms: 8.731172 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:34:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly equal: + + actual - expected + + + 'undefined' + - 'function' + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 'function' + actual: 'undefined' + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:37:12) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) + ... +# Subtest: C2-10c HTTP preserves original send, member receipt and the last grouped paging id +not ok 2 - C2-10c HTTP preserves original send, member receipt and the last grouped paging id + --- + duration_ms: 9.016525 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:44:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly equal: + + 404 !== 200 + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 200 + actual: 404 + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:48:10) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c room write fences and strict keys reject before transport +not ok 3 - C2-10c room write fences and strict keys reject before transport + --- + duration_ms: 3.141918 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:62:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly equal: + + 404 !== 400 + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 400 + actual: 404 + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:66:12) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c all four room refusals are409 with fixed text, never transport prose +not ok 4 - C2-10c all four room refusals are409 with fixed text, never transport prose + --- + duration_ms: 1.798433 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:75:1' + failureType: 'testCodeFailure' + error: |- + unknown-addressee + + 404 !== 409 + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 409 + actual: 404 + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:80:12) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c malformed/lost write receipts are unknown and never retried +not ok 5 - C2-10c malformed/lost write receipts are unknown and never retried + --- + duration_ms: 1.788338 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:85:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly equal: + + 404 !== 503 + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 503 + actual: 404 + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:90:12) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +1..5 +# tests 5 +# suites 0 +# pass 0 +# fail 5 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 124.767975 diff --git a/agents/fethry/work/queue-266/evidence/room-http-validation-red.tap b/agents/fethry/work/queue-266/evidence/room-http-validation-red.tap new file mode 100644 index 000000000..f3ea9a2c8 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/room-http-validation-red.tap @@ -0,0 +1,69 @@ +TAP version 13 +# Subtest: C2-10c seam exposes three fixed room calls without thread.messages fanout +ok 1 - C2-10c seam exposes three fixed room calls without thread.messages fanout + --- + duration_ms: 9.95559 + type: 'test' + ... +# Subtest: C2-10c HTTP preserves original send, member receipt and the last grouped paging id +ok 2 - C2-10c HTTP preserves original send, member receipt and the last grouped paging id + --- + duration_ms: 11.053371 + type: 'test' + ... +# Subtest: C2-10c room write fences and strict keys reject before transport +ok 3 - C2-10c room write fences and strict keys reject before transport + --- + duration_ms: 9.160608 + type: 'test' + ... +# Subtest: C2-10c all four room refusals are409 with fixed text, never transport prose +ok 4 - C2-10c all four room refusals are409 with fixed text, never transport prose + --- + duration_ms: 4.022295 + type: 'test' + ... +# Subtest: C2-10c malformed/lost write receipts are unknown and never retried +ok 5 - C2-10c malformed/lost write receipts are unknown and never retried + --- + duration_ms: 2.737076 + type: 'test' + ... +# Subtest: C2-10c room receipts reject coerced member keys and duplicate grouped ids +not ok 6 - C2-10c room receipts reject coerced member keys and duplicate grouped ids + --- + duration_ms: 1.75248 + type: 'test' + location: '/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:95:1' + failureType: 'testCodeFailure' + error: |- + Expected values to be strictly equal: + + 200 !== 503 + + code: 'ERR_ASSERTION' + name: 'AssertionError' + expected: 503 + actual: 200 + operator: 'strictEqual' + stack: |- + TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/packages/webui/tests/room-http.test.mjs:99:10) + process.processTicksAndRejections (node:internal/process/task_queues:104:5) + async Test.run (node:internal/test_runner/test:1409:7) + async Test.processPendingSubtests (node:internal/test_runner/test:974:7) + ... +# Subtest: C2-10c granted-user room calls never borrow the owner transport +ok 7 - C2-10c granted-user room calls never borrow the owner transport + --- + duration_ms: 0.878763 + type: 'test' + ... +1..7 +# tests 7 +# suites 0 +# pass 6 +# fail 1 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 141.250822 diff --git a/agents/fethry/work/queue-266/evidence/scripts-summary.json b/agents/fethry/work/queue-266/evidence/scripts-summary.json new file mode 100644 index 000000000..1bc0059a1 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/scripts-summary.json @@ -0,0 +1,146 @@ +[ + { + "step": "test-auth", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-auth.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 0.866, + "cleanupSignals": [] + }, + { + "step": "test-conductor", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-conductor.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 7.53, + "cleanupSignals": [] + }, + { + "step": "test-config", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-config.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 2.72, + "cleanupSignals": [] + }, + { + "step": "test-discord", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-discord.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 8.131, + "cleanupSignals": [] + }, + { + "step": "test-extension-package", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-extension-package.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 1.467, + "cleanupSignals": [] + }, + { + "step": "test-federation-acceptance", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-federation-acceptance.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 3.972, + "cleanupSignals": [] + }, + { + "step": "test-foundation", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-foundation.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 38.592, + "cleanupSignals": [] + }, + { + "step": "test-land-work", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-land-work.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 12.039, + "cleanupSignals": [] + }, + { + "step": "test-push-check", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-push-check.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 38.944, + "cleanupSignals": [] + }, + { + "step": "test-queue", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-queue.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 21.708, + "cleanupSignals": [] + }, + { + "step": "test-release", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-release.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 2.92, + "cleanupSignals": [] + }, + { + "step": "test-task", + "command": [ + "bash", + "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-task.sh" + ], + "cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266", + "outerSeconds": 1200, + "exit": 0, + "seconds": 13.793, + "cleanupSignals": [] + } +] diff --git a/agents/fethry/work/queue-266/evidence/t9-rerun-1.tap b/agents/fethry/work/queue-266/evidence/t9-rerun-1.tap new file mode 100644 index 000000000..5450446e1 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/t9-rerun-1.tap @@ -0,0 +1,46 @@ +TAP version 13 +# Subtest: C2-03b T6: the slot before any chief evidence, then the listed chief's live grant +ok 1 - C2-03b T6: the slot before any chief evidence, then the listed chief's live grant + --- + duration_ms: 27.654269 + type: 'test' + ... +# Subtest: C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended +ok 2 - C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended + --- + duration_ms: 293.65964 + type: 'test' + ... +# Subtest: C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again +ok 3 - C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again + --- + duration_ms: 34.60293 + type: 'test' + ... +# Subtest: C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant +ok 4 - C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant + --- + duration_ms: 30.656128 + type: 'test' + ... +# Subtest: C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses +ok 5 - C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses + --- + duration_ms: 16.276807 + type: 'test' + ... +# Subtest: C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 +ok 6 - C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 + --- + duration_ms: 789.168747 + type: 'test' + ... +1..6 +# tests 6 +# suites 0 +# pass 6 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 1315.368631 diff --git a/agents/fethry/work/queue-266/evidence/t9-rerun-2.tap b/agents/fethry/work/queue-266/evidence/t9-rerun-2.tap new file mode 100644 index 000000000..2b0188468 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/t9-rerun-2.tap @@ -0,0 +1,46 @@ +TAP version 13 +# Subtest: C2-03b T6: the slot before any chief evidence, then the listed chief's live grant +ok 1 - C2-03b T6: the slot before any chief evidence, then the listed chief's live grant + --- + duration_ms: 27.978617 + type: 'test' + ... +# Subtest: C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended +ok 2 - C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended + --- + duration_ms: 304.610774 + type: 'test' + ... +# Subtest: C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again +ok 3 - C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again + --- + duration_ms: 33.464243 + type: 'test' + ... +# Subtest: C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant +ok 4 - C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant + --- + duration_ms: 30.002925 + type: 'test' + ... +# Subtest: C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses +ok 5 - C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses + --- + duration_ms: 16.524439 + type: 'test' + ... +# Subtest: C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 +ok 6 - C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 + --- + duration_ms: 754.840215 + type: 'test' + ... +1..6 +# tests 6 +# suites 0 +# pass 6 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 1293.310491 diff --git a/agents/fethry/work/queue-266/evidence/t9-rerun-3.tap b/agents/fethry/work/queue-266/evidence/t9-rerun-3.tap new file mode 100644 index 000000000..117f86448 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/t9-rerun-3.tap @@ -0,0 +1,46 @@ +TAP version 13 +# Subtest: C2-03b T6: the slot before any chief evidence, then the listed chief's live grant +ok 1 - C2-03b T6: the slot before any chief evidence, then the listed chief's live grant + --- + duration_ms: 34.452051 + type: 'test' + ... +# Subtest: C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended +ok 2 - C2-03b T7: a chief revoked through grants.revoke or fired through instance.fire refuses, and the fallback stays ended + --- + duration_ms: 299.162474 + type: 'test' + ... +# Subtest: C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again +ok 3 - C2-03b T7 choice checks: delisted, a fire under way and held each refuse; a rehire lists the chief again + --- + duration_ms: 35.484814 + type: 'test' + ... +# Subtest: C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant +ok 4 - C2-03b T8: a chief grant on another project ends the fallback, and two listed chiefs refuse library-fetch-no-grant + --- + duration_ms: 31.417755 + type: 'test' + ... +# Subtest: C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses +ok 5 - C2-03b departure (sage-2928): with no chief entry, any Gitea grant evidence refuses + --- + duration_ms: 16.905839 + type: 'test' + ... +# Subtest: C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 +ok 6 - C2-03b T9 runtime: the chief's store file and user, then a real revoke that runs no git with the slot at 0000 + --- + duration_ms: 766.473551 + type: 'test' + ... +1..6 +# tests 6 +# suites 0 +# pass 6 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 1302.772185 diff --git a/agents/fethry/work/queue-266/evidence/test-auth.tap b/agents/fethry/work/queue-266/evidence/test-auth.tap new file mode 100644 index 000000000..ac2287606 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-auth.tap @@ -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 diff --git a/agents/fethry/work/queue-266/evidence/test-conductor.tap b/agents/fethry/work/queue-266/evidence/test-conductor.tap new file mode 100644 index 000000000..2597059f3 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-conductor.tap @@ -0,0 +1,23 @@ +On branch fethry/row266 +Your branch is up to date with 'origin/fethry/row266'. + +nothing to commit, working tree clean +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 diff --git a/agents/fethry/work/queue-266/evidence/test-config.tap b/agents/fethry/work/queue-266/evidence/test-config.tap new file mode 100644 index 000000000..6455ecc69 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-config.tap @@ -0,0 +1,57 @@ +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 valid console.sso loads and is in the output +OK console.sso HS256 alg exits 2 naming the path (exit 2) +OK console.sso alg none exits 2 naming the path (exit 2) +OK console.sso missing slot field exits 2 naming the path (exit 2) +OK console.sso slot name outside the pattern exits 2 naming the path (exit 2) +OK unknown key under console exits 2 naming the path (exit 2) +OK valid federation key loads and is in the output +OK federation unknown sub-key exits 2 naming the key (exit 2) +OK federation peer unknown sub-key exits 2 naming the key (exit 2) +OK federation peer origin over http exits 2 naming the key (exit 2) +OK federation peer origin with a path exits 2 naming the key (exit 2) +OK federation peer origin with userinfo exits 2 naming the key (exit 2) +OK federation peer id equal to self exits 2 naming the key (exit 2) +OK federation peer label empty exits 2 naming the key (exit 2) +OK federation not an object exits 2 naming the key (exit 2) +OK federation self pattern exits 2 naming the key (exit 2) +OK federation peers not an array exits 2 naming the key (exit 2) +OK federation peer not an object exits 2 naming the key (exit 2) +OK federation peer id pattern exits 2 naming the key (exit 2) +OK federation peer label over 80 characters exits 2 naming the key (exit 2) +OK federation duplicate peer id exits 2 naming the key (exit 2) +OK federation peer origin with a trailing slash exits 2 naming the key (exit 2) +OK federation self missing exits 2 naming the key (exit 2) +OK federation peer id missing exits 2 naming the key (exit 2) +OK federation peer label missing exits 2 naming the key (exit 2) +OK config without federation loads and has no federation output +OK config without console loads with unchanged output +OK compactionReadBytes 8388608 loads and is in the output as written +OK compactionReadBytes "x" loads and is in the output as written +OK compactionStreams 2048 loads and is in the output as written +OK compactionStreams "x" loads and is in the output as written +OK failed validation modified nothing + +selftest: 55 passed, 0 failed diff --git a/agents/fethry/work/queue-266/evidence/test-discord.tap b/agents/fethry/work/queue-266/evidence/test-discord.tap new file mode 100644 index 000000000..048c6bdd7 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-discord.tap @@ -0,0 +1,86 @@ +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/processing.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/library-seat.test.mjs +OK syntax: packages/discord/tests/notify.test.mjs +OK syntax: packages/discord/tests/offline-check.test.mjs +OK syntax: packages/discord/tests/processing-stop.test.mjs +OK syntax: packages/discord/tests/processing.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 200) +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: 82 passed, 0 failed diff --git a/agents/fethry/work/queue-266/evidence/test-extension-package.tap b/agents/fethry/work/queue-266/evidence/test-extension-package.tap new file mode 100644 index 000000000..3482db9ab --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-extension-package.tap @@ -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 +/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row266/scripts/test-extension-package.sh: line 14: 2236844 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 diff --git a/agents/fethry/work/queue-266/evidence/test-federation-acceptance.tap b/agents/fethry/work/queue-266/evidence/test-federation-acceptance.tap new file mode 100644 index 000000000..2b06430ae --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-federation-acceptance.tap @@ -0,0 +1,10 @@ +✔ FED R7 scratch two-instance acceptance (3582.728896ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 1 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 3676.59229 +R7 cleanup: no child groups, ports or sockets remain; no units created diff --git a/agents/fethry/work/queue-266/evidence/test-foundation.tap b/agents/fethry/work/queue-266/evidence/test-foundation.tap new file mode 100644 index 000000000..6338e1e6d --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-foundation.tap @@ -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 diff --git a/agents/fethry/work/queue-266/evidence/test-land-work.tap b/agents/fethry/work/queue-266/evidence/test-land-work.tap new file mode 100644 index 000000000..0027f3346 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-land-work.tap @@ -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 diff --git a/agents/fethry/work/queue-266/evidence/test-push-check.tap b/agents/fethry/work/queue-266/evidence/test-push-check.tap new file mode 100644 index 000000000..990d59ad4 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-push-check.tap @@ -0,0 +1,7 @@ +PASS push-check 38 checks +KILLED skip-hash +KILLED accept-changes +KILLED earlier-round +KILLED working-tree +KILLED no-row +KILLED skip-nul-scan diff --git a/agents/fethry/work/queue-266/evidence/test-queue.tap b/agents/fethry/work/queue-266/evidence/test-queue.tap new file mode 100644 index 000000000..7fcf2d008 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-queue.tap @@ -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/.t3/worktrees/mosaic-stack/fethry-row266) is not the queue's canonical root (/mnt/storage/src/mosaic-stack) + +queue suite: 28 passed, 0 failed diff --git a/agents/fethry/work/queue-266/evidence/test-release.tap b/agents/fethry/work/queue-266/evidence/test-release.tap new file mode 100644 index 000000000..31f8ad7b5 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-release.tap @@ -0,0 +1,17 @@ +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) +OK compose network made under the run's project and removed after the run + +selftest: 15 passed, 0 failed diff --git a/agents/fethry/work/queue-266/evidence/test-task.tap b/agents/fethry/work/queue-266/evidence/test-task.tap new file mode 100644 index 000000000..4ae48aa63 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/test-task.tap @@ -0,0 +1,97 @@ +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 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 +skip live provider cases (row 244: no provider call in the gate) +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 +skip live provider cases (row 244: no provider call in the gate) +OK no agent identity on headless run +OK compose network made under the run's project and removed after the run + +selftest: 92 passed, 0 failed diff --git a/agents/fethry/work/queue-266/evidence/webui-full.tap b/agents/fethry/work/queue-266/evidence/webui-full.tap new file mode 100644 index 000000000..f38768f70 --- /dev/null +++ b/agents/fethry/work/queue-266/evidence/webui-full.tap @@ -0,0 +1,2779 @@ +TAP version 13 +# Subtest: row 194 T16 Settings Agents: unavailable read-only, launch follows its request, confirms, reason and refusal +ok 1 - row 194 T16 Settings Agents: unavailable read-only, launch follows its request, confirms, reason and refusal + --- + duration_ms: 13097.894832 + type: 'test' + ... +# Subtest: row 256 T7 T8 the human page offers Delete on a creative instance, the tester page never does +ok 2 - row 256 T7 T8 the human page offers Delete on a creative instance, the tester page never does + --- + duration_ms: 583.000408 + type: 'test' + ... +# Subtest: row 194 T16: each agent action makes one call with only its keys, logs the user and answers the request +ok 3 - row 194 T16: each agent action makes one call with only its keys, logs the user and answers the request + --- + duration_ms: 18.518577 + type: 'test' + ... +# Subtest: row 194 T16: the boundary refuses before any bus call +ok 4 - row 194 T16: the boundary refuses before any bus call + --- + duration_ms: 8.730979 + type: 'test' + ... +# Subtest: row 194 T16: read-only when send is off or no writer is wired; no route has a --send exception +ok 5 - row 194 T16: read-only when send is off or no writer is wired; no route has a --send exception + --- + duration_ms: 4.459426 + type: 'test' + ... +# Subtest: row 194 T16: a bus refusal names its reason and nothing changed; an unknown outcome or a bad shape is never retried +ok 6 - row 194 T16: a bus refusal names its reason and nothing changed; an unknown outcome or a bad shape is never retried + --- + duration_ms: 3.310318 + type: 'test' + ... +# Subtest: row 194 T16: the request read takes one id, adds the refusal reason and refuses an unexpected shape +ok 7 - row 194 T16: the request read takes one id, adds the refusal reason and refuses an unexpected shape + --- + duration_ms: 5.033091 + type: 'test' + ... +# Subtest: row 194 T16: delete joins add and change on /api/instances with only revision, instance and op +ok 8 - row 194 T16: delete joins add and change on /api/instances with only revision, instance and op + --- + duration_ms: 2.370956 + type: 'test' + ... +# Subtest: row 194 T16 D4.1: the tester listener launches, terminates and reads requests; regenerate, veto and delete are refused with no call +ok 9 - row 194 T16 D4.1: the tester listener launches, terminates and reads requests; regenerate, veto and delete are refused with no call + --- + duration_ms: 4.129549 + type: 'test' + ... +# Subtest: row 194 N5: agents.js is served as JavaScript and index.html loads it once +ok 10 - row 194 N5: agents.js is served as JavaScript and index.html loads it once + --- + duration_ms: 1.357167 + type: 'test' + ... +# Subtest: row 239 T6: a delete closed -revoked says the tokens may already be revoked, and outcome-unknown-revoked is an open outcome +ok 11 - row 239 T6: a delete closed -revoked says the tokens may already be revoked, and outcome-unknown-revoked is an open outcome + --- + duration_ms: 2.284587 + type: 'test' + ... +# Subtest: Q169 the signed-in human names a seat and stops the assistant, one bus call each, logged with the user +ok 12 - Q169 the signed-in human names a seat and stops the assistant, one bus call each, logged with the user + --- + duration_ms: 16.048792 + type: 'test' + ... +# Subtest: Q169 the name and stop routes need send on, the public name, the user, the exact Origin and same-origin Fetch Metadata +ok 13 - Q169 the name and stop routes need send on, the public name, the user, the exact Origin and same-origin Fetch Metadata + --- + duration_ms: 8.469417 + type: 'test' + ... +# Subtest: Q169 the name and stop routes take JSON within 4 KiB and only their own keys, all text +ok 14 - Q169 the name and stop routes take JSON within 4 KiB and only their own keys, all text + --- + duration_ms: 5.209864 + type: 'test' + ... +# Subtest: Row 167 a null body on the name and stop routes is 400 invalid-request with no write, and the next request is answered +ok 15 - Row 167 a null body on the name and stop routes is 400 invalid-request with no write, and the next request is answered + --- + duration_ms: 3.787444 + type: 'test' + ... +# Subtest: Q169 a bus refusal says nothing changed; a lost or odd answer says the change may have been made +ok 16 - Q169 a bus refusal says nothing changed; a lost or odd answer says the change may have been made + --- + duration_ms: 9.511353 + type: 'test' + ... +# Subtest: Q169 the names read is a bus read like the others +ok 17 - Q169 the names read is a bus read like the others + --- + duration_ms: 1.376585 + type: 'test' + ... +# Subtest: 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 +ok 18 - 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 + --- + duration_ms: 2821.443538 + type: 'test' + ... +# Subtest: a Seen click while a Board read is in flight waits for that read, then posts +ok 19 - a Seen click while a Board read is in flight waits for that read, then posts + --- + duration_ms: 1018.774291 + type: 'test' + ... +# Subtest: 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 +ok 20 - 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 + --- + duration_ms: 4838.234617 + type: 'test' + ... +# Subtest: browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback +ok 21 - browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback + --- + duration_ms: 1075.084757 + type: 'test' + ... +# Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286} +# Subtest: served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures +ok 22 - served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures + --- + duration_ms: 1177.796037 + type: 'test' + ... +# Subtest: the README says a refused field table names the file or the key at fault, never a path +ok 23 - the README says a refused field table names the file or the key at fault, never a path + --- + duration_ms: 1.243599 + type: 'test' + ... +# Subtest: S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes +ok 24 - S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes + --- + duration_ms: 2799.794273 + type: 'test' + ... +# Subtest: bus routes serve the four reads from the reader view, unescaped JSON for the page to escape +ok 25 - bus routes serve the four reads from the reader view, unescaped JSON for the page to escape + --- + duration_ms: 62.507729 + type: 'test' + ... +# Subtest: decisions route serves the roles and recent lists from the reader view +ok 26 - decisions route serves the roles and recent lists from the reader view + --- + duration_ms: 32.836586 + type: 'test' + ... +# Subtest: credentials route serves the broker credential status from the reader view +ok 27 - credentials route serves the broker credential status from the reader view + --- + duration_ms: 11.965848 + type: 'test' + ... +# Subtest: replies route serves the replies to one message from the reader view +ok 28 - replies route serves the replies to one message from the reader view + --- + duration_ms: 34.883521 + type: 'test' + ... +# Subtest: bus routes are GET-only, have no write verb, and keep the same-origin checks +ok 29 - bus routes are GET-only, have no write verb, and keep the same-origin checks + --- + duration_ms: 50.375569 + type: 'test' + ... +# Subtest: bus refusals map to statuses and never carry a path or a stack +ok 30 - bus refusals map to statuses and never carry a path or a stack + --- + duration_ms: 24.52687 + type: 'test' + ... +# Subtest: humanCall speaks the human transport protocol without blocking the server +ok 31 - humanCall speaks the human transport protocol without blocking the server + --- + duration_ms: 1642.868483 + type: 'test' + ... +# Subtest: busReader takes --business, else the live bus host, else refuses +ok 32 - busReader takes --business, else the live bus host, else refuses + --- + duration_ms: 145.447693 + type: 'test' + ... +# Subtest: humanCall kills a transport that runs past its timeout +ok 33 - humanCall kills a transport that runs past its timeout + --- + duration_ms: 529.201827 + type: 'test' + ... +# Subtest: serve refuses a --business value that is not a business id +ok 34 - serve refuses a --business value that is not a business id + --- + duration_ms: 274.641706 + type: 'test' + ... +# Subtest: WebUI channel off returns 503 and named recovery for every chat route without a chat operation +ok 35 - WebUI channel off returns 503 and named recovery for every chat route without a chat operation + --- + duration_ms: 37.444162 + type: 'test' + ... +# Subtest: WebUI only selection keeps web chat enabled while retaining the old read envelope +ok 36 - WebUI only selection keeps web chat enabled while retaining the old read envelope + --- + duration_ms: 1.791511 + type: 'test' + ... +# Subtest: WebUI channel-disabled recovery text is fixed and never echoes transport text +ok 37 - WebUI channel-disabled recovery text is fixed and never echoes transport text + --- + duration_ms: 1.21259 + type: 'test' + ... +# Subtest: chat browser: list/create named projects and threads, hostile labels inert and no implicit writes +ok 38 - chat browser: list/create named projects and threads, hostile labels inert and no implicit writes + --- + duration_ms: 544.409623 + type: 'test' + ... +# Subtest: chat browser: thread drafts, receipts and cursor history stay isolated; refresh never writes +ok 39 - chat browser: thread drafts, receipts and cursor history stay isolated; refresh never writes + --- + duration_ms: 610.200359 + type: 'test' + ... +# Subtest: chat browser: uncertain writes retain draft, ownership refusal clears it, read-only cannot send +ok 40 - chat browser: uncertain writes retain draft, ownership refusal clears it, read-only cannot send + --- + duration_ms: 633.249879 + type: 'test' + ... +# Subtest: chat browser: a late read from A cannot paint B; sign-out clears private state and stops reads +ok 41 - chat browser: a late read from A cannot paint B; sign-out clears private state and stops reads + --- + duration_ms: 890.333831 + type: 'test' + ... +# Subtest: chat browser: page forward and deduplicate replies; pending and byte-limit submissions do not duplicate +ok 42 - chat browser: page forward and deduplicate replies; pending and byte-limit submissions do not duplicate + --- + duration_ms: 474.968964 + type: 'test' + ... +# Subtest: chat browser: scrolled history stays put, New messages and an own send return to the tail +ok 43 - chat browser: scrolled history stays put, New messages and an own send return to the tail + --- + duration_ms: 508.469944 + type: 'test' + ... +# Subtest: chat browser: automatic polling follows a reply without a POST or a lost draft +ok 44 - chat browser: automatic polling follows a reply without a POST or a lost draft + --- + duration_ms: 10495.06151 + type: 'test' + ... +# Subtest: chat browser: display stays bounded while every forward page remains reachable +ok 45 - chat browser: display stays bounded while every forward page remains reachable + --- + duration_ms: 497.635052 + type: 'test' + ... +# Subtest: chat browser: a confirmed visible message replaces its pending receipt; malformed receipts stay unknown +ok 46 - chat browser: a confirmed visible message replaces its pending receipt; malformed receipts stay unknown + --- + duration_ms: 578.576062 + type: 'test' + ... +# Subtest: chat browser: a refusal elsewhere forgets private chat drafts +ok 47 - chat browser: a refusal elsewhere forgets private chat drafts + --- + duration_ms: 590.131156 + type: 'test' + ... +# Subtest: chat browser: a late project creation receipt cannot navigate away from another thread +ok 48 - chat browser: a late project creation receipt cannot navigate away from another thread + --- + duration_ms: 546.008352 + type: 'test' + ... +# Subtest: C2-09a picker: no silent choice, duplicate hostile labels stay inert, selection survives refresh and reaches POST +ok 49 - C2-09a picker: no silent choice, duplicate hostile labels stay inert, selection survives refresh and reaches POST + --- + duration_ms: 515.395016 + type: 'test' + ... +# Subtest: C2-09a picker: metadata failure, empty set and removed pick explain disabled state and recover without switching +ok 50 - C2-09a picker: metadata failure, empty set and removed pick explain disabled state and recover without switching + --- + duration_ms: 541.15963 + type: 'test' + ... +# Subtest: C2-09a picker: a single instance is chosen explicitly but read-only mode cannot create a thread +ok 51 - C2-09a picker: a single instance is chosen explicitly but read-only mode cannot create a thread + --- + duration_ms: 433.900946 + type: 'test' + ... +# Subtest: 264e chooser: two sessions keep drafts, cursors, deep links and counts independent +ok 52 - 264e chooser: two sessions keep drafts, cursors, deep links and counts independent + --- + duration_ms: 537.393858 + type: 'test' + ... +# Subtest: 264e clear confirmation and status never resend, force-stop or change selection +ok 53 - 264e clear confirmation and status never resend, force-stop or change selection + --- + duration_ms: 502.542087 + type: 'test' + ... +# Subtest: 264e new session keeps its operation key after an unknown response and uses no implicit open +ok 54 - 264e new session keeps its operation key after an unknown response and uses no implicit open + --- + duration_ms: 618.393752 + type: 'test' + ... +# Subtest: 264e cancel shows before/after retirement and never starts or replays work +ok 55 - 264e cancel shows before/after retirement and never starts or replays work + --- + duration_ms: 475.922005 + type: 'test' + ... +# Subtest: 272 B1: a bad-session deep link preserves the draft and lost clear operation on A +ok 56 - 272 B1: a bad-session deep link preserves the draft and lost clear operation on A + --- + duration_ms: 599.116246 + type: 'test' + ... +# Subtest: C2-09a metadata uses the human listener bus, projects labels only and refuses unauthenticated reads +ok 57 - C2-09a metadata uses the human listener bus, projects labels only and refuses unauthenticated reads + --- + duration_ms: 17.344103 + type: 'test' + ... +# Subtest: C2-09a metadata uses the private tester listener own bus and no human transport +ok 58 - C2-09a metadata uses the private tester listener own bus and no human transport + --- + duration_ms: 2.990297 + type: 'test' + ... +# Subtest: C2-09a metadata refuses missing or malformed reads and never echoes untrusted fields +ok 59 - C2-09a metadata refuses missing or malformed reads and never echoes untrusted fields + --- + duration_ms: 3.399352 + type: 'test' + ... +# Subtest: C2-09a metadata stays behind the SSO session check and a GET never refreshes session activity +ok 60 - C2-09a metadata stays behind the SSO session check and a GET never refreshes session activity + --- + duration_ms: 1.987682 + type: 'test' + ... +# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links +ok 61 - chat replies: free text, cites with badges, the agent label, changed since and safe links + --- + duration_ms: 511.028684 + type: 'test' + ... +# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code +ok 62 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code + --- + duration_ms: 545.566417 + type: 'test' + ... +# Subtest: chat replies: a read-only Console shows the notice with Revert disabled +ok 63 - chat replies: a read-only Console shows the notice with Revert disabled + --- + duration_ms: 467.979676 + type: 'test' + ... +# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away +ok 64 - chat status line: served commit and age, divergence, fetch error and the problems one click away + --- + duration_ms: 481.923434 + type: 'test' + ... +# Subtest: chat status line: limits when the status carries them, no problems, and refusals +ok 65 - chat status line: limits when the status carries them, no problems, and refusals + --- + duration_ms: 770.41944 + type: 'test' + ... +# Subtest: chat status line: a project with no repository link reads no library status +ok 66 - chat status line: a project with no repository link reads no library status + --- + duration_ms: 471.243973 + type: 'test' + ... +# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys +ok 67 - chat status line: unreadable reply limits show their problem and both fallback keys + --- + duration_ms: 483.926058 + type: 'test' + ... +# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked +ok 68 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked + --- + duration_ms: 512.893834 + type: 'test' + ... +# Subtest: chat status line: an invalid library mapping remains visible for diagnosis +ok 69 - chat status line: an invalid library mapping remains visible for diagnosis + --- + duration_ms: 472.686904 + type: 'test' + ... +# Subtest: chat replies: a checked notice-shaped agent message is plain text with no Revert +ok 70 - chat replies: a checked notice-shaped agent message is plain text with no Revert + --- + duration_ms: 470.668885 + type: 'test' + ... +# Subtest: chat replies: owner-only without a sent field is a definite Revert refusal +ok 71 - chat replies: owner-only without a sent field is a definite Revert refusal + --- + duration_ms: 552.449372 + type: 'test' + ... +# Subtest: 272 fallback: granted legacy route keeps default history, send and open without session controls +ok 72 - 272 fallback: granted legacy route keeps default history, send and open without session controls + --- + duration_ms: 569.855166 + type: 'test' + ... +# Subtest: 272 fallback guard: granted explicit-session route refuses without default history or writes +ok 73 - 272 fallback guard: granted explicit-session route refuses without default history or writes + --- + duration_ms: 450.148592 + type: 'test' + ... +# Subtest: 272 fallback guard: human-required catalog failure never enables default-thread access +ok 74 - 272 fallback guard: human-required catalog failure never enables default-thread access + --- + duration_ms: 481.840714 + type: 'test' + ... +# Subtest: 272 fallback guard: timeout catalog failure never enables default-thread access +ok 75 - 272 fallback guard: timeout catalog failure never enables default-thread access + --- + duration_ms: 443.424788 + type: 'test' + ... +# Subtest: 272 fallback guard: no-bus-host catalog failure never enables default-thread access +ok 76 - 272 fallback guard: no-bus-host catalog failure never enables default-thread access + --- + duration_ms: 449.337063 + type: 'test' + ... +# Subtest: 272 fallback guard: malformed catalog failure never enables default-thread access +ok 77 - 272 fallback guard: malformed catalog failure never enables default-thread access + --- + duration_ms: 457.213363 + type: 'test' + ... +# Subtest: 272 fallback guard: owner route retains chooser and explicit default-session addressing +ok 78 - 272 fallback guard: owner route retains chooser and explicit default-session addressing + --- + duration_ms: 472.79003 + type: 'test' + ... +# Subtest: chat reads map only fixed verbs, strict forward paging and pure GET +ok 79 - chat reads map only fixed verbs, strict forward paging and pure GET + --- + duration_ms: 23.417618 + type: 'test' + ... +# Subtest: chat refuses malformed and repeated query/id values before transport +ok 80 - chat refuses malformed and repeated query/id values before transport + --- + duration_ms: 5.694671 + type: 'test' + ... +# Subtest: chat project.create: one verified write, fixed identity/class and private log +ok 81 - chat project.create: one verified write, fixed identity/class and private log + --- + duration_ms: 2.246724 + type: 'test' + ... +# Subtest: chat project.create: each existing Console write fence makes zero bus calls +ok 82 - chat project.create: each existing Console write fence makes zero bus calls + --- + duration_ms: 6.966119 + type: 'test' + ... +# Subtest: chat project.create: refusal or lost/malformed receipt never retries or invents success +ok 83 - chat project.create: refusal or lost/malformed receipt never retries or invents success + --- + duration_ms: 3.829434 + type: 'test' + ... +# Subtest: chat thread.create: one verified write, fixed identity/class and private log +ok 84 - chat thread.create: one verified write, fixed identity/class and private log + --- + duration_ms: 1.306222 + type: 'test' + ... +# Subtest: chat thread.create: each existing Console write fence makes zero bus calls +ok 85 - chat thread.create: each existing Console write fence makes zero bus calls + --- + duration_ms: 6.586645 + type: 'test' + ... +# Subtest: chat thread.create: refusal or lost/malformed receipt never retries or invents success +ok 86 - chat thread.create: refusal or lost/malformed receipt never retries or invents success + --- + duration_ms: 3.340434 + type: 'test' + ... +# Subtest: chat thread.send: one verified write, fixed identity/class and private log +ok 87 - chat thread.send: one verified write, fixed identity/class and private log + --- + duration_ms: 1.126785 + type: 'test' + ... +# Subtest: chat thread.send: each existing Console write fence makes zero bus calls +ok 88 - chat thread.send: each existing Console write fence makes zero bus calls + --- + duration_ms: 5.104163 + type: 'test' + ... +# Subtest: chat thread.send: refusal or lost/malformed receipt never retries or invents success +ok 89 - chat thread.send: refusal or lost/malformed receipt never retries or invents success + --- + duration_ms: 2.932198 + type: 'test' + ... +# Subtest: chat thread.open: one verified write, fixed identity/class and private log +ok 90 - chat thread.open: one verified write, fixed identity/class and private log + --- + duration_ms: 1.596794 + type: 'test' + ... +# Subtest: chat thread.open: each existing Console write fence makes zero bus calls +ok 91 - chat thread.open: each existing Console write fence makes zero bus calls + --- + duration_ms: 4.950024 + type: 'test' + ... +# Subtest: chat thread.open: refusal or lost/malformed receipt never retries or invents success +ok 92 - chat thread.open: refusal or lost/malformed receipt never retries or invents success + --- + duration_ms: 2.863437 + type: 'test' + ... +# Subtest: chat createThread receipt requires an instance even when its id is valid +ok 93 - chat createThread receipt requires an instance even when its id is valid + --- + duration_ms: 1.931498 + type: 'test' + ... +# Subtest: chat write receipts expose only the fields belonging to their operation +ok 94 - chat write receipts expose only the fields belonging to their operation + --- + duration_ms: 3.15353 + type: 'test' + ... +# Subtest: chat validates names, body, project and strict empty open payload +ok 95 - chat validates names, body, project and strict empty open payload + --- + duration_ms: 4.822675 + type: 'test' + ... +# Subtest: chat read failures redact ownership and refuse invalid transport arrays +ok 96 - chat read failures redact ownership and refuse invalid transport arrays + --- + duration_ms: 4.782819 + type: 'test' + ... +# Subtest: REQ-USER-2 real broker: owned catalog, create/name/filter, isolated history and 403/404 without mutations +ok 97 - REQ-USER-2 real broker: owned catalog, create/name/filter, isolated history and 403/404 without mutations + --- + duration_ms: 92.300517 + type: 'test' + ... +# Subtest: chat repeats every POST boundary even when called behind an admitted request +ok 98 - chat repeats every POST boundary even when called behind an admitted request + --- + duration_ms: 0.872387 + type: 'test' + ... +# Subtest: configured Console process injects chat through its existing human transport +ok 99 - configured Console process injects chat through its existing human transport + --- + duration_ms: 153.220183 + type: 'test' + ... +# Subtest: chat assets, GET purity, method and unknown-route refusals are explicit +ok 100 - chat assets, GET purity, method and unknown-route refusals are explicit + --- + duration_ms: 11.345886 + type: 'test' + ... +# Subtest: the chat seam names the transport it is given: the human one and the tester one both pass, anything else is a TypeError +ok 101 - the chat seam names the transport it is given: the human one and the tester one both pass, anything else is a TypeError + --- + duration_ms: 0.49287 + type: 'test' + ... +# Subtest: C2-09a createThread forwards an explicit instance through the existing channel +ok 102 - C2-09a createThread forwards an explicit instance through the existing channel + --- + duration_ms: 4.028856 + type: 'test' + ... +# Subtest: C2-09a malformed instance and extra thread fields refuse before the channel write +ok 103 - C2-09a malformed instance and extra thread fields refuse before the channel write + --- + duration_ms: 3.23414 + type: 'test' + ... +# Subtest: 264e session catalog/create and explicit selectors keep the human transport and strict keys +ok 104 - 264e session catalog/create and explicit selectors keep the human transport and strict keys + --- + duration_ms: 4.653448 + type: 'test' + ... +# Subtest: 264e session writes retain Origin/identity fences and explicit selector errors +ok 105 - 264e session writes retain Origin/identity fences and explicit selector errors + --- + duration_ms: 1.993576 + type: 'test' + ... +# Subtest: 264e clear envelope is projected, pending is preserved and GET never repeats the clear +ok 106 - 264e clear envelope is projected, pending is preserved and GET never repeats the clear + --- + duration_ms: 3.567113 + type: 'test' + ... +# Subtest: 264e cancel is an authenticated, confirmed human write and retains retirement distinction +ok 107 - 264e cancel is an authenticated, confirmed human write and retains retirement distinction + --- + duration_ms: 8.111731 + type: 'test' + ... +# Subtest: 272 N1: malformed clear/cancel write receipts get one redacted outcome-unknown audit line +ok 108 - 272 N1: malformed clear/cancel write receipts get one redacted outcome-unknown audit line + --- + duration_ms: 2.13789 + type: 'test' + ... +# Subtest: conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers +ok 109 - conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers + --- + duration_ms: 972.085504 + type: 'test' + ... +# Subtest: conversation view: a fork keeps the open branch, says so, and opens the new one on request +ok 110 - conversation view: a fork keeps the open branch, says so, and opens the new one on request + --- + duration_ms: 1379.957947 + type: 'test' + ... +# Subtest: conversation view: a newer session with no readable history keeps the marker +ok 111 - conversation view: a newer session with no readable history keeps the marker + --- + duration_ms: 984.53733 + type: 'test' + ... +# Subtest: conversation view: seats without history say so and offer no reply +ok 112 - conversation view: seats without history say so and offer no reply + --- + duration_ms: 600.935646 + type: 'test' + ... +# Subtest: J16: no controls without sso and decide, read-only reasons, terminal lines kept, and only an eligible grant gets the panel +ok 113 - J16: no controls without sso and decide, read-only reasons, terminal lines kept, and only an eligible grant gets the panel + --- + duration_ms: 4740.852843 + type: 'test' + ... +# Subtest: J17: one POST per click, confirm then answer, cancel, refusals and an unknown outcome never retry +ok 114 - J17: one POST per click, confirm then answer, cancel, refusals and an unknown outcome never retry + --- + duration_ms: 3863.879486 + type: 'test' + ... +# Subtest: a sign-in redirect at either step signs the page out and answers nothing +ok 115 - a sign-in redirect at either step signs the page out and answers nothing + --- + duration_ms: 1467.855092 + type: 'test' + ... +# Subtest: a signed-in owner confirms and answers, with the session's provider, issuer and sub as the subject +ok 116 - a signed-in owner confirms and answers, with the session's provider, issuer and sub as the subject + --- + duration_ms: 91.898772 + type: 'test' + ... +# Subtest: the listener gates: no session, a cross-origin page, a loopback Host, a GET, and a sign-out between the steps +ok 117 - the listener gates: no session, a cross-origin page, a loopback Host, a GET, and a sign-out between the steps + --- + duration_ms: 36.038987 + type: 'test' + ... +# Subtest: J16: without a decision transport the routes are read-only and /api/config says no; startServer refuses decide without sso or send +ok 118 - J16: without a decision transport the routes are read-only and /api/config says no; startServer refuses decide without sso or send + --- + duration_ms: 141.077255 + type: 'test' + ... +# Subtest: J19: a granted user's session gets decide false and the user page config, and a decision POST stops at owner-only +ok 119 - J19: a granted user's session gets decide false and the user page config, and a decision POST stops at owner-only + --- + duration_ms: 55.881394 + type: 'test' + ... +# Subtest: N4: decision.resolve has no Console route, the --send caller names no decision verb, and consoleCall takes only the two console verbs +ok 120 - N4: decision.resolve has no Console route, the --send caller names no decision verb, and consoleCall takes only the two console verbs + --- + duration_ms: 23.421309 + type: 'test' + ... +# Subtest: a confirmation then a resolve answers once with the held choice and digest, and a second resolve refuses +ok 121 - a confirmation then a resolve answers once with the held choice and digest, and a second resolve refuses + --- + duration_ms: 2.8601 + type: 'test' + ... +# Subtest: deny resolves without a grant field +ok 122 - deny resolves without a grant field + --- + duration_ms: 0.333605 + type: 'test' + ... +# Subtest: the gates before the body: method, read-only, sign-in and same origin +ok 123 - the gates before the body: method, read-only, sign-in and same origin + --- + duration_ms: 0.389877 + type: 'test' + ... +# Subtest: a bad body, id or content type refuses before the bus +ok 124 - a bad body, id or content type refuses before the bus + --- + duration_ms: 0.60909 + type: 'test' + ... +# Subtest: a choice that is neither key is decision-stale, and a malformed preview is confirmation-unavailable +ok 125 - a choice that is neither key is decision-stale, and a malformed preview is confirmation-unavailable + --- + duration_ms: 0.548034 + type: 'test' + ... +# Subtest: bus refusals map by code, and an unknown or missing code is unavailable at preview and outcome-unknown at resolve +ok 126 - bus refusals map by code, and an unknown or missing code is unavailable at preview and outcome-unknown at resolve + --- + duration_ms: 1.783106 + type: 'test' + ... +# Subtest: a confirmation binds the session, decision and choice, and any mismatch spends it +ok 127 - a confirmation binds the session, decision and choice, and any mismatch spends it + --- + duration_ms: 0.521287 + type: 'test' + ... +# Subtest: a session that ends between the steps refuses before the bus +ok 128 - a session that ends between the steps refuses before the bus + --- + duration_ms: 0.321133 + type: 'test' + ... +# Subtest: confirmations expire after the TTL, cap at the limit without dropping a live one, and are one use +ok 129 - confirmations expire after the TTL, cap at the limit without dropping a live one, and are one use + --- + duration_ms: 0.202925 + type: 'test' + ... +# Subtest: Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content +ok 130 - Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content + --- + duration_ms: 593.945205 + type: 'test' + ... +# Subtest: the editor: the list, hostile markdown that runs nothing, the draft, and each save receipt +ok 131 - the editor: the list, hostile markdown that runs nothing, the draft, and each save receipt + --- + duration_ms: 1504.339512 + type: 'test' + ... +# Subtest: the Console's CSP stands and the editor runs under it; hostile markdown on the load path runs and loads nothing +ok 132 - the Console's CSP stands and the editor runs under it; hostile markdown on the load path runs and loads nothing + --- + duration_ms: 768.257275 + type: 'test' + ... +# Subtest: hostile content pasted into the editor runs and loads nothing, and a bad link target is refused in the link bar +ok 133 - hostile content pasted into the editor runs and loads nothing, and a bad link target is refused in the link bar + --- + duration_ms: 666.172084 + type: 'test' + ... +# Subtest: a pasted image span is kept only for a target the link gate accepts, and a save writes only those +ok 134 - a pasted image span is kept only for a target the link gate accepts, and a save writes only those + --- + duration_ms: 523.470578 + type: 'test' + ... +# Subtest: a switch of view reads nothing; a reload, and a trip away and back, each read the file exactly once +ok 135 - a switch of view reads nothing; a reload, and a trip away and back, each read the file exactly once + --- + duration_ms: 2437.447684 + type: 'test' + ... +# Subtest: an edit rewrites only the block touched; a save sends the rest byte for byte; the Source view carries the draft +ok 136 - an edit rewrites only the block touched; a save sends the rest byte for byte; the Source view carries the draft + --- + duration_ms: 901.137855 + type: 'test' + ... +# Subtest: a file the editor cannot write back byte for byte opens as Source, says so, cannot save, and the Visual button works once it can +ok 137 - a file the editor cannot write back byte for byte opens as Source, says so, cannot save, and the Visual button works once it can + --- + duration_ms: 1899.681664 + type: 'test' + ... +# Subtest: a link title pasted with line breaks in it is written on one line, so no HTML block comes of it +ok 138 - a link title pasted with line breaks in it is written on one line, so no HTML block comes of it + --- + duration_ms: 474.416938 + type: 'test' + ... +# Subtest: an image alt pasted with line breaks in it is written on one line, so no HTML block comes of it +ok 139 - an image alt pasted with line breaks in it is written on one line, so no HTML block comes of it + --- + duration_ms: 496.010109 + type: 'test' + ... +# Subtest: an image title pasted with line breaks in it is written on one line, so no HTML block comes of it +ok 140 - an image title pasted with line breaks in it is written on one line, so no HTML block comes of it + --- + duration_ms: 495.175193 + type: 'test' + ... +# Subtest: a code block info string pasted with line breaks in it is written on one line, so no HTML block comes of it +ok 141 - a code block info string pasted with line breaks in it is written on one line, so no HTML block comes of it + --- + duration_ms: 517.046113 + type: 'test' + ... +# Subtest: a link title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed +ok 142 - a link title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed + --- + duration_ms: 542.390956 + type: 'test' + ... +# Subtest: an image title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed +ok 143 - an image title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed + --- + duration_ms: 493.577441 + type: 'test' + ... +# Subtest: a link title holding a trailing backslash is written with the backslash escaped, so the title stays closed +ok 144 - a link title holding a trailing backslash is written with the backslash escaped, so the title stays closed + --- + duration_ms: 492.909895 + type: 'test' + ... +# Subtest: an image title holding a trailing backslash is written with the backslash escaped, so the title stays closed +ok 145 - an image title holding a trailing backslash is written with the backslash escaped, so the title stays closed + --- + duration_ms: 511.924009 + type: 'test' + ... +# Subtest: a code block info string with a backtick, pasted, is dropped on Save, so the fence stays closed +ok 146 - a code block info string with a backtick, pasted, is dropped on Save, so the fence stays closed + --- + duration_ms: 508.785374 + type: 'test' + ... +# Subtest: a code block info string with a backtick, as a tilde fence can have, is kept as source, not rewritten without it +ok 147 - a code block info string with a backtick, as a tilde fence can have, is kept as source, not rewritten without it + --- + duration_ms: 476.418502 + type: 'test' + ... +# Subtest: the imported source is the tagged upstream source plus the recorded local changes, and nothing else +ok 148 - the imported source is the tagged upstream source plus the recorded local changes, and nothing else + --- + duration_ms: 13.508094 + type: 'test' + ... +# Subtest: every package names its origin and license, and NOTICE lists each +ok 149 - every package names its origin and license, and NOTICE lists each + --- + duration_ms: 0.456396 + type: 'test' + ... +# Subtest: the build reads only imported source and the editor's own files; the bundle is the recorded build +ok 150 - the build reads only imported source and the editor's own files; the bundle is the recorded build + --- + duration_ms: 5.200161 + type: 'test' + ... +# Subtest: MOSAIC_REQUIRE_EDITOR_BUILD: a missing or wrong esbuild skips without it and fails with it; a wrong binary always fails +ok 151 - MOSAIC_REQUIRE_EDITOR_BUILD: a missing or wrong esbuild skips without it and fails with it; a wrong binary always fails + --- + duration_ms: 3.2172 + type: 'test' + ... +# Subtest: the toolchain check, run as a program, exits non-zero without esbuild when the build is required +ok 152 - the toolchain check, run as a program, exits non-zero without esbuild when the build is required + --- + duration_ms: 114.543728 + type: 'test' + ... +# ▲ [WARNING] Ignoring this import because "third_party/editor/prosemirror-transform/src/mark.ts" was marked as having no side effects [ignored-bare-import] +# third_party/editor/prosemirror-transform/src/index.ts:10:7: +# 10 │ import "./mark" +# ╵ ~~~~~~~~ +# "sideEffects" is false in the enclosing "package.json" file: +# third_party/editor/prosemirror-transform/package.json:13:2: +# 13 │ "sideEffects": false, +# ╵ ~~~~~~~~~~~~~ +# Subtest: rebuilding from the source gives the same bytes (needs the pinned esbuild; MOSAIC_REQUIRE_EDITOR_BUILD=1 makes its absence a failure) +ok 153 - rebuilding from the source gives the same bytes (needs the pinned esbuild; MOSAIC_REQUIRE_EDITOR_BUILD=1 makes its absence a failure) + --- + duration_ms: 50.470219 + type: 'test' + ... +# Subtest: the editor routes serve the built files with their types and no cache +ok 154 - the editor routes serve the built files with their types and no cache + --- + duration_ms: 32.799894 + type: 'test' + ... +# Subtest: open and save with no edit writes the same bytes: the goals review and a doc with every element +ok 155 - open and save with no edit writes the same bytes: the goals review and a doc with every element + --- + duration_ms: 22.203157 + type: 'test' + ... +# Subtest: open and save with no edit writes the same bytes: every repository doc under docs/ and spec/ +ok 156 - open and save with no edit writes the same bytes: every repository doc under docs/ and spec/ + --- + duration_ms: 1394.474993 + type: 'test' + ... +# Subtest: the editor source builds markup only with DOM calls, and the bundle has no eval +ok 157 - the editor source builds markup only with DOM calls, and the bundle has no eval + --- + duration_ms: 2.097047 + type: 'test' + ... +# Subtest: the link gate and the image rule are the preview's +ok 158 - the link gate and the image rule are the preview's + --- + duration_ms: 0.351372 + type: 'test' + ... +# Subtest: R6 G1 a granted user signs in, gets the user page and reaches the broker as itself +ok 159 - R6 G1 a granted user signs in, gets the user page and reaches the broker as itself + --- + duration_ms: 104.219535 + type: 'test' + ... +# Subtest: R6 G2 a subject with no live grant in this business is refused subject-unknown + # Subtest: a listed user with no grant + ok 1 - a listed user with no grant + --- + duration_ms: 63.036296 + type: 'test' + ... + # Subtest: a grant in another business + ok 2 - a grant in another business + --- + duration_ms: 106.028636 + type: 'test' + ... + # Subtest: an expired grant + ok 3 - an expired grant + --- + duration_ms: 51.514674 + type: 'test' + ... + # Subtest: another user's grant + ok 4 - another user's grant + --- + duration_ms: 77.306157 + type: 'test' + ... + # Subtest: a sub in no file + ok 5 - a sub in no file + --- + duration_ms: 56.565029 + type: 'test' + ... + # Subtest: a file the loader refuses + ok 6 - a file the loader refuses + --- + duration_ms: 75.197411 + type: 'test' + ... + 1..6 +ok 160 - R6 G2 a subject with no live grant in this business is refused subject-unknown + --- + duration_ms: 430.496792 + type: 'test' + ... +# Subtest: R6 G3 a revoke counts on the next request: 401 and the session is gone + # Subtest: grant removed + ok 1 - grant removed + --- + duration_ms: 53.341976 + type: 'test' + ... + # Subtest: subject removed + ok 2 - subject removed + --- + duration_ms: 98.262353 + type: 'test' + ... + # Subtest: grant expired + ok 3 - grant expired + --- + duration_ms: 56.491055 + type: 'test' + ... + # Subtest: file now refused + ok 4 - file now refused + --- + duration_ms: 68.573594 + type: 'test' + ... + 1..4 +ok 161 - R6 G3 a revoke counts on the next request: 401 and the session is gone + --- + duration_ms: 277.277525 + type: 'test' + ... +# Subtest: R6 G4 every owner route answers 403 owner-only before any bus call +ok 162 - R6 G4 every owner route answers 403 owner-only before any bus call + --- + duration_ms: 68.045881 + type: 'test' + ... +# Subtest: R6 G5 the bus refuses every owner verb over the user transport on its own +ok 163 - R6 G5 the bus refuses every owner verb over the user transport on its own + --- + duration_ms: 68.06561 + type: 'test' + ... +# Subtest: R6 G9 a user chat sends only the plugins read over the owner transport +ok 164 - R6 G9 a user chat sends only the plugins read over the owner transport + --- + duration_ms: 87.08944 + type: 'test' + ... +# Subtest: R6 G6 the user page holds the notice word for word +ok 165 - R6 G6 the user page holds the notice word for word + --- + duration_ms: 42.900372 + type: 'test' + ... +# Subtest: R6 G7 the hub label and plain peer links render from config on both pages +ok 166 - R6 G7 the hub label and plain peer links render from config on both pages + --- + duration_ms: 657.933069 + type: 'test' + ... +# Subtest: R6 G8 userCall spawns user-cli directly with the user nonce, no human nonce, and the user request +ok 167 - R6 G8 userCall spawns user-cli directly with the user nonce, no human nonce, and the user request + --- + duration_ms: 41.844324 + type: 'test' + ... +# Subtest: return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch +ok 168 - return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch + --- + duration_ms: 51837.384305 + type: 'test' + ... +# Subtest: row 165 Settings: role instances read, add with a restart named, change without one, a refusal keeps the draft +ok 169 - row 165 Settings: role instances read, add with a restart named, change without one, a refusal keeps the draft + --- + duration_ms: 1060.565426 + type: 'test' + ... +# Subtest: row 165 Console: the signed-in human adds an instance through a real broker; validate exits 0, the log names the human and no restart is needed (row 194) +ok 170 - row 165 Console: the signed-in human adds an instance through a real broker; validate exits 0, the log names the human and no restart is needed (row 194) + --- + duration_ms: 192.419136 + type: 'test' + ... +# Subtest: row 165 Console: the instance write needs send on, the public name, the user, the exact Origin and same-origin Fetch Metadata +ok 171 - row 165 Console: the instance write needs send on, the public name, the user, the exact Origin and same-origin Fetch Metadata + --- + duration_ms: 5.59326 + type: 'test' + ... +# Subtest: row 165 Console: the instance write takes JSON within 16 KiB and only its own keys; holder, credentials and an actor are refused +ok 172 - row 165 Console: the instance write takes JSON within 16 KiB and only its own keys; holder, credentials and an actor are refused + --- + duration_ms: 6.473641 + type: 'test' + ... +# Subtest: row 165 Console: a bus refusal says nothing changed; a lost or odd answer says the change may have been made +ok 173 - row 165 Console: a bus refusal says nothing changed; a lost or odd answer says the change may have been made + --- + duration_ms: 8.55123 + type: 'test' + ... +# Subtest: row 165 Console: the instances read takes no arguments, needs a bus and refuses an answer without a revision +ok 174 - row 165 Console: the instances read takes no arguments, needs a bus and refuses an answer without a revision + --- + duration_ms: 4.013043 + type: 'test' + ... +# Subtest: C2-04 CLI: both listener callback pairs dispatch library verbs with their own transport +ok 175 - C2-04 CLI: both listener callback pairs dispatch library verbs with their own transport + --- + duration_ms: 120.10524 + type: 'test' + ... +# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit +ok 176 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit + --- + duration_ms: 16.226813 + type: 'test' + ... +# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata +ok 177 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata + --- + duration_ms: 6.070573 + type: 'test' + ... +# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked +ok 178 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked + --- + duration_ms: 5.175734 + type: 'test' + ... +# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal +ok 179 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal + --- + duration_ms: 5.939052 + type: 'test' + ... +# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried +ok 180 - a revert whose answer is lost or unusable is reported unknown and is never retried + --- + duration_ms: 4.216603 + type: 'test' + ... +# Subtest: the status read takes one project query and answers the bus result for that project +ok 181 - the status read takes one project query and answers the bus result for that project + --- + duration_ms: 2.480934 + type: 'test' + ... +# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status +ok 182 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status + --- + duration_ms: 5.409786 + type: 'test' + ... +# Subtest: the status read needs no send; a read-only Console still has no revert +ok 183 - the status read needs no send; a read-only Console still has no revert + --- + duration_ms: 1.960426 + type: 'test' + ... +# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts +ok 184 - library routes are the owner's: a granted user is refused them, and the tester never reverts + --- + duration_ms: 0.66768 + type: 'test' + ... +# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module +ok 185 - the page gets the one library renderer, byte for byte, as a JavaScript module + --- + duration_ms: 1.484358 + type: 'test' + ... +# Subtest: a revert receipt for another project is unknown and is never retried +ok 186 - a revert receipt for another project is unknown and is never retried + --- + duration_ms: 1.288943 + type: 'test' + ... +# Subtest: a granted-user HTTP session cannot reach owner library callbacks +ok 187 - a granted-user HTTP session cannot reach owner library callbacks + --- + duration_ms: 1.581555 + type: 'test' + ... +# Subtest: a configured revert callback remains unreachable when send is off +ok 188 - a configured revert callback remains unreachable when send is off + --- + duration_ms: 1.154388 + type: 'test' + ... +# Subtest: row 254: each library sync code maps to its status +ok 189 - row 254: each library sync code maps to its status + --- + duration_ms: 0.586136 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 REQ-LIMIT-4 Settings shows token limits counted, not enforced and check failed; Reset posts one path; a save keeps the token limits +ok 190 - REQ-LIMIT-3 REQ-LIMIT-4 Settings shows token limits counted, not enforced and check failed; Reset posts one path; a save keeps the token limits + --- + duration_ms: 874.579427 + type: 'test' + ... +# Subtest: Row 167 with an assistant draft open, a token limit reset gives the assistant submit its revision +ok 191 - Row 167 with an assistant draft open, a token limit reset gives the assistant submit its revision + --- + duration_ms: 549.049242 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 limits read returns only the token rows; no query or write is accepted +ok 192 - REQ-LIMIT-3 limits read returns only the token rows; no query or write is accepted + --- + duration_ms: 26.437264 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 a limits answer without a token list is refused, not shown as no limits +ok 193 - REQ-LIMIT-3 a limits answer without a token list is refused, not shown as no limits + --- + duration_ms: 8.067279 + type: 'test' + ... +# 2026-10-24T16:43:03.493Z settings user="jason" changed +# Subtest: REQ-LIMIT-3 a Settings reset reaches the human write with its paths; a reset alone is enough +ok 194 - REQ-LIMIT-3 a Settings reset reaches the human write with its paths; a reset alone is enough + --- + duration_ms: 5.505357 + type: 'test' + ... +# Subtest: REQ-LIMIT-3 the Console reader asks the bus limits verb with no arguments +ok 195 - REQ-LIMIT-3 the Console reader asks the bus limits verb with no arguments + --- + duration_ms: 0.244826 + type: 'test' + ... +# Subtest: the preview source names none of the four string-to-markup sinks +ok 196 - the preview source names none of the four string-to-markup sinks + --- + duration_ms: 0.948343 + type: 'test' + ... +# Subtest: headings, paragraphs, emphasis and inline code render +ok 197 - headings, paragraphs, emphasis and inline code render + --- + duration_ms: 1.152913 + type: 'test' + ... +# Subtest: lists, block quotes and code blocks render +ok 198 - lists, block quotes and code blocks render + --- + duration_ms: 0.432879 + type: 'test' + ... +# Subtest: a link is made for http, https and relative targets, with rel and the target shown +ok 199 - a link is made for http, https and relative targets, with rel and the target shown + --- + duration_ms: 0.915567 + type: 'test' + ... +# Subtest: a link with any other scheme, or an evasion of the scheme, stays source text +ok 200 - a link with any other scheme, or an evasion of the scheme, stays source text + --- + duration_ms: 0.696005 + type: 'test' + ... +# Subtest: an image shows alt text and URL, is never an img element and never loads +ok 201 - an image shows alt text and URL, is never an img element and never loads + --- + duration_ms: 0.151895 + type: 'test' + ... +# Subtest: raw HTML, entities and unsupported blocks show as source text, never as elements +ok 202 - raw HTML, entities and unsupported blocks show as source text, never as elements + --- + duration_ms: 0.281783 + type: 'test' + ... +# Subtest: markup inside code and inside link text stays text +ok 203 - markup inside code and inside link text stays text + --- + duration_ms: 0.150889 + type: 'test' + ... +# Subtest: hostile and pathological input stays within its look-ahead budget and under the nesting cap +ok 204 - hostile and pathological input stays within its look-ahead budget and under the nesting cap + --- + duration_ms: 29.547893 + type: 'test' + ... +# Subtest: trailing blanks and closing hashes are cut by a walk from the end, not a regex that retries inside a blank run +ok 205 - trailing blanks and closing hashes are cut by a walk from the end, not a regex that retries inside a blank run + --- + duration_ms: 23.783864 + type: 'test' + ... +# Subtest: a link opener with no closer searches at most SPAN characters ahead +ok 206 - a link opener with no closer searches at most SPAN characters ahead + --- + duration_ms: 146.592318 + type: 'test' + ... +# Subtest: the look-ahead work of one render is a fixed multiple of the text, whatever the opener +ok 207 - the look-ahead work of one render is a fixed multiple of the text, whatever the opener + --- + duration_ms: 678.29556 + type: 'test' + ... +# Subtest: past the budget an opener is source text, through the path all other text takes +ok 208 - past the budget an opener is source text, through the path all other text takes + --- + duration_ms: 13.413059 + type: 'test' + ... +# Subtest: a normal 200 KiB document renders exactly as it did without a budget, and spends little of it +ok 209 - a normal 200 KiB document renders exactly as it did without a budget, and spends little of it + --- + duration_ms: 17.827668 + type: 'test' + ... +# Subtest: a line separator inside a heading, a list item or a fence line does not end the marker line +ok 210 - a line separator inside a heading, a list item or a fence line does not end the marker line + --- + duration_ms: 0.450256 + type: 'test' + ... +# Subtest: a thematic-break line is a paragraph, every other marker line opens a list +ok 211 - a thematic-break line is a paragraph, every other marker line opens a list + --- + duration_ms: 0.380565 + type: 'test' + ... +# Subtest: every short line over space, tab, - * _ and a letter is a break exactly when the old regex said so +ok 212 - every short line over space, tab, - * _ and a letter is a break exactly when the old regex said so + --- + duration_ms: 35.150728 + type: 'test' + ... +# Subtest: one line of marks does not throw, at 4 MiB, whatever the mark or the spacing +ok 213 - one line of marks does not throw, at 4 MiB, whatever the mark or the spacing + --- + duration_ms: 5875.546418 + type: 'test' + ... +# Subtest: CRLF and tabs are read like LF and spaces; empty input renders nothing +ok 214 - CRLF and tabs are read like LF and spaces; empty input renders nothing + --- + duration_ms: 0.182105 + type: 'test' + ... +# Subtest: messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged +ok 215 - messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged + --- + duration_ms: 83.017513 + type: 'test' + ... +# Subtest: 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 +ok 216 - 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 + --- + duration_ms: 848.789607 + type: 'test' + ... +# Subtest: Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages +ok 217 - Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages + --- + duration_ms: 1692.294139 + type: 'test' + ... +# Subtest: copy writes the Console paths at the full id, read-only, and leaves an existing copy alone +ok 218 - copy writes the Console paths at the full id, read-only, and leaves an existing copy alone + --- + duration_ms: 1201.647369 + type: 'test' + ... +# Subtest: copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory +ok 219 - copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory + --- + duration_ms: 1421.274627 + type: 'test' + ... +# Subtest: copy writes nothing when an archived path is missing at the commit +ok 220 - copy writes nothing when an archived path is missing at the commit + --- + duration_ms: 369.133575 + type: 'test' + ... +# Subtest: a copy that loses the rename race leaves no read-only temp directory behind +ok 221 - a copy that loses the rename race leaves no read-only temp directory behind + --- + duration_ms: 568.570007 + type: 'test' + ... +# Subtest: a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory +ok 222 - a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory + --- + duration_ms: 514.44393 + type: 'test' + ... +# Subtest: a copy that meets a target holding files says exists: and moves nothing into it +ok 223 - a copy that meets a target holding files says exists: and moves nothing into it + --- + duration_ms: 549.972922 + type: 'test' + ... +# Subtest: a copy that meets an empty target directory replaces it by rename, not by moving into it +ok 224 - a copy that meets an empty target directory replaces it by rename, not by moving into it + --- + duration_ms: 505.130095 + type: 'test' + ... +# Subtest: serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout +ok 225 - serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout + --- + duration_ms: 896.637558 + type: 'test' + ... +# Subtest: serve refuses a --checkout that is not an absolute directory path +ok 226 - serve refuses a --checkout that is not an absolute directory path + --- + duration_ms: 277.266297 + type: 'test' + ... +# Subtest: consoleReads runs the queue read under queueRoot and reads RELEASE under root +ok 227 - consoleReads runs the queue read under queueRoot and reads RELEASE under root + --- + duration_ms: 52.482667 + type: 'test' + ... +# Subtest: preview options are all three or none, and each is checked +ok 228 - preview options are all three or none, and each is checked + --- + duration_ms: 6.801261 + type: 'test' + ... +# Subtest: the CLI refuses a partial or invalid preview flag set at start +ok 229 - the CLI refuses a partial or invalid preview flag set at start + --- + duration_ms: 636.505 + type: 'test' + ... +# Subtest: the CLI with all three flags serves the preview mode +ok 230 - the CLI with all three flags serves the preview mode + --- + duration_ms: 125.647206 + type: 'test' + ... +# Subtest: a request for the public name needs the header equal to the user id, else 401 and nothing read +ok 231 - a request for the public name needs the header equal to the user id, else 401 and nothing read + --- + duration_ms: 15.009104 + type: 'test' + ... +# Subtest: the header name matches without regard to case, and the value compare is exact +ok 232 - the header name matches without regard to case, and the value compare is exact + --- + duration_ms: 3.016097 + type: 'test' + ... +# Subtest: the public name with the header reads the bus views, and the Host and Origin are checked first +ok 233 - the public name with the header reads the bus views, and the Host and Origin are checked first + --- + duration_ms: 21.877917 + type: 'test' + ... +# Subtest: in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing +ok 234 - in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing + --- + duration_ms: 9.212475 + type: 'test' + ... +# Subtest: loopback requests are unchanged in preview mode, and the bus views work with the board down +ok 235 - loopback requests are unchanged in preview mode, and the bus views work with the board down + --- + duration_ms: 4.206467 + type: 'test' + ... +# Subtest: a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user +ok 236 - a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user + --- + duration_ms: 14.263581 + type: 'test' + ... +# Subtest: a repeated Host is 400 before any other check, in preview mode and without it +ok 237 - a repeated Host is 400 before any other check, in preview mode and without it + --- + duration_ms: 7.369018 + type: 'test' + ... +# Subtest: without the preview flags the public name is refused and writes still reach the board +ok 238 - without the preview flags the public name is refused and writes still reach the board + --- + duration_ms: 4.042494 + type: 'test' + ... +# Subtest: processing browser: keyboard Stop, confirmed Resume, unknown outcome and persistent banner +ok 239 - processing browser: keyboard Stop, confirmed Resume, unknown outcome and persistent banner + --- + duration_ms: 642.09745 + type: 'test' + ... +# Subtest: processing browser: Q175 read-only interim keeps both writes disabled and names CLI recovery at 320px +ok 240 - processing browser: Q175 read-only interim keeps both writes disabled and names CLI recovery at 320px + --- + duration_ms: 514.584034 + type: 'test' + ... +# Subtest: processing browser: sign-out from config redirect blocks later refresh and writes +ok 241 - processing browser: sign-out from config redirect blocks later refresh and writes + --- + duration_ms: 707.586073 + type: 'test' + ... +# Subtest: processing browser: sign-out from state redirect blocks later refresh and writes +ok 242 - processing browser: sign-out from state redirect blocks later refresh and writes + --- + duration_ms: 585.757428 + type: 'test' + ... +# Subtest: processing browser: sign-out from write redirect blocks later refresh and writes +ok 243 - processing browser: sign-out from write redirect blocks later refresh and writes + --- + duration_ms: 581.389019 + type: 'test' + ... +# Subtest: processing browser: sign-out from config sign-in required blocks later refresh and writes +ok 244 - processing browser: sign-out from config sign-in required blocks later refresh and writes + --- + duration_ms: 672.24592 + type: 'test' + ... +# Subtest: processing browser: sign-out from state sign-in required blocks later refresh and writes +ok 245 - processing browser: sign-out from state sign-in required blocks later refresh and writes + --- + duration_ms: 681.720279 + type: 'test' + ... +# Subtest: processing browser: sign-out from write sign-in required blocks later refresh and writes +ok 246 - processing browser: sign-out from write sign-in required blocks later refresh and writes + --- + duration_ms: 576.037622 + type: 'test' + ... +# ROW191_LAYOUT {"width":400,"height":1000,"controls":97,"tree":324.0625,"main":1450.703125,"top":181.5,"bottom":217.5,"barBottom":129,"projectsTop":352.59375,"order":"0","visible":true} +# ROW191_LAYOUT {"width":1440,"height":1000,"controls":127,"tree":914,"main":914,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":636.59375,"order":"0","visible":true} +# ROW191_LAYOUT {"width":1440,"height":420,"controls":127,"tree":334,"main":907.734375,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":636.59375,"order":"0","visible":true} +# ROW191_LAYOUT {"width":800,"height":420,"controls":127,"tree":334,"main":1131.65625,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":618.59375,"order":"0","visible":true} +# Subtest: processing browser: static nav controls keep Stop visible, ordered and keyboard reachable +ok 247 - processing browser: static nav controls keep Stop visible, ordered and keyboard reachable + --- + duration_ms: 532.257588 + type: 'test' + ... +# Subtest: interim read-only controls show CLI recovery, disable both writes and retain a halted banner across views +ok 248 - interim read-only controls show CLI recovery, disable both writes and retain a halted banner across views + --- + duration_ms: 7.510124 + type: 'test' + ... +# Subtest: Stop sends one empty halt and Resume confirms before sending the displayed generation +ok 249 - Stop sends one empty halt and Resume confirms before sending the displayed generation + --- + duration_ms: 2.703244 + type: 'test' + ... +# Subtest: a cancelled resume never calls the writer +ok 250 - a cancelled resume never calls the writer + --- + duration_ms: 1.100094 + type: 'test' + ... +# Subtest: unknown writes are not retried or displayed as success and partial stops remain explicit +ok 251 - unknown writes are not retried or displayed as success and partial stops remain explicit + --- + duration_ms: 1.954677 + type: 'test' + ... +# Subtest: the persistent shell loads the control outside route-specific content with accessible status and native buttons +ok 252 - the persistent shell loads the control outside route-specific content with accessible status and native buttons + --- + duration_ms: 0.424256 + type: 'test' + ... +# Subtest: read-only Console can read processing state but neither human control writes without --send +ok 253 - read-only Console can read processing state but neither human control writes without --send + --- + duration_ms: 18.645888 + type: 'test' + ... +# Subtest: Console halt and generation-bound resume use only the management writer and keep partial stops honest +ok 254 - Console halt and generation-bound resume use only the management writer and keep partial stops honest + --- + duration_ms: 3.725537 + type: 'test' + ... +# Subtest: processing write fences refuse cross-site, wrong origin, unnamed host, duplicate identity and bad payload before writer +ok 255 - processing write fences refuse cross-site, wrong origin, unnamed host, duplicate identity and bad payload before writer + --- + duration_ms: 6.395032 + type: 'test' + ... +# Subtest: tester cannot invoke either control writer and failures never echo backend text +ok 256 - tester cannot invoke either control writer and failures never echo backend text + --- + duration_ms: 3.892546 + type: 'test' + ... +# Subtest: processing writes use the existing SSO signer and still require --send and same-origin +ok 257 - processing writes use the existing SSO signer and still require --send and same-origin + --- + duration_ms: 4.171091 + type: 'test' + ... +# Subtest: processing handler independently refuses wrong origin and cross-site before its writer +ok 258 - processing handler independently refuses wrong origin and cross-site before its writer + --- + duration_ms: 0.586359 + type: 'test' + ... +# Subtest: a signed-in same-origin save reaches exactly one human operation and returns the new commit +ok 259 - a signed-in same-origin save reaches exactly one human operation and returns the new commit + --- + duration_ms: 16.690842 + type: 'test' + ... +# Subtest: a save needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata +ok 260 - a save needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata + --- + duration_ms: 5.985905 + type: 'test' + ... +# Subtest: a save validates JSON, strict keys, text values and the 1 MiB body before the bus is asked +ok 261 - a save validates JSON, strict keys, text values and the 1 MiB body before the bus is asked + --- + duration_ms: 14.276725 + type: 'test' + ... +# Subtest: a body that is JSON but not an object is refused 400, not thrown on +ok 262 - a body that is JSON but not an object is refused 400, not thrown on + --- + duration_ms: 4.631806 + type: 'test' + ... +# Subtest: the 1 MiB limit is this route only; Settings and messages keep 16 KiB +ok 263 - the 1 MiB limit is this route only; Settings and messages keep 16 KiB + --- + duration_ms: 2.124159 + type: 'test' + ... +# Subtest: a bus refusal is reported as not saved with its own status; stale-base tells the user to reload +ok 264 - a bus refusal is reported as not saved with its own status; stale-base tells the user to reload + --- + duration_ms: 4.83129 + type: 'test' + ... +# Subtest: a save whose answer is lost or unusable is reported unknown and is never retried +ok 265 - a save whose answer is lost or unusable is reported unknown and is never retried + --- + duration_ms: 2.880203 + type: 'test' + ... +# Subtest: the file list and one file read take strict queries and arrive in the expected shape +ok 266 - the file list and one file read take strict queries and arrive in the expected shape + --- + duration_ms: 3.958241 + type: 'test' + ... +# Subtest: reads work without --send; an unusable bus answer is a bad response, a refusal keeps its status +ok 267 - reads work without --send; an unusable bus answer is a bad response, a refusal keeps its status + --- + duration_ms: 2.429539 + type: 'test' + ... +# Subtest: /api/config says edit only where a save can pass +ok 268 - /api/config says edit only where a save can pass + --- + duration_ms: 1.696691 + type: 'test' + ... +# Subtest: a repository-name project refusal is an HTTP conflict +ok 269 - a repository-name project refusal is an HTTP conflict + --- + duration_ms: 0.635834 + type: 'test' + ... +# Subtest: proof startup refuses partial flags non-preview and invalid fixture file metadata or bytes +ok 270 - proof startup refuses partial flags non-preview and invalid fixture file metadata or bytes + --- + duration_ms: 1179.595296 + type: 'test' + ... +# Subtest: serve argv carries only fixture proof path and header; startup explicitly reports proof on or off +ok 271 - serve argv carries only fixture proof path and header; startup explicitly reports proof on or off + --- + duration_ms: 246.413771 + type: 'test' + ... +# Subtest: CLI applies proof on the main listener and rejects that header on its tester listener +ok 272 - CLI applies proof on the main listener and rejects that header on its tester listener + --- + duration_ms: 230.822863 + type: 'test' + ... +# Subtest: proxy proof admits named reads and sends, reads its fixture once, and never exposes the value +ok 273 - proxy proof admits named reads and sends, reads its fixture once, and never exposes the value + --- + duration_ms: 30.466807 + type: 'test' + ... +# Subtest: proxy proof refuses missing wrong short or repeated proof before auth and before any read +ok 274 - proxy proof refuses missing wrong short or repeated proof before auth and before any read + --- + duration_ms: 9.002214 + type: 'test' + ... +# Subtest: proxy proof header is refused on other Hosts and on the tester listener +ok 275 - proxy proof header is refused on other Hosts and on the tester listener + --- + duration_ms: 4.183461 + type: 'test' + ... +# Subtest: proof options reject unsafe or colliding header names without disclosing file contents +ok 276 - proof options reject unsafe or colliding header names without disclosing file contents + --- + duration_ms: 0.638962 + type: 'test' + ... +# Subtest: redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote +ok 277 - redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote + --- + duration_ms: 1.260078 + type: 'test' + ... +# Subtest: credential state from the date alone, as the bus states it +ok 278 - credential state from the date alone, as the bus states it + --- + duration_ms: 0.154948 + type: 'test' + ... +# Subtest: queue: rows, one row, ids and methods, notes; no path or id from a row +ok 279 - queue: rows, one row, ids and methods, notes; no path or id from a row + --- + duration_ms: 313.39579 + type: 'test' + ... +# Subtest: queue: a refused read fails closed with the store's text, redacted +ok 280 - queue: a refused read fails closed with the store's text, redacted + --- + duration_ms: 163.92993 + type: 'test' + ... +# Subtest: queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack +ok 281 - queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack + --- + duration_ms: 708.948317 + type: 'test' + ... +# Subtest: business: names, vars on the allowlist, authority, credential metadata only +ok 282 - business: names, vars on the allowlist, authority, credential metadata only + --- + duration_ms: 9.039888 + type: 'test' + ... +# Subtest: business: missing or invalid file refuses with the module's text, redacted +ok 283 - business: missing or invalid file refuses with the module's text, redacted + --- + duration_ms: 6.22091 + type: 'test' + ... +# Subtest: business without --business: the live bus host, else no-bus-host; no system config: not-configured +ok 284 - business without --business: the live bus host, else no-bus-host; no system config: not-configured + --- + duration_ms: 6.297435 + type: 'test' + ... +# Subtest: settings: release, board, loopback address, notifier binding name only +ok 285 - settings: release, board, loopback address, notifier binding name only + --- + duration_ms: 98.864665 + type: 'test' + ... +# Subtest: task fields: the committed table with no reads configured, GET only; a bad table refuses with no path +ok 286 - task fields: the committed table with no reads configured, GET only; a bad table refuses with no path + --- + duration_ms: 15.318448 + type: 'test' + ... +# Subtest: bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it +ok 287 - bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it + --- + duration_ms: 6.499183 + type: 'test' + ... +# Subtest: both presentations replace old activity with relaunch notice, label retained history, then resume after new activity +ok 288 - both presentations replace old activity with relaunch notice, label retained history, then resume after new activity + --- + duration_ms: 622.751822 + type: 'test' + ... +# Subtest: reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh +ok 289 - reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh + --- + duration_ms: 20632.830794 + type: 'test' + ... +# Subtest: C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery +ok 290 - C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery + --- + duration_ms: 524.168776 + type: 'test' + ... +# Subtest: C2-10c explicit project Open room calls only room.open before navigating +ok 291 - C2-10c explicit project Open room calls only room.open before navigating + --- + duration_ms: 493.733416 + type: 'test' + ... +# Subtest: C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly +ok 292 - C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly + --- + duration_ms: 478.319222 + type: 'test' + ... +# Subtest: C2-10c browser leading tag reader matches every broker parseAddress vector +ok 293 - C2-10c browser leading tag reader matches every broker parseAddress vector + --- + duration_ms: 481.526121 + type: 'test' + ... +# Subtest: C2-10c room refusals show fixed lines, preserve drafts and never retry +ok 294 - C2-10c room refusals show fixed lines, preserve drafts and never retry + --- + duration_ms: 564.342731 + type: 'test' + ... +# Subtest: C2-10c read-only room does not offer a send or an implicit open +ok 295 - C2-10c read-only room does not offer a send or an implicit open + --- + duration_ms: 459.587481 + type: 'test' + ... +# Subtest: C2-10c late reads and sign-out cannot repaint private room state +ok 296 - C2-10c late reads and sign-out cannot repaint private room state + --- + duration_ms: 555.155475 + type: 'test' + ... +# Subtest: C2-10c quiet members complete in an empty room, and Escape closes suggestions +ok 297 - C2-10c quiet members complete in an empty room, and Escape closes suggestions + --- + duration_ms: 560.898468 + type: 'test' + ... +# Subtest: C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft +ok 298 - C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft + --- + duration_ms: 518.224788 + type: 'test' + ... +# Subtest: C2-10c seam exposes three fixed room calls without thread.messages fanout +ok 299 - C2-10c seam exposes three fixed room calls without thread.messages fanout + --- + duration_ms: 10.271092 + type: 'test' + ... +# Subtest: C2-10c HTTP preserves original send, member receipt and the last grouped paging id +ok 300 - C2-10c HTTP preserves original send, member receipt and the last grouped paging id + --- + duration_ms: 11.28237 + type: 'test' + ... +# Subtest: C2-10c room write fences and strict keys reject before transport +ok 301 - C2-10c room write fences and strict keys reject before transport + --- + duration_ms: 9.211896 + type: 'test' + ... +# Subtest: C2-10c all four room refusals are409 with fixed text, never transport prose +ok 302 - C2-10c all four room refusals are409 with fixed text, never transport prose + --- + duration_ms: 3.576389 + type: 'test' + ... +# Subtest: C2-10c malformed/lost write receipts are unknown and never retried +ok 303 - C2-10c malformed/lost write receipts are unknown and never retried + --- + duration_ms: 3.252046 + type: 'test' + ... +# Subtest: C2-10c room receipts reject coerced member keys and duplicate grouped ids +ok 304 - C2-10c room receipts reject coerced member keys and duplicate grouped ids + --- + duration_ms: 1.963547 + type: 'test' + ... +# Subtest: C2-10c granted-user room calls never borrow the owner transport +ok 305 - C2-10c granted-user room calls never borrow the owner transport + --- + duration_ms: 0.592257 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"acme"} +# organization: {"event":"reload-needs-restart","business":"acme"} +# Subtest: row 65 Settings: the routing table lists every instance, saves a harness, model, thinking and fallback to the file, and keeps the draft on each refusal +ok 306 - row 65 Settings: the routing table lists every instance, saves a harness, model, thinking and fallback to the file, and keeps the draft on each refusal + --- + duration_ms: 1125.787666 + type: 'test' + ... +# organization: {"event":"reload-needs-restart","business":"acme"} +# Subtest: row 65 Console: the signed-in human saves a route through a real broker; each refusal says nothing changed and leaves the file and the log +ok 307 - row 65 Console: the signed-in human saves a route through a real broker; each refusal says nothing changed and leaves the file and the log + --- + duration_ms: 95.005658 + type: 'test' + ... +# Subtest: row 65 Console: the routes write needs send on, a writer, the public name, the user, the exact Origin and same-origin Fetch Metadata +ok 308 - row 65 Console: the routes write needs send on, a writer, the public name, the user, the exact Origin and same-origin Fetch Metadata + --- + duration_ms: 6.020174 + type: 'test' + ... +# Subtest: row 65 Console: the routes write takes JSON within 16 KiB with a revision and routes only; an actor is refused and routes are never logged +ok 309 - row 65 Console: the routes write takes JSON within 16 KiB with a revision and routes only; an actor is refused and routes are never logged + --- + duration_ms: 6.39053 + type: 'test' + ... +# Subtest: row 65 Console: a bus refusal maps to its status and says nothing changed; a lost or odd answer says the change may have been made +ok 310 - row 65 Console: a bus refusal maps to its status and says nothing changed; a lost or odd answer says the change may have been made + --- + duration_ms: 17.432617 + type: 'test' + ... +# Subtest: row 65 Console: the routes read takes no arguments, needs a bus and refuses an odd answer +ok 311 - row 65 Console: the routes read takes no arguments, needs a bus and refuses an odd answer + --- + duration_ms: 5.049218 + type: 'test' + ... +# Subtest: 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 +ok 312 - 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 + --- + duration_ms: 2169.404952 + type: 'test' + ... +# Subtest: a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read +ok 313 - a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read + --- + duration_ms: 10987.477484 + type: 'test' + ... +# Subtest: startServer takes send only as a function and only with the preview mode +ok 314 - startServer takes send only as a function and only with the preview mode + --- + duration_ms: 5.458326 + type: 'test' + ... +# Subtest: the CLI refuses --send without the preview flags, and without a configured bus +ok 315 - the CLI refuses --send without the preview flags, and without a configured bus + --- + duration_ms: 410.001976 + type: 'test' + ... +# Subtest: the CLI with --send and a configured bus sends through the human transport and logs one line +ok 316 - the CLI with --send and a configured bus sends through the human transport and logs one line + --- + duration_ms: 127.188357 + type: 'test' + ... +# Subtest: without --send the route is read-only like every other write, and config says no send +ok 317 - without --send the route is read-only like every other write, and config says no send + --- + duration_ms: 6.116812 + type: 'test' + ... +# Subtest: with --send every other write is still 403 read-only, and nothing reaches the board or bus +ok 318 - with --send every other write is still 403 read-only, and nothing reaches the board or bus + --- + duration_ms: 4.862663 + type: 'test' + ... +# Subtest: config says send only on the public name with --send on +ok 319 - config says send only on the public name with --send on + --- + duration_ms: 1.600479 + type: 'test' + ... +# Subtest: a send without the signed-in user is 401 and is neither sent nor logged, loopback included +ok 320 - a send without the signed-in user is 401 and is neither sent nor logged, loopback included + --- + duration_ms: 3.349636 + type: 'test' + ... +# Subtest: each request check refuses before anything is sent, and logs the refusal without the body +ok 321 - each request check refuses before anything is sent, and logs the refusal without the body + --- + duration_ms: 10.400757 + type: 'test' + ... +# Subtest: a send passes exactly to, body and in_reply_to, answers the id, and logs it +ok 322 - a send passes exactly to, body and in_reply_to, answers the id, and logs it + --- + duration_ms: 2.168902 + type: 'test' + ... +# Subtest: a crafted role name cannot forge a log line +ok 323 - a crafted role name cannot forge a log line + --- + duration_ms: 1.739532 + type: 'test' + ... +# Subtest: a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried +ok 324 - a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried + --- + duration_ms: 5.389272 + type: 'test' + ... +# Subtest: through the human transport the request is exactly the business, message.send and the keys +ok 325 - through the human transport the request is exactly the business, message.send and the keys + --- + duration_ms: 72.341475 + type: 'test' + ... +# Subtest: against a real broker: the message is written once as a human send, and its refusals map +ok 326 - against a real broker: the message is written once as a human send, and its refusals map + --- + duration_ms: 28.163419 + type: 'test' + ... +# Subtest: loopback host and board origin fail closed +ok 327 - loopback host and board origin fail closed + --- + duration_ms: 5.026586 + type: 'test' + ... +# Subtest: real board fixture passes through WebUI; assets and isolated seen/reply work +ok 328 - real board fixture passes through WebUI; assets and isolated seen/reply work + --- + duration_ms: 66.097219 + type: 'test' + ... +# Subtest: proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect +ok 329 - proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect + --- + duration_ms: 37.20151 + type: 'test' + ... +# Subtest: unreachable board reports URL; CLI rejects unsupported options +ok 330 - unreachable board reports URL; CLI rejects unsupported options + --- + duration_ms: 369.569778 + type: 'test' + ... +# Subtest: tester service render carries the tester port alongside existing flags +ok 331 - tester service render carries the tester port alongside existing flags + --- + duration_ms: 94.496992 + type: 'test' + ... +# Subtest: tester service refuses forwarded 7332 even with another main port +ok 332 - tester service refuses forwarded 7332 even with another main port + --- + duration_ms: 55.683658 + type: 'test' + ... +# Subtest: tester service invalid ports refuse render and install with exit 4 and leave the unit alone +ok 333 - tester service invalid ports refuse render and install with exit 4 and leave the unit alone + --- + duration_ms: 694.420985 + type: 'test' + ... +# Subtest: tester service counts the digits as written before it strips leading zeros +ok 334 - tester service counts the digits as written before it strips leading zeros + --- + duration_ms: 57.323677 + type: 'test' + ... +# Subtest: tester service install and status show the tester port without changing send reporting +ok 335 - tester service install and status show the tester port without changing send reporting + --- + duration_ms: 327.563608 + type: 'test' + ... +# Subtest: render prints the unit without the preview flags +ok 336 - render prints the unit without the preview flags + --- + duration_ms: 30.288222 + type: 'test' + ... +# Subtest: render carries every serve flag, the preview set included +ok 337 - render carries every serve flag, the preview set included + --- + duration_ms: 30.600593 + type: 'test' + ... +# Subtest: a partial preview set is refused +ok 338 - a partial preview set is refused + --- + duration_ms: 94.354806 + type: 'test' + ... +# Subtest: a value the unit cannot carry is refused, for every flag +ok 339 - a value the unit cannot carry is refused, for every flag + --- + duration_ms: 1596.724386 + type: 'test' + ... +# Subtest: the rendered unit names none of the human proof agent markers and sets no agent variable +ok 340 - the rendered unit names none of the human proof agent markers and sets no agent variable + --- + duration_ms: 91.759793 + type: 'test' + ... +# Subtest: install into --dir with --no-reload writes the file whole, then reports unchanged +ok 341 - install into --dir with --no-reload writes the file whole, then reports unchanged + --- + duration_ms: 179.419883 + type: 'test' + ... +# Subtest: install without --no-reload runs daemon-reload and nothing that starts the unit +ok 342 - install without --no-reload runs daemon-reload and nothing that starts the unit + --- + duration_ms: 50.080576 + type: 'test' + ... +# Subtest: uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not +ok 343 - uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not + --- + duration_ms: 439.062348 + type: 'test' + ... +# Subtest: status prints the unit state and GET /healthz on the installed port +ok 344 - status prints the unit state and GET /healthz on the installed port + --- + duration_ms: 247.046229 + type: 'test' + ... +# Subtest: usage: an unknown verb or flag, and start or enable, exit 4 +ok 345 - usage: an unknown verb or flag, and start or enable, exit 4 + --- + duration_ms: 557.03957 + type: 'test' + ... +# Subtest: without --send, render is the template with its placeholders filled, byte for byte +ok 346 - without --send, render is the template with its placeholders filled, byte for byte + --- + duration_ms: 153.932802 + type: 'test' + ... +# Subtest: render --send with the preview set ends ExecStart with --send and changes nothing else +ok 347 - render --send with the preview set ends ExecStart with --send and changes nothing else + --- + duration_ms: 242.657436 + type: 'test' + ... +# Subtest: --send without the whole preview set is refused and writes nothing +ok 348 - --send without the whole preview set is refused and writes nothing + --- + duration_ms: 607.371634 + type: 'test' + ... +# Subtest: install --send into --dir with --no-reload writes the sending unit, and status says whether it sends +ok 349 - install --send into --dir with --no-reload writes the sending unit, and status says whether it sends + --- + duration_ms: 398.652949 + type: 'test' + ... +# Subtest: uninstall and status take no --send +ok 350 - uninstall and status take no --send + --- + duration_ms: 134.053807 + type: 'test' + ... +# Subtest: install refuses while the unit is running, in any state but inactive or failed, and changes nothing +ok 351 - install refuses while the unit is running, in any state but inactive or failed, and changes nothing + --- + duration_ms: 558.084879 + type: 'test' + ... +# Subtest: when the state read fails, install and uninstall refuse with one line and change nothing +ok 352 - when the state read fails, install and uninstall refuse with one line and change nothing + --- + duration_ms: 188.841916 + type: 'test' + ... +# Subtest: install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree +ok 353 - install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree + --- + duration_ms: 274.557684 + type: 'test' + ... +# Subtest: install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing +ok 354 - install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing + --- + duration_ms: 598.887055 + type: 'test' + ... +# Subtest: render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged +ok 355 - render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged + --- + duration_ms: 90.99038 + type: 'test' + ... +# Subtest: the uid header takes only an Authentik uid; the username header still takes a username +ok 356 - the uid header takes only an Authentik uid; the username header still takes a username + --- + duration_ms: 1649.015572 + type: 'test' + ... +# Subtest: a preview value cannot start with - or . +ok 357 - a preview value cannot start with - or . + --- + duration_ms: 173.593439 + type: 'test' + ... +# Subtest: status names the copy and whether refactor has moved past it, and says when the unit runs from no copy +ok 358 - status names the copy and whether refactor has moved past it, and says when the unit runs from no copy + --- + duration_ms: 499.984505 + type: 'test' + ... +# Subtest: proxy proof render carries both flags but never opens the fixture file +ok 359 - proxy proof render carries both flags but never opens the fixture file + --- + duration_ms: 33.124971 + type: 'test' + ... +# Subtest: proxy proof render refuses incomplete non-preview missing unsafe-mode and repo/copy paths +ok 360 - proxy proof render refuses incomplete non-preview missing unsafe-mode and repo/copy paths + --- + duration_ms: 362.007985 + type: 'test' + ... +# Subtest: proxy proof status retains send and tester reporting with both proof flags +ok 361 - proxy proof status retains send and tester reporting with both proof flags + --- + duration_ms: 135.297065 + type: 'test' + ... +# Subtest: row196 socket flag renders only for supporting targets and refuses mixed transports +ok 362 - row196 socket flag renders only for supporting targets and refuses mixed transports + --- + duration_ms: 84.326432 + type: 'test' + ... +# Subtest: Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry +ok 363 - Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry + --- + duration_ms: 987.926745 + type: 'test' + ... +# Subtest: Q169 Assistant section: gated, changed fields only, name and stop posts, retained draft and no automatic retry +ok 364 - Q169 Assistant section: gated, changed fields only, name and stop posts, retained draft and no automatic retry + --- + duration_ms: 1119.676982 + type: 'test' + ... +# Subtest: Row 167 a refused names read gives the refused usage page; another names failure keeps the Assistant section +ok 365 - Row 167 a refused names read gives the refused usage page; another names failure keeps the Assistant section + --- + duration_ms: 696.122923 + type: 'test' + ... +# Subtest: Row 167 with a limits draft open, an assistant save gives the limits submit its revision and the typed limit stays +ok 366 - Row 167 with a limits draft open, an assistant save gives the limits submit its revision and the typed limit stays + --- + duration_ms: 522.900358 + type: 'test' + ... +# Subtest: Row 167 with an assistant draft open, a launch save gives the assistant submit its revision, and reload reads the current one +ok 367 - Row 167 with an assistant draft open, a launch save gives the assistant submit its revision, and reload reads the current one + --- + duration_ms: 606.33088 + type: 'test' + ... +# 2026-10-24T16:44:27.429Z settings user="jason" changed +# Subtest: REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation +ok 368 - REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation + --- + duration_ms: 15.692931 + type: 'test' + ... +# Subtest: REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata +ok 369 - REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata + --- + duration_ms: 5.4436 + type: 'test' + ... +# Subtest: REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call +ok 370 - REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call + --- + duration_ms: 4.341987 + type: 'test' + ... +# Subtest: Q169 a Console change of the assistant reaches the human operation unchanged, and the log names the signed-in user +ok 371 - Q169 a Console change of the assistant reaches the human operation unchanged, and the log names the signed-in user + --- + duration_ms: 2.236398 + type: 'test' + ... +# Subtest: tokens.css and icons.svg are byte copies of docs/design +ok 372 - tokens.css and icons.svg are byte copies of docs/design + --- + duration_ms: 8.748671 + type: 'test' + ... +# Subtest: JetBrains Mono files match the digests in their sources file, with the OFL text +ok 373 - JetBrains Mono files match the digests in their sources file, with the OFL text + --- + duration_ms: 1.516847 + type: 'test' + ... +# Subtest: shipped strings are unchanged, and the web keeps its write boundary +ok 374 - shipped strings are unchanged, and the web keeps its write boundary + --- + duration_ms: 3.166614 + type: 'test' + ... +# ROW191_LAYOUT {"width":1440,"height":1000,"controls":212.5,"tree":914,"main":914} +# Subtest: shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette +ok 375 - shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette + --- + duration_ms: 5433.807984 + type: 'test' + ... +# Subtest: five states on Board, Inbox, Tasks, Agents and Trail +ok 376 - five states on Board, Inbox, Tasks, Agents and Trail + --- + duration_ms: 2300.384907 + type: 'test' + ... +# Subtest: a 401 sign-in required on each fetch path signs the page out with a sign-in link and stops the refresh; another 401 stays an error +ok 377 - a 401 sign-in required on each fetch path signs the page out with a sign-in link and stops the refresh; another 401 stays an error + --- + duration_ms: 5491.054286 + type: 'test' + ... +# Subtest: the Sign out form shows only when /api/config says sso, and posts to /auth/logout +ok 378 - the Sign out form shows only when /api/config says sso, and posts to /auth/logout + --- + duration_ms: 924.671021 + type: 'test' + ... +# Subtest: positive: an RS256 provider signs in and sends one message, and the session reads +ok 379 - positive: an RS256 provider signs in and sends one message, and the session reads + --- + duration_ms: 95.408479 + type: 'test' + ... +# Subtest: positive: an ES256 provider signs in and sends +ok 380 - positive: an ES256 provider signs in and sends + --- + duration_ms: 15.199494 + type: 'test' + ... +# Subtest: positive: two providers each sign in their own subjects, and one provider's subject is unknown to the other +ok 381 - positive: two providers each sign in their own subjects, and one provider's subject is unknown to the other + --- + duration_ms: 99.562267 + type: 'test' + ... +# Subtest: 1: a forged x-authentik header without a cookie is 401 on the API and a sign-in redirect on a page +ok 382 - 1: a forged x-authentik header without a cookie is 401 on the API and a sign-in redirect on a page + --- + duration_ms: 31.031865 + type: 'test' + ... +# Subtest: 2: an HS256 ID token keyed with the client secret and a real RSA kid is refused +ok 383 - 2: an HS256 ID token keyed with the client secret and a real RSA kid is refused + --- + duration_ms: 61.631873 + type: 'test' + ... +# Subtest: 3: a wrong aud, and an aud list holding another client with no azp, are refused +ok 384 - 3: a wrong aud, and an aud list holding another client with no azp, are refused + --- + duration_ms: 35.735378 + type: 'test' + ... +# Subtest: 4: a token that expired 10 minutes ago is refused +ok 385 - 4: a token that expired 10 minutes ago is refused + --- + duration_ms: 36.739553 + type: 'test' + ... +# Subtest: 5: another issuer, and the issuer without its trailing slash, are refused +ok 386 - 5: another issuer, and the issuer without its trailing slash, are refused + --- + duration_ms: 67.398294 + type: 'test' + ... +# Subtest: 6: a nonce mismatch and a missing nonce are refused +ok 387 - 6: a nonce mismatch and a missing nonce are refused + --- + duration_ms: 33.274077 + type: 'test' + ... +# Subtest: 7: state mismatch, no login cookie, a replay, an expired record and two login cookies are refused +ok 388 - 7: state mismatch, no login cookie, a replay, an expired record and two login cookies are refused + --- + duration_ms: 80.256073 + type: 'test' + ... +# Subtest: 8: the token request carries the PKCE verifier, and the OP refuses a wrong one +ok 389 - 8: the token request carries the PKCE verifier, and the OP refuses a wrong one + --- + duration_ms: 39.183315 + type: 'test' + ... +# Subtest: 9: alg none, a changed payload under a real kid, and an unknown kid even after the refetch are refused +ok 390 - 9: alg none, a changed payload under a real kid, and an unknown kid even after the refetch are refused + --- + duration_ms: 58.226821 + type: 'test' + ... +# Subtest: 10: a valid token for a subject not configured is 403 with one subject-unknown line +ok 391 - 10: a valid token for a subject not configured is 403 with one subject-unknown line + --- + duration_ms: 40.928507 + type: 'test' + ... +# Subtest: 11: start refusals: HS or none algs, reserved names, HS-only discovery, an empty JWKS, no S256, an issuer mismatch, a short RSA key +ok 392 - 11: start refusals: HS or none algs, reserved names, HS-only discovery, an empty JWKS, no S256, an issuer mismatch, a short RSA key + --- + duration_ms: 205.208636 + type: 'test' + ... +# Subtest: 11: slot files: a symlink, mode 0644, mode 0640 and a file under the repository are refused, and no message holds the value +ok 393 - 11: slot files: a symlink, mode 0644, mode 0640 and a file under the repository are refused, and no message holds the value + --- + duration_ms: 1.906874 + type: 'test' + ... +# Subtest: 11: the CLI refuses --sso with the old flags and without console.sso, and starts with a good one +ok 394 - 11: the CLI refuses --sso with the old flags and without console.sso, and starts with a good one + --- + duration_ms: 915.109001 + type: 'test' + ... +# Subtest: 12: under --sso the tester listener refuses each kind of sign-in, has no /auth, and startServer refuses tester with sso +ok 395 - 12: under --sso the tester listener refuses each kind of sign-in, has no /auth, and startServer refuses tester with sso + --- + duration_ms: 68.099187 + type: 'test' + ... +# Subtest: 13: idle and absolute expiry, logout then reuse, a cross-origin logout, and background reads that don't keep a session +ok 396 - 13: idle and absolute expiry, logout then reuse, a cross-origin logout, and background reads that don't keep a session + --- + duration_ms: 56.304766 + type: 'test' + ... +# Subtest: 13: the CSP lets the Sign out form reach the provider's end-session origin, and only under --sso +ok 397 - 13: the CSP lets the Sign out form reach the provider's end-session origin, and only under --sso + --- + duration_ms: 69.196237 + type: 'test' + ... +# Subtest: 14: open redirects land on /, and a path on the Console lands there +ok 398 - 14: open redirects land on /, and a path on the Console lands there + --- + duration_ms: 67.732616 + type: 'test' + ... +# Subtest: 15: a callback for A carrying B's code and iss, and a provider= query, is refused +ok 399 - 15: a callback for A carrying B's code and iss, and a provider= query, is refused + --- + duration_ms: 82.000163 + type: 'test' + ... +# Subtest: 16: a provider with RS256 and ES256 takes either, and refuses PS256 with a usable PS256 key in the JWKS +ok 400 - 16: a provider with RS256 and ES256 takes either, and refuses PS256 with a usable PS256 key in the JWKS + --- + duration_ms: 77.124977 + type: 'test' + ... +# Subtest: 17: 33 started logins leave 32 records, and the first one's callback finds none +ok 401 - 17: 33 started logins leave 32 records, and the first one's callback finds none + --- + duration_ms: 47.8691 + type: 'test' + ... +# Subtest: 18: after a key rotation a sign-in works through one refetch, and the removed kid is refused +ok 402 - 18: after a key rotation a sign-in works through one refetch, and the removed kid is refused + --- + duration_ms: 66.379536 + type: 'test' + ... +# Subtest: 20 and 21: the store holds no raw session id, and the cookie strings are exact +ok 403 - 20 and 21: the store holds no raw session id, and the cookie strings are exact + --- + duration_ms: 36.617809 + type: 'test' + ... +# Subtest: 22: a loopback Host is 403 on a page, a read and a write; /healthz on loopback is 200; a redirect_uri never comes from the Host +ok 404 - 22: a loopback Host is 403 on a page, a read and a write; /healthz on loopback is 200; a redirect_uri never comes from the Host + --- + duration_ms: 23.186372 + type: 'test' + ... +# Subtest: 23: a provider down at start leaves the Console up and 503, and the retry makes sign-in work +ok 405 - 23: a provider down at start leaves the Console up and 503, and the retry makes sign-in work + --- + duration_ms: 207.061378 + type: 'test' + ... +# Subtest: 19: no captured log line holds a token, code, state, nonce, verifier, client secret or session id +ok 406 - 19: no captured log line holds a token, code, state, nonce, verifier, client secret or session id + --- + duration_ms: 4.131558 + type: 'test' + ... +# Subtest: tester Console banner exposes only instance route and name editors and saves a route as tester +ok 407 - tester Console banner exposes only instance route and name editors and saves a route as tester + --- + duration_ms: 737.747081 + type: 'test' + ... +# Subtest: row 177: the tester Console chat composer is enabled and a send shows in its own thread +ok 408 - row 177: the tester Console chat composer is enabled and a send shows in its own thread + --- + duration_ms: 641.295665 + type: 'test' + ... +# Subtest: tester-port validates range tunnel main port and requires configured bus before listening +ok 409 - tester-port validates range tunnel main port and requires configured bus before listening + --- + duration_ms: 833.259979 + type: 'test' + ... +# Subtest: CLI tester listener binds a private Unix socket and spawns TESTER_CLI for every Console bus read +ok 410 - CLI tester listener binds a private Unix socket and spawns TESTER_CLI for every Console bus read + --- + duration_ms: 2589.316324 + type: 'test' + ... +# Subtest: main listener refuses x-mosaic-tester before any board or bus read for every Host +ok 411 - main listener refuses x-mosaic-tester before any board or bus read for every Host + --- + duration_ms: 18.283946 + type: 'test' + ... +# Subtest: tester listener rejects preview binding and requires its fixed logical Host and no proxy auth header +ok 412 - tester listener rejects preview binding and requires its fixed logical Host and no proxy auth header + --- + duration_ms: 101.90921 + type: 'test' + ... +# Subtest: tester listener writes only instances routes and names with tester receipts and actor +ok 413 - tester listener writes only instances routes and names with tester receipts and actor + --- + duration_ms: 115.304654 + type: 'test' + ... +# Subtest: tester listener refuses every human-only write with no bus call +ok 414 - tester listener refuses every human-only write with no bus call + --- + duration_ms: 79.256339 + type: 'test' + ... +# Subtest: tester-off and tester-required reads return HTTP 403 +ok 415 - tester-off and tester-required reads return HTTP 403 + --- + duration_ms: 83.144599 + type: 'test' + ... +# Subtest: tester credentials routes and committed project reads keep secrets and paths bounded +ok 416 - tester credentials routes and committed project reads keep secrets and paths bounded + --- + duration_ms: 147.274456 + type: 'test' + ... +# Subtest: row 177 W1: the tester chat makes, sends to, opens and reads its own thread as tester +ok 417 - row 177 W1: the tester chat makes, sends to, opens and reads its own thread as tester + --- + duration_ms: 22.754152 + type: 'test' + ... +# Subtest: row 177 W2: tester chat writes refuse a missing or foreign Origin, cross-site, text/plain and the proxy header with no bus call +ok 418 - row 177 W2: tester chat writes refuse a missing or foreign Origin, cross-site, text/plain and the proxy header with no bus call + --- + duration_ms: 11.51605 + type: 'test' + ... +# Subtest: row 177 W3: the human thread through the tester chat is thread-not-owned, and bus.tester off answers tester-off +ok 419 - row 177 W3: the human thread through the tester chat is thread-not-owned, and bus.tester off answers tester-off + --- + duration_ms: 28.538842 + type: 'test' + ... +# Subtest: row 177 W4: the main listener refuses x-mosaic-tester on chat reads and writes before the chat +ok 420 - row 177 W4: the main listener refuses x-mosaic-tester on chat reads and writes before the chat + --- + duration_ms: 2.038726 + type: 'test' + ... +# Subtest: Row 252: the tester listener has no decision answer routes, and its config never offers them +ok 421 - Row 252: the tester listener has no decision answer routes, and its config never offers them + --- + duration_ms: 80.202387 + type: 'test' + ... +# Subtest: private tester HTTP serves on 0600 socket in 0700 parent and fixed origin +ok 422 - private tester HTTP serves on 0600 socket in 0700 parent and fixed origin + --- + duration_ms: 64.209284 + type: 'test' + ... +# Subtest: private tester refuses symlink, unsafe parent and long path without repairs +ok 423 - private tester refuses symlink, unsafe parent and long path without repairs + --- + duration_ms: 0.851026 + type: 'test' + ... +# Subtest: tester cleanup must leave a replacement inode untouched +ok 424 - tester cleanup must leave a replacement inode untouched + --- + duration_ms: 1.567063 + type: 'test' + ... +# Subtest: row278 browser lists held claims and release preserves role rows and totals +ok 425 - row278 browser lists held claims and release preserves role rows and totals + --- + duration_ms: 668.348588 + type: 'test' + ... +# Subtest: row278 browser claims 403 stays local and role section remains byte-equal +ok 426 - row278 browser claims 403 stays local and role section remains byte-equal + --- + duration_ms: 683.057612 + type: 'test' + ... +# Subtest: row278 browser renders only four escaped claim fields and never instance or other extras +ok 427 - row278 browser renders only four escaped claim fields and never instance or other extras + --- + duration_ms: 532.903839 + type: 'test' + ... +# Subtest: row278 browser sign-out removes claims and prevents reuse of cached answers +ok 428 - row278 browser sign-out removes claims and prevents reuse of cached answers + --- + duration_ms: 672.414544 + type: 'test' + ... +# Subtest: row278 tester browser keeps role rows without requesting the owner claims section +ok 429 - row278 tester browser keeps role rows without requesting the owner claims section + --- + duration_ms: 572.802787 + type: 'test' + ... +# Subtest: row278 browser discards a late claims answer after sign-out +ok 430 - row278 browser discards a late claims answer after sign-out + --- + duration_ms: 558.795811 + type: 'test' + ... +# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus +ok 431 - row278 HTTP read returns held claims without send and refuses arguments before the bus + --- + duration_ms: 30.267964 + type: 'test' + ... +# Subtest: row278 HTTP read preserves bus refusal and rejects a malformed result +ok 432 - row278 HTTP read preserves bus refusal and rejects a malformed result + --- + duration_ms: 8.568849 + type: 'test' + ... +# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls +ok 433 - row278 tester socket refuses thread claims explicitly with zero bus calls + --- + duration_ms: 4.618483 + type: 'test' + ... +# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport +ok 434 - row278 Console adapter calls argument-free thread.claims through the normal transport + --- + duration_ms: 118.138257 + type: 'test' + ... +# Subtest: 193d HTTP shares use the caller, plain/shared lists, exact args and write fences +ok 435 - 193d HTTP shares use the caller, plain/shared lists, exact args and write fences + --- + duration_ms: 72.922016 + type: 'test' + ... +# Subtest: 193d config supplies only the signed-in user live collaborator scopes and updates on downgrade +ok 436 - 193d config supplies only the signed-in user live collaborator scopes and updates on downgrade + --- + duration_ms: 36.54772 + type: 'test' + ... +# Subtest: 193d viewer UI has no composer, resume, share, session mutations or create controls +ok 437 - 193d viewer UI has no composer, resume, share, session mutations or create controls + --- + duration_ms: 515.530696 + type: 'test' + ... +# Subtest: 193d mixed grants keep viewer project read-only and collaborator own thread writable; downgrade hides controls +ok 438 - 193d mixed grants keep viewer project read-only and collaborator own thread writable; downgrade hides controls + --- + duration_ms: 586.998388 + type: 'test' + ... +# Subtest: 193d owner has share controls on own threads and shared threads remain read-only +ok 439 - 193d owner has share controls on own threads and shared threads remain read-only + --- + duration_ms: 465.606312 + type: 'test' + ... +# Subtest: 193d bypassed UI checks still reach a refusing bus for every viewer write +ok 440 - 193d bypassed UI checks still reach a refusing bus for every viewer write + --- + duration_ms: 505.788967 + type: 'test' + ... +# Subtest: 193d collaborator shares stay read-only and never expose reshare or wake controls +ok 441 - 193d collaborator shares stay read-only and never expose reshare or wake controls + --- + duration_ms: 476.44394 + type: 'test' + ... +# Subtest: REQ-LIMIT-4 Settings shows all token kinds and unknown turns beside every total, as a read-only separate section +ok 442 - REQ-LIMIT-4 Settings shows all token kinds and unknown turns beside every total, as a read-only separate section + --- + duration_ms: 487.327194 + type: 'test' + ... +# Subtest: REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted +ok 443 - REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted + --- + duration_ms: 26.983802 + type: 'test' + ... +# Subtest: REQ-WEB-1 malformed usage is refused instead of shown as zero +ok 444 - REQ-WEB-1 malformed usage is refused instead of shown as zero + --- + duration_ms: 5.228822 + type: 'test' + ... +# Subtest: R6-N1 with the userRoute gate open, a user session reaches no owner option over HTTP +ok 445 - R6-N1 with the userRoute gate open, a user session reaches no owner option over HTTP + --- + duration_ms: 117.258698 + type: 'test' + ... +# Subtest: Queue, Business and Settings in their five states, with no move button +ok 446 - Queue, Business and Settings in their five states, with no move button + --- + duration_ms: 2991.730225 + type: 'test' + ... +# Subtest: seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words +ok 447 - seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words + --- + duration_ms: 1164.026732 + type: 'test' + ... +# Subtest: the server log names no config path when the system config refuses +ok 448 - the server log names no config path when the system config refuses + --- + duration_ms: 315.407973 + type: 'test' + ... +1..448 +# tests 458 +# suites 0 +# pass 458 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 270010.020958 diff --git a/agents/fethry/work/queue-266/manifest.r1.sha256 b/agents/fethry/work/queue-266/manifest.r1.sha256 new file mode 100644 index 000000000..576c5247a --- /dev/null +++ b/agents/fethry/work/queue-266/manifest.r1.sha256 @@ -0,0 +1,10 @@ +db30ea0f64bd72a5e263d8ea699d5ae561e3c2f6d3f9d1e80a035823078e1531 packages/bus/src/broker.mjs +dac7cdd892b9965c64b16d138a49e4a0c4f5fd2189359780daf97ab7271c1938 packages/bus/tests/room-check.test.mjs +789132601745a94027f9e9184e7fef1f70cff0cba450afed5cca647f683591f4 packages/plugins/channel/webui/index.mjs +fe9b591422b5f793061a97f3fab92d817ce8ee9ca69830da2a9f4732f9ee37c6 packages/plugins/tests/room-channel.test.mjs +3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b packages/webui/src/chat-http.mjs +fe2072a7198771a82f58dca5fc05aa4d697dd3db25a206fb2a24c8514010b069 packages/webui/src/chat.mjs +c02235d52dc4884a8d49b279b1724274627ad027304c255ebaebd0bc198788a4 packages/webui/src/public/chat.css +abfed92be8c57024ee590a7669cdc7cabfbfece88f92c953a3bef2bedba412dd packages/webui/src/public/chat.js +92c0e956ef076af21c986b52e6f461f711b0b0e9115956cb1bcbeac0942a153c packages/webui/tests/room-browser.test.mjs +5b79a7523f087bec91d5c8a31ad59d9b34b21716a7032e120a4fe8358c72b5ce packages/webui/tests/room-http.test.mjs diff --git a/agents/fethry/work/queue-266/mutants.py b/agents/fethry/work/queue-266/mutants.py new file mode 100644 index 000000000..98d4f9fee --- /dev/null +++ b/agents/fethry/work/queue-266/mutants.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Isolated room mutants. Own worktree dependencies, assertion kills only, killpg after each run.""" +import argparse, hashlib, json, os, signal, subprocess, tarfile, tempfile, time +from pathlib import Path +ROOT = Path(__file__).resolve().parents[4] +UI = 'packages/webui/src/public/chat.js' +HTTP = 'packages/webui/src/chat-http.mjs' +BROKER = 'packages/bus/src/broker.mjs' +PLUGIN = 'packages/plugins/channel/webui/index.mjs' +SEAM = 'packages/webui/src/chat.mjs' +BROWSER_TEST = 'packages/webui/tests/room-browser.test.mjs' +HTTP_TEST = 'packages/webui/tests/room-http.test.mjs' +BUS_TEST = 'packages/bus/tests/room-check.test.mjs' +PLUGIN_TEST = 'packages/plugins/tests/room-channel.test.mjs' +MUTANTS = [ + ('M01-plugin', PLUGIN, ' "room.open",\n', '', PLUGIN_TEST), + ('M02-seam-body', SEAM, "channel('room.send', { project, body })", "channel('room.send', { project, body: body.trim() })", HTTP_TEST), + ('M03-page-cursor', HTTP, 'value.at(-1)?.ids.at(-1)', 'value.at(-1)?.id', HTTP_TEST), + ('M04-room-status', HTTP, 'Object.keys(ROOM_LINES).map(code => [code, 409])', 'Object.keys(ROOM_LINES).map(code => [code, 400])', HTTP_TEST), + ('M05-strict-body', HTTP, "!exact(v, ['body']) || ", '', HTTP_TEST), + ('M06-receipt-type', HTTP, "typeof t.instance === 'string' && ", '', HTTP_TEST), + ('M07-room-check', BROKER, 'return entries.map((m) => this.#withCheck(m));', 'return entries;', BUS_TEST), + ('M08-room-last', BROKER, "['thread.messages', 'room.read'].includes(request.verb)", "['thread.messages'].includes(request.verb)", BUS_TEST), + ('M09-browser-body', UI, 'request(`rooms/${c.id}/messages`, { body })', 'request(`rooms/${c.id}/messages`, { body: body.trim() })', BROWSER_TEST), + ('M10-members', UI, 'catalog.rows.filter(m => threads.rows.some(t => t.project === id && t.instance === m.instance && t.name === m.instance))', 'catalog.rows', BROWSER_TEST), + ('M11-checked-render', UI, 'messageBody({ ...m, from_role:', 'messageBody({ ...m, check: null, from_role:', BROWSER_TEST), + ('M12-leading-tags', UI, 'let body = input.trimStart();', 'let body = input;', BROWSER_TEST), + ('M13-readonly', UI, 'if (!roomOwner() || !c.canSend || !c.roomReady || out())', 'if (!roomOwner() || !c.roomReady || out())', BROWSER_TEST), + ('M14-uncertainty', HTTP, 'write ? sendOutcome(err) :', "write ? { code: 'invalid-request', sent: false } :", HTTP_TEST), + ('M15-pending', UI, ' if (s.pending) return;', '', BROWSER_TEST), + ('M16-body-dedup', UI, 'new Map((after ? [...s.rows, ...page.rows] : page.rows).map(m => [m.id, m]))', 'new Map((after ? [...s.rows, ...page.rows] : page.rows).map(m => [m.body, m]))', BROWSER_TEST), +] +def sha(p): return hashlib.sha256(p.read_bytes()).hexdigest() +def main(): + p=argparse.ArgumentParser(); p.add_argument('--output',type=Path,required=True);p.add_argument('--only');a=p.parse_args() + names=set(a.only.split(',')) if a.only else {m[0] for m in MUTANTS} + assert names <= {m[0] for m in MUTANTS} + assert not subprocess.check_output(['git','status','--porcelain','--','packages'],cwd=ROOT,text=True).strip(),'Commit tested packages first' + assert (ROOT/'node_modules').is_dir() and not (ROOT/'node_modules').is_symlink(),'Local install required' + before={f:sha(ROOT/f) for f in {m[1] for m in MUTANTS}} + head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip() + a.output.mkdir(parents=True,exist_ok=True);results=[] + with tempfile.TemporaryDirectory(prefix='fethry266-mutants-') as temp: + temp=Path(temp);archive=temp/'source.tar' + with archive.open('wb') as stream: + subprocess.run(['git','archive','HEAD','packages','roles','contracts','tasks','missions','package.json','RELEASE'],cwd=ROOT,stdout=stream,check=True) + for name,target,old,new,test in MUTANTS: + if name not in names:continue + tree=temp/name;tree.mkdir() + with tarfile.open(archive) as bundle:bundle.extractall(tree,filter='data') + (tree/'node_modules').symlink_to(ROOT/'node_modules',target_is_directory=True) + path=tree/target;source=path.read_text();hits=source.count(old) + assert hits==1,(name,'anchor hits',hits) + path.write_text(source.replace(old,new,1));limit=240 if test==BROWSER_TEST else 120 + cmd=['timeout','-k','10',str(limit),'node','--test','--test-reporter=tap','--test-concurrency=1','--test-timeout=30000',test] + signals=[];started=time.monotonic() + with (a.output/(name+'.tap')).open('w') as log: + child=subprocess.Popen(cmd,cwd=tree,env={**os.environ,'MOSAIC_REQUIRE_EDITOR_BUILD':'1'},stdout=log,stderr=subprocess.STDOUT,start_new_session=True) + try:code=child.wait(timeout=limit+15) + except subprocess.TimeoutExpired:os.killpg(child.pid,signal.SIGKILL);signals.append('KILL');code=child.wait() + finally: + try: + os.killpg(child.pid,signal.SIGTERM);signals.append('TERM');time.sleep(.2) + try:os.killpg(child.pid,signal.SIGKILL);signals.append('KILL') + except ProcessLookupError:pass + except ProcessLookupError:pass + path.write_text(source) + restored=sha(path)==hashlib.sha256(source.encode()).hexdigest();unchanged=before=={f:sha(ROOT/f) for f in before} + assert restored and unchanged,(name,'restore changed') + output=(a.output/(name+'.tap')).read_text() + killed=code==1 and 'ERR_ASSERTION' in output and 'not ok ' in output and "failureType: 'hookFailed'" not in output and '# cancelled 0\n' in output and '# skipped 0\n' in output + result={'mutant':name,'test':test,'exit':code,'killed':killed,'hits':hits,'restored':restored,'candidateUnchanged':unchanged,'seconds':round(time.monotonic()-started,3),'cleanupSignals':signals} + results.append(result);print(json.dumps(result),flush=True) + if not killed:break + report={'source':head,'selected':sorted(names),'candidateUnchanged':before=={f:sha(ROOT/f) for f in before},'results':results} + (a.output/'summary.json').write_text(json.dumps(report,indent=2)+'\n') + if len(results)!=len(names) or not all(r['killed'] for r in results):raise SystemExit(1) +if __name__=='__main__':main() diff --git a/agents/fethry/work/queue-266/pin-audit-after.txt b/agents/fethry/work/queue-266/pin-audit-after.txt new file mode 100644 index 000000000..ed94b6064 --- /dev/null +++ b/agents/fethry/work/queue-266/pin-audit-after.txt @@ -0,0 +1,19 @@ +packages/webui/src/public/chat.js: old=52828c03b618e3754f0e59a395f4bcc16d1c9d8db01d403406a67ca0934f0188 new=abfed92be8c57024ee590a7669cdc7cabfbfece88f92c953a3bef2bedba412dd + packages/webui/tests/chat.test.mjs:319: for (const name of ['chat.js', 'chat.css']) { + packages/webui/tests/browser.test.mjs:21: // Rows 129, 154, 191, 194 and 294: chat.js, editor.js, processing.js, agents.js and federation.js are the scripts added, same origin; the list is the pin, so another script is a visible change. + packages/webui/tests/browser.test.mjs:22: assert.deepEqual(await b.evaluate('[...document.querySelectorAll("script")].map(s => s.getAttribute("src"))'), ['/editor.js', '/processing.js', '/federation.js', '/brand.js', '/app.js', '/markdown + packages/webui/tests/browser.test.mjs:24: assert.equal(await b.evaluate(`document.querySelectorAll('script[src="/chat.js"]').length`), 1); + packages/webui/tests/chat-sessions-access.test.mjs:34: if(url.pathname === '/') {res.writeHead(200,{'content-type':'text/html'});res.end('Session access fixture
');retur + packages/webui/tests/chat-sessions-access.test.mjs:35: if(url.pathname === '/chat.js') {res.writeHead(200,{'content-type':'text/javascript'});res.end(readFileSync(new URL('../src/public/chat.js',import.meta.url)));return;} + packages/webui/tests/thread-sharing-fixture.mjs:52: const source = readFileSync(new URL('../src/public/chat.js', import.meta.url), 'utf8'); + packages/webui/tests/thread-sharing-fixture.mjs:69: if (url.pathname === '/chat.js') { res.writeHead(200, { 'content-type': 'text/javascript' }); return res.end(chatSource); } + packages/webui/tests/thread-sharing-fixture.mjs:72: return res.end('Sharing fixture
'); + literal old/current 64-hex hits in tests: [] +packages/webui/src/chat-http.mjs: old=854c86ae3fa6bfcdcfedbf49c2d3b50815a3ca6ce5849ff5f1c56d1aa1a55288 new=3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b + packages/webui/tests/chat.test.mjs:273: const { chatHTTP } = await import('../src/chat-http.mjs'); + packages/webui/tests/thread-sharing-fixture.mjs:9: import { chatHTTP } from '../src/chat-http.mjs'; + literal old/current 64-hex hits in tests: [] +packages/plugins/channel/webui/index.mjs: old=718139cae4a0bcd10bab4b334f560c28911509e4875b04618e6880d1579d9466 new=789132601745a94027f9e9184e7fef1f70cff0cba450afed5cca647f683591f4 + packages/plugins/tests/room-channel.test.mjs:3: import { dispatch } from '../channel/webui/index.mjs'; + packages/cli/tests/fixtures/federation-host.mjs:51: `export * from ${JSON.stringify(new URL('../../../plugins/channel/webui/index.mjs', import.meta.url).href)};`)), + literal old/current 64-hex hits in tests: [] diff --git a/agents/fethry/work/queue-266/pin-audit-before.txt b/agents/fethry/work/queue-266/pin-audit-before.txt new file mode 100644 index 000000000..38fa252fa --- /dev/null +++ b/agents/fethry/work/queue-266/pin-audit-before.txt @@ -0,0 +1,3 @@ +packages/webui/src/public/chat.js 52828c03b618e3754f0e59a395f4bcc16d1c9d8db01d403406a67ca0934f0188 +packages/webui/src/chat-http.mjs 854c86ae3fa6bfcdcfedbf49c2d3b50815a3ca6ce5849ff5f1c56d1aa1a55288 +packages/plugins/channel/webui/index.mjs 718139cae4a0bcd10bab4b334f560c28911509e4875b04618e6880d1579d9466 diff --git a/agents/fethry/work/queue-266/run-gate.py b/agents/fethry/work/queue-266/run-gate.py new file mode 100644 index 000000000..a80d9598e --- /dev/null +++ b/agents/fethry/work/queue-266/run-gate.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +"""Owned worktree gate, with a fresh process group and bounded cleanup per command.""" +import json, os, signal, subprocess, sys, time +from pathlib import Path +root = Path(__file__).resolve().parents[4] +scratch = Path(sys.argv[1]); scratch.mkdir(parents=True, exist_ok=True) +env = {**os.environ, 'TMPDIR': str(scratch), 'MOSAIC_REQUIRE_EDITOR_BUILD': '1'} +env.pop('MOSAIC_LIVE_PROVIDER', None) +node = ['node', '--test', '--test-reporter=tap', '--test-concurrency=1', '--test-timeout=30000'] +steps = [('editor-build', 120, ['npm', 'run', 'build:editor'], root / 'packages/webui'), + ('webui-full', 900, node + ['packages/webui/tests/'], root), + ('plugins-full', 300, node + ['packages/plugins/tests/'], root), + ('bus-full', 1200, node + ['packages/bus/tests/'], root)] +steps += [(p.stem, 1200, ['bash', str(p)], root) for p in sorted((root / 'scripts').glob('test-*.sh'))] +if '--scripts-only' in sys.argv[2:]: + steps = [step for step in steps if step[0].startswith('test-')] +if '--t9-reruns' in sys.argv[2:]: + steps = [(f't9-rerun-{i}', 120, node + ['packages/bus/tests/library-credential.test.mjs'], root) for i in range(1, 4)] + [('bus-rerun', 1200, node + ['packages/bus/tests/'], root)] +results = [] +summary = scratch / ('scripts-summary.json' if '--scripts-only' in sys.argv[2:] else 'rerun-summary.json' if '--t9-reruns' in sys.argv[2:] else 'gate-summary.json') +for name, limit, command, cwd in steps: + started = time.monotonic(); signals = [] + with (scratch / (name + '.tap')).open('w') as log: + child = subprocess.Popen(['timeout', '-k', '10', str(limit), *command], cwd=cwd, env=env, + stdout=log, stderr=subprocess.STDOUT, start_new_session=True) + try: + code = child.wait(timeout=limit + 15) + except subprocess.TimeoutExpired: + os.killpg(child.pid, signal.SIGKILL); signals.append('KILL'); code = child.wait() + finally: + # This group was created for this command; never signal any other seat's group. + try: + os.killpg(child.pid, signal.SIGTERM); signals.append('TERM'); time.sleep(.2) + try: os.killpg(child.pid, signal.SIGKILL); signals.append('KILL') + except ProcessLookupError: pass + except ProcessLookupError: pass + entry = {'step': name, 'command': command, 'cwd': str(cwd), 'outerSeconds': limit, + 'exit': code, 'seconds': round(time.monotonic()-started, 3), 'cleanupSignals': signals} + results.append(entry); summary.write_text(json.dumps(results, indent=2) + '\n') + print(json.dumps(entry), flush=True) + if code: sys.exit(code if 0 < code < 126 else 1) diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 19acb8b6a..101417fa9 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1678,3 +1678,4 @@ are never rewritten or removed; corrections are new entries. - 2026-10-24 — steelbeak — row 287 C2-21 (#1792), builder complete under sage-4130: collaborator library grants and chief real read mint built; bus 998/business 283/CLI 989+FED1/Docker2/install27/all12 shell gates green, M1-M11 killed/restored, token/cleanup audits clean; preparing steelbeak/row287 push and manifest handoff to Boyd then Dewey, no live change or landing. - 2026-10-24 — steelbeak — row 287 first-review follow-up: Boyd approved c2338ed58/3683b40... with two doc-only corrections; append-only BUILD correction distinguishes clean product/test diff from raw-log whitespace and records old-test numstats. Queue round1 open; missing-seat-credential request failure reported to Sage. Frozen product and manifest preserved; no tests or slot use. 2026-10-24T16:12:35Z | Sage (1ef1e4f8) | Rows 225 and 287 landed (mos-1576, mos-1590) | 225 9b6345466 (Dewey c31599, gate GREEN 15:54:58Z, #1726 closed c31604); 287 0e935776e (Boyd c31602, Dewey c31603, gate GREEN 16:11:38Z, #1792 closed c31606); F-C owner-push follow-up and Dewey N1-N3 recorded in BUILD-LOG; no re-pin. +2026-10-24 | Fethry14f80e3c | Row266 C2-10c (#1771), sage4154/4156 | New fethry/row266 worktree from962046aaa, doc-only fast-forward487500a16. Read pinned brief and amendment; local npm ci roots, no links. Identified room.read missing guard check/last; Sage authorized bounded broker hydration amendment and re-pin. Owner start retried after stale-pin refusal; design/current-code notes in agents/fethry/work/queue-266/BUILD.md. Slot held; RED-first new tests next; no production edits yet. diff --git a/packages/bus/src/broker.mjs b/packages/bus/src/broker.mjs index 8733d5a49..8c6d0cdb2 100644 --- a/packages/bus/src/broker.mjs +++ b/packages/bus/src/broker.mjs @@ -4851,7 +4851,7 @@ export class Broker { if (this.#guardPass?.s !== s) { if (request.verb === 'message.send' && this.#guarded(s, args.to)) return this.#guardedSend(cap, s, request, structuredClone(args)); - if (request.verb === 'thread.messages' && this.#libraryProject(s.business) && this.#library?.last) + if (['thread.messages', 'room.read'].includes(request.verb) && this.#libraryProject(s.business) && this.#library?.last) return this.#withLast(cap, s, request); } if (CREDENTIAL_VERBS.includes(request.verb)) return this.#requestCredential(s, request.verb, structuredClone(args)); @@ -5424,6 +5424,11 @@ export class Broker { } return this.#reenter(cap, s, { verb: 'message.send', args }, check); } + // The same immutable check evidence is attached to both thread and merged room reads. + #withCheck(m) { + const e = this.#store.get("SELECT body FROM events WHERE id=? AND kind='action.allowed' AND subject=?", checkEventId(m.id), m.id); + return e ? { ...m, check: JSON.parse(e.body).check } : m; + } // C2-06 (sage-3595, morgana-0200): each path cite of a checked row gains `last`, the file's last commit // at the served tip, one git call per distinct path. Rows without `check` are unchanged. async #withLast(cap, s, request) { @@ -6700,7 +6705,7 @@ export class Broker { } previous = m; } - return entries; + return entries.map((m) => this.#withCheck(m)); } // A thread belongs to the user who made it and to one declared thread instance. // Row 177 (#1675): a tester's thread is owned by `tester`, so neither reaches the other's. @@ -6827,10 +6832,7 @@ export class Broker { `SELECT m.* FROM messages m JOIN message_threads mt ON mt.message=m.id WHERE mt.session=? AND m.seq>? ORDER BY m.seq LIMIT ${limit}`, session, after, - ).map((m) => { - const e = this.#store.get("SELECT body FROM events WHERE id=? AND kind='action.allowed' AND subject=?", checkEventId(m.id), m.id); - return e ? { ...m, check: JSON.parse(e.body).check } : m; - }); + ).map((m) => this.#withCheck(m)); } // Row 206 (193b2, #1704, design 5.3): the owner of a thread shares it read-only, or ends a share. // A user's collaborator grant must still cover the thread, and a user target needs a live grant diff --git a/packages/bus/tests/room-check.test.mjs b/packages/bus/tests/room-check.test.mjs new file mode 100644 index 000000000..51307a1ee --- /dev/null +++ b/packages/bus/tests/room-check.test.mjs @@ -0,0 +1,43 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { mkdtempSync, readFileSync, rmSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { Broker } from '../src/broker.mjs'; +import { Store } from '../src/store.mjs'; +import { citationWorld, citedBody, fixtureCite } from './citation-helpers.mjs'; + +test('C2-10c room.read carries exactly the thread check and current file last', async t => { + const f = citationWorld(t, { definition: 'companion' }); + const room = f.call(f.human, 'room.open', { project: f.store.get('SELECT id FROM projects').id }); + const thread = room.threads[0].id; + const agent = f.broker.bindLaunch({ ...f.launch, run: 'room-agent', thread }); + f.call(agent, 'role.claim'); + const sent = await f.call(agent, 'message.send', { to: 'human', body: citedBody([fixtureCite(f.commit)]) }); + const [single] = await f.call(f.human, 'thread.messages', { thread }); + const merged = await f.call(f.human, 'room.read', { project: room.project }); + const same = merged.find(m => m.id === sent.id); + assert.deepEqual(same.check, single.check); + assert.deepEqual(same.check.citations, [{ scope: 'canon', agent: null, file: f.commit, last: f.commit }]); + assert.equal(f.reads.length, 2, 'both read verbs route through last hydration'); +}); + +test('C2-10c check hydration preserves unchecked rows and one broadcast with two addressees', t => { + const root = mkdtempSync(join(tmpdir(), 'room-check-')), store = new Store(root); + t.after(() => { store.close(); rmSync(root, { recursive: true, force: true }); }); + const messaging = JSON.parse(readFileSync(new URL('../../../roles/companion.json', import.meta.url))).messaging; + const role = { definition: 'companion', authority: { withinRole: ['message.send'], crossRole: [] } }; + const broker = new Broker({ store, businesses: { demo: { id: 'demo', human: 'jason', vars: {}, + arbiters: { technical: 'bean', delivery: 'bean' }, roles: { bean: role, chet: role }, definitions: { companion: { messaging } } } } }); + const human = broker.bindHuman({ business: 'demo', human: 'jason', via: 'cli', outsideAgent: true }); + const call = (verb, args) => broker.request(human, { verb, args }); + const project = call('project.create', { name: 'Room' }).id; + call('room.open', { project }); + const receipt = call('room.send', { project, body: 'One broadcast.' }); + const rows = call('room.read', { project }); + assert.equal(rows.length, 1); + assert.deepEqual(rows[0].ids, receipt.ids); + assert.deepEqual(rows[0].to, ['bean', 'chet']); + assert.equal(Object.hasOwn(rows[0], 'check'), false); + assert.equal(rows[0].body, 'One broadcast.'); +}); diff --git a/packages/plugins/channel/webui/index.mjs b/packages/plugins/channel/webui/index.mjs index 7b661ae1b..8dd4d7749 100644 --- a/packages/plugins/channel/webui/index.mjs +++ b/packages/plugins/channel/webui/index.mjs @@ -2,6 +2,9 @@ import { PluginError } from "../../src/kinds.mjs"; export const interfaceVersion = 1; const VERBS = new Set([ + "room.open", + "room.read", + "room.send", "project.list", "project.create", "thread.list", diff --git a/packages/plugins/tests/room-channel.test.mjs b/packages/plugins/tests/room-channel.test.mjs new file mode 100644 index 000000000..6eb4aff5c --- /dev/null +++ b/packages/plugins/tests/room-channel.test.mjs @@ -0,0 +1,18 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { dispatch } from '../channel/webui/index.mjs'; + +test('C2-10c webui permits exactly the three added room verbs and preserves core refusals', async () => { + for (const verb of ['room.open', 'room.read', 'room.send']) { + const calls = [], args = { project: 'p', body: 'typed @name' }; + assert.deepEqual(await dispatch({ verb, args }, { call: async (...a) => { calls.push(a); return { ok: verb }; } }), { ok: verb }); + assert.deepEqual(calls, [[verb, args]]); + const refused = Object.assign(new Error('refused'), { code: 'unknown-addressee' }); + await assert.rejects(dispatch({ verb, args }, { call: async () => { throw refused; } }), e => e === refused); + } + for (const verb of ['room.delete', 'room.members', 'message.send', 'role.claim', 'shell.exec']) { + let called = false; + await assert.rejects(dispatch({ verb, args: {} }, { call: async () => { called = true; } }), { code: 'channel-operation' }); + assert.equal(called, false); + } +}); diff --git a/packages/webui/src/chat-http.mjs b/packages/webui/src/chat-http.mjs index e04f26202..ce5367415 100644 --- a/packages/webui/src/chat-http.mjs +++ b/packages/webui/src/chat-http.mjs @@ -9,7 +9,14 @@ const json = (res, status, value) => { res.writeHead(status, { 'content-type': 'application/json', 'cache-control': 'no-store' }); res.end(JSON.stringify(value)); }; +const ROOM_LINES = Object.freeze({ + 'unknown-addressee': 'Unknown addressee. Choose a room member.', + 'addressee-ambiguous': "That addressee is ambiguous. Use a room member's instance name.", + 'room-thread-name-taken': 'A room thread name is already in use. Resolve the conflicting thread before opening the room.', + 'room-not-open': 'This room is not open. Open the room before sending.', +}); const STATUS = { + ...Object.fromEntries(Object.keys(ROOM_LINES).map(code => [code, 409])), 'channel-disabled': 503, 'invalid-request': 400, 'unknown-repo': 400, 'message-not-found': 400, 'project-not-found': 404, 'thread-not-found': 404, 'thread-not-owned': 403, @@ -26,6 +33,7 @@ const STATUS = { 'access-refused': 403, 'access-revoked': 401, }; function safeMessage(code) { + if (Object.hasOwn(ROOM_LINES, code)) return ROOM_LINES[code]; if (code === 'unknown-verb' || code === 'channel-operation') return 'This session operation is unavailable until its dependency is installed.'; if (code === 'channel-disabled') return 'Run mosaic plugins to read the revision, then mosaic plugins set --file PATCH with plugins.channel set to ["cli","webui"].'; if (code === 'thread-not-owned') return 'This thread is not available to this user.'; @@ -53,7 +61,7 @@ const exact = (value, allowed, required = allowed) => Object.keys(value).every(k => allowed.includes(k)) && required.every(k => Object.hasOwn(value, k)); export async function chatHTTP(req, res, { path, search, chat, named, send, preview, log }) { const write = req.method === 'POST'; - let action, args, thread; + let action, args, thread, room; const refuse = (status, code, sent = false) => json(res, status, { error: code, message: safeMessage(code), ...(write ? { sent } : {}), }); @@ -73,6 +81,12 @@ export async function chatHTTP(req, res, { path, search, chat, named, send, prev if (one(req, 'sec-fetch-site') !== 'same-origin') return refuse(403, 'cross-site'); } try { + const roomMatch = /^\/api\/chat\/rooms\/([^/]+)\/(open|messages)$/.exec(path); + if (roomMatch) { + room = roomMatch[1]; + if (!id(room)) throw Error(); + if (preview?.tester) return refuse(403, 'human-required'); + } const match = /^\/api\/chat\/threads\/([^/]+)\/(messages|open|sessions|clear|cancel|operation|shares|share|unshare)$/.exec(path); if (match) { thread = match[1]; @@ -82,7 +96,15 @@ export async function chatHTTP(req, res, { path, search, chat, named, send, prev if (write) { query(search, []); const v = await payload(req); - if (path === '/api/chat/projects') { + if (roomMatch) { + if (roomMatch[2] === 'open') { + if (!exact(v, [])) throw Error(); + action = 'roomOpen'; args = { project: room }; + } else { + if (!exact(v, ['body']) || typeof v.body !== 'string' || !v.body.trim() || v.body.length > 32768) throw Error(); + action = 'roomSend'; args = { project: room, body: v.body }; + } + } else if (path === '/api/chat/projects') { if (!exact(v, ['name', 'repo'], ['name']) || !name(v.name) || (Object.hasOwn(v, 'repo') && (typeof v.repo !== 'string' || !KEY.test(v.repo)))) throw Error(); action = 'createProject'; args = v; @@ -110,6 +132,12 @@ export async function chatHTTP(req, res, { path, search, chat, named, send, prev if (!exact(v, ['session'], []) || (Object.hasOwn(v, 'session') && !id(v.session))) throw Error(); action = 'open'; args = { thread, ...(v.session ? { session: v.session } : {}) }; } else return refuse(404, 'not-found'); + } else if (roomMatch) { + if (roomMatch[2] !== 'messages') return refuse(405, 'method-not-allowed'); + const q = query(search, ['after', 'limit']); + if (q.has('after') && !id(q.get('after'))) throw Error(); + if (q.has('limit') && (!/^[1-9]\d*$/.test(q.get('limit')) || Number(q.get('limit')) > 200)) throw Error(); + action = 'roomRead'; args = { project: room, limit: q.has('limit') ? Number(q.get('limit')) : 100, ...(q.has('after') ? { after: q.get('after') } : {}) }; } else if (path === '/api/chat/projects') { query(search, []); action = 'projects'; args = {}; } else if (path === '/api/chat/threads') { @@ -139,7 +167,24 @@ export async function chatHTTP(req, res, { path, search, chat, named, send, prev const line = outcome => log(`${new Date().toISOString()} chat action=${action} user=${JSON.stringify(preview?.user ?? null)} ${outcome}`); try { const value = await chat[action](args); - if (action === 'sessionOperation' || action === 'clearSession' || action === 'cancelSession') { + if (action === 'roomOpen' || action === 'roomSend') { + const valid = action === 'roomOpen' + ? value?.project === room && Array.isArray(value.threads) && value.threads.length > 0 && value.threads.every(t => id(t?.id) && typeof t.instance === 'string' && KEY.test(t.instance) && t.name === t.instance) + && new Set(value.threads.map(t => t.id)).size === value.threads.length && new Set(value.threads.map(t => t.instance)).size === value.threads.length + : Array.isArray(value?.ids) && value.ids.length > 0 && value.ids.every(id) && new Set(value.ids).size === value.ids.length + && Array.isArray(value.to) && value.to.length === value.ids.length && value.to.every(k => typeof k === 'string' && KEY.test(k)) && new Set(value.to).size === value.to.length; + if (!valid) { line('error=outcome-unknown'); return refuse(503, 'outcome-unknown', 'unknown'); } + line(`project=${room}`); + return json(res, 200, action === 'roomOpen' + ? { project: room, threads: value.threads.map(({ id, instance, name }) => ({ id, instance, name })) } + : { ids: value.ids, to: value.to }); + } + if (action === 'roomRead') { + if (!Array.isArray(value) || value.some(m => !id(m?.id) || !Array.isArray(m.ids) || !m.ids.length || m.ids[0] !== m.id || !m.ids.every(id) + || new Set(m.ids).size !== m.ids.length || !Array.isArray(m.to) || new Set(m.to).size !== m.to.length || m.to.length !== m.ids.length || !m.to.every(k => typeof k === 'string' && KEY.test(k)))) return refuse(502, 'invalid-response'); + return json(res, 200, { rows: value, after: value.at(-1)?.ids.at(-1) ?? args.after ?? null, hasMore: value.length === args.limit, at: new Date().toISOString() }); + } + if (action === 'sessionOperation' || action === 'clearSession' || action === 'cancelSession') { // Only this operation's receipt crosses the HTTP seam. Never expose native paths/proofs. if (!value || value.thread !== args.thread || value.op !== args.op || !id(value.session) || !id(value.successor) || (action === 'clearSession' && value.session !== args.session) || diff --git a/packages/webui/src/chat.mjs b/packages/webui/src/chat.mjs index 92d92e8d0..542b5fffb 100644 --- a/packages/webui/src/chat.mjs +++ b/packages/webui/src/chat.mjs @@ -22,6 +22,9 @@ export function createChat({ call, owner = null }) { } }; return Object.freeze({ + roomOpen: ({ project }) => channel('room.open', { project }), + roomRead: ({ project, after, limit }) => channel('room.read', { project, ...(after ? { after } : {}), ...(limit === undefined ? {} : { limit }) }), + roomSend: ({ project, body }) => channel('room.send', { project, body }), projects: () => channel('project.list', {}), createProject: ({ name, repo }) => channel('project.create', { name, ...(repo === undefined ? {} : { repo }) }), threads: ({ project, shared } = {}) => channel('thread.list', { ...(project === undefined ? {} : { project }), ...(shared === true ? { shared: true } : {}) }), diff --git a/packages/webui/src/public/chat.css b/packages/webui/src/public/chat.css index 2f7ba38fb..de0a9c7d1 100644 --- a/packages/webui/src/public/chat.css +++ b/packages/webui/src/public/chat.css @@ -40,3 +40,13 @@ .chat-library { font-size: .9rem; margin-block: .5rem; overflow-wrap: anywhere; } .chat-library p { margin: 0; } .chat-library-problems ul { margin: .4rem 0 0; padding-inline-start: 1.25rem; } + +/* C2-10c: the shared timeline and keyboard-accessible leading-@ completion. */ +.chat-room-entry { margin-block: .75rem; } +.chat-room #chat-room-send-form { display: grid; gap: .5rem; } +#chat-room-body { resize: vertical; min-height: 6rem; padding: .75rem; } +.chat-room-completion { list-style: none; padding: .25rem; margin: 0; max-height: 12rem; overflow: auto; border: 1px solid var(--border); border-radius: .5rem; } +.chat-room-completion button { display: block; width: 100%; text-align: start; padding: .5rem; overflow-wrap: anywhere; } +.chat-room-completion [aria-selected="true"] { outline: 2px solid var(--action); outline-offset: -2px; } +#chat-room-tags, #chat-room-receipt { overflow-wrap: anywhere; } +#chat-room-tags span { display: inline-block; margin-inline-end: .4rem; } diff --git a/packages/webui/src/public/chat.js b/packages/webui/src/public/chat.js index 487babbbe..111370c16 100644 --- a/packages/webui/src/public/chat.js +++ b/packages/webui/src/public/chat.js @@ -24,7 +24,7 @@ // The library verbs name the business project, which is the chat project's repository link. These // codes mean that repository is no library, or this page may not read it: no status line at all. const NO_LIBRARY = ['project-not-declared', 'project-not-configured', 'not-configured', 'owner-only']; - const libraryOf = (c, t) => { const repo = c?.projects.find(p => p.id === t?.project)?.repo; return typeof repo === 'string' && NAME.test(repo) ? repo : null; }; + const libraryOf = (c, t) => { const repo = c?.projects.find(p => p.id === (c.kind === 'room' ? c.id : t?.project))?.repo; return typeof repo === 'string' && NAME.test(repo) ? repo : null; }; let renderReply = null; import('/render.mjs').then(m => { renderReply = m.renderReply; if (current && !out()) paint(); }, () => {}); const libraries = new Map(), reverts = new Map(); @@ -191,6 +191,162 @@ const receipt = s.receipt; return `

${link('projects', t.project, current.projects.find(p => p.id === t.project)?.name ?? 'Project')} / ${txt(t.instance)}

${heading(t.name)}${libraryLine(libraryOf(current, t))}${sessionControls(t)}${sharing(t)}

Reading never wakes the assistant. An accepted message is not an answer.

${threadWrites() ? `` : ''}
    ${messages || '
  1. No messages yet.
  2. '}
${s.more ? '

Showing earlier history. Read forward to reach the current conversation.

' : '

Caught up to the last read.

'}
${threadWrites() ? `
` : ''}

${txt(receipt)}

`; } + // C2-10c: rooms reuse the same state, renderer and generation fences as threads. + const ROOM_LINES = Object.freeze({ + 'unknown-addressee': 'Unknown addressee. Choose a room member.', + 'addressee-ambiguous': "That addressee is ambiguous. Use a room member's instance name.", + 'room-thread-name-taken': 'A room thread name is already in use. Resolve the conflicting thread before opening the room.', + 'room-not-open': 'This room is not open. Open the room before sending.', + }); + const roomError = err => ROOM_LINES[err.code] ?? (err.sent === false || err.status >= 400 && err.status < 500 + ? `Room operation refused (${inert(err.code)}).` + : 'Room unavailable. Refresh to read it again; nothing was retried.'); + const roomOwner = () => current && !current.user && !current.tester; + // Same leading-token grammar as bus/address.mjs; the UI never resolves/replaces recipients on send. + function roomAddress(input) { + const tags = []; let body = input.trimStart(); + while (true) { + const token = /^@(\S+)(?:\s+|$)/u.exec(body); + if (!token) break; + tags.push(token[1]); body = body.slice(token[0].length); + } + return { tags, body }; + } + const roomName = instance => current.members?.find(m => m.instance === instance)?.name || instance; + function roomOpenControl(project) { + if (!roomOwner()) return ''; + const f = form('room-open:' + project); + return `
Read room

${txt(f.receipt)}

`; + } + function roomConversation() { + const c = current, s = state(c.key), p = c.projects.find(p => p.id === c.id); + const messages = s.rows.map(m => { + const speaker = m.from_role === 'human' ? 'Human' : roomName(m.from_role); + const recipients = m.from_role === 'human' ? ` → ${(m.to ?? []).map(r => txt(roomName(r))).join(', ')}` : ''; + return `
  • ${txt(speaker)}${recipients} ${stamp(m.at)}
    ${messageBody({ ...m, from_role: m.from_role === 'human' ? m.from_role : speaker })}
  • `; + }).join(''); + const off = !c.roomReady || s.pending || !roomOwner(); + return `

    ${link('projects', c.id, p?.name ?? 'Project')}

    ${heading((p?.name ?? 'Project') + ' room')}${roomOpenControl(c.id)}${libraryLine(libraryOf(c))}

    Room members: ${(c.members ?? []).map(m => `${txt(m.name)} (@${txt(m.instance)})`).join(', ') || 'unavailable'}

      ${messages || '
    1. No messages yet.
    2. '}
    ${s.more ? '' : '

    Caught up to the last read.

    '}

    Without leading @tags, your message goes to every member. The broker checks the addressees.

    ${txt(s.receipt)}

    `; + } + function drawRoomCompletion() { + const list = document.getElementById('chat-room-completion'), field = document.getElementById('chat-room-body'); + if (!list || !field) return; + const c = current.completion, active = !!c?.items.length; + list.hidden = !active; field.setAttribute('aria-expanded', String(active)); + if (!active) { list.replaceChildren(); field.removeAttribute('aria-activedescendant'); return; } + list.innerHTML = c.items.map((m, i) => `
  • `).join(''); + field.setAttribute('aria-activedescendant', `chat-room-option-${c.index}`); + } + function updateRoomCompletion() { + if (current?.kind !== 'room') return; + const field = document.getElementById('chat-room-body'), preview = document.getElementById('chat-room-tags'); + if (!field || !preview) return; + const { tags } = roomAddress(field.value); + preview.innerHTML = tags.length ? 'Typed addressees: ' + tags.map(tag => `@${txt(tag)}`).join(' ') : 'All room members'; + const prefix = field.value.slice(0, field.selectionStart), token = /(?:^|\s)@([^\s@]*)$/u.exec(prefix); + current.completion = null; + if (document.activeElement === field && !field.disabled && token && !roomAddress(prefix.slice(0, token.index)).body.trim()) { + const needle = token[1].toLocaleLowerCase(); + const items = (current.members ?? []).filter(m => m.instance.toLocaleLowerCase().startsWith(needle) || m.name.toLocaleLowerCase().startsWith(needle)).slice(0, 10); + current.completion = { items, index: 0, start: prefix.length - token[1].length - 1, end: field.selectionEnd }; + } + drawRoomCompletion(); + } + function completeRoom(instance) { + const field = document.getElementById('chat-room-body'), c = current?.completion; + if (!field || field.disabled || !c?.items.some(m => m.instance === instance)) return; + const value = field.value.slice(0, c.start) + '@' + instance + ' ' + field.value.slice(c.end); + const caret = c.start + instance.length + 2; + field.value = value; state(current.key).draft = value; field.focus(); field.setSelectionRange(caret, caret); + updateRoomCompletion(); + } + async function renderRoom({ path, container, canSend, user, tester, navigated, next }) { + if (out()) return; + controller?.abort(); controller = new AbortController(); + const signal = controller.signal, g = ++generation; + const match = /^\/chat\/rooms\/([0-9a-f-]+)$/i.exec(path), id = match?.[1]; + current = { kind: 'room', id, key: 'room:' + id, path, container, canSend, user, tester, + projects: [], threads: [], members: [], roomReady: false, refused: false, error: '' }; + if (!UUID.test(id ?? '') || !roomOwner()) { + current.error = UUID.test(id ?? '') ? 'Rooms require the business owner.' : 'Invalid room route.'; + current.refused = true; paint(navigated); return; + } + const s = state(current.key); + if (navigated) container.innerHTML = '

    Reading room…

    '; + try { + const [projects, threads, catalog] = await Promise.all([ + request('projects', undefined, signal), request('threads?project=' + id, undefined, signal), request('instances', undefined, signal), + ]); + if (g !== generation || out()) return; + if (!projects.rows.some(p => p.id === id)) throw new ChatError('project-not-found', 404); + if (!catalog.rows.every(m => typeof m?.instance === 'string' && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,159}$/.test(m.instance) && typeof m.name === 'string')) throw new ChatError('invalid-response'); + current.projects = projects.rows; current.threads = threads.rows; + current.members = catalog.rows.filter(m => threads.rows.some(t => t.project === id && t.instance === m.instance && t.name === m.instance)); + const after = s.loaded && (!s.more || next) ? s.after : null; + const page = await request(`rooms/${id}/messages?limit=100${after ? '&after=' + after : ''}`, undefined, signal); + if (g !== generation || out()) return; + if (typeof page.hasMore !== 'boolean' || !(page.after === null || UUID.test(page.after)) || page.rows.some(m => !UUID.test(m?.id) || !Array.isArray(m.ids) || !m.ids.every(id => UUID.test(id)) || !Array.isArray(m.to))) throw new ChatError('invalid-response'); + s.rows = [...new Map((after ? [...s.rows, ...page.rows] : page.rows).map(m => [m.id, m])).values()].slice(-200); + s.after = page.after ?? s.after; s.more = page.hasMore; s.loaded = true; + current.roomReady = current.members.length > 0; + if (s.receiptIds?.every(id => s.rows.some(m => m.ids.includes(id)))) { s.receipt = 'Message shown in the room.'; s.receiptIds = null; } + } catch (err) { + if (g !== generation || out() || err.name === 'AbortError' || err.code === 'signed-out') return; + current.error = roomError(err); + if (err.status === 403 || err.status === 404) { s.rows = []; current.members = []; } + } + if (g === generation && !out()) { paint(navigated); void loadLibrary(libraryOf(current), g, signal); } + } + async function openRoom() { + const c = current, id = c?.id; + if (!roomOwner() || !c.canSend || out() || !UUID.test(id ?? '')) return; + const f = form('room-open:' + id); + if (f.pending) return; + f.pending = true; f.receipt = ''; paint(); + try { + const data = await request(`rooms/${id}/open`, {}); + if (out()) return; + if (data.project !== id || !Array.isArray(data.threads) || !data.threads.length || data.threads.some(t => !UUID.test(t?.id) || typeof t.instance !== 'string' || t.name !== t.instance)) throw new ChatError('outcome-unknown'); + f.receipt = 'Room opened.'; + if (current?.id === id) { + if (location.hash === '#/chat/rooms/' + id) void refresh(); + else location.hash = '#/chat/rooms/' + id; + } + } catch (err) { + if (out() || err.code === 'signed-out') return; + f.receipt = err.sent === false ? roomError(err) : 'Outcome unknown. Read the room before opening again; nothing was retried.'; + } finally { f.pending = false; if (current?.id === id && !out()) paint(); } + } + async function sendRoom() { + const c = current; + if (!roomOwner() || !c.canSend || !c.roomReady || out()) return; + const s = state(c.key), body = s.draft; + if (s.pending) return; + if (!body.trim() || new TextEncoder().encode(JSON.stringify({ body })).length > 16384) { + s.receipt = body.trim() ? 'Message is too long (16 KiB JSON maximum).' : 'Write a message first.'; paint(); return; + } + s.pending = true; s.receipt = ''; paint(); + try { + const data = await request(`rooms/${c.id}/messages`, { body }); + if (out()) return; + if (!Array.isArray(data.ids) || !data.ids.length || !data.ids.every(id => UUID.test(id)) || !Array.isArray(data.to) || data.to.length !== data.ids.length) throw new ChatError('outcome-unknown'); + s.receipt = 'Accepted room message. Waiting for the room to show it.'; s.receiptIds = data.ids; + if (s.draft === body) s.draft = ''; + s.follow = true; s.tailRequested = true; + } catch (err) { + if (out() || err.code === 'signed-out') return; + s.receipt = err.sent === false ? roomError(err) : 'Outcome unknown. Read the room before trying again. Nothing was retried; your draft is kept.'; + } finally { s.pending = false; if (current?.key === c.key && !out()) paint(); } + } + document.addEventListener('keydown', event => { + if (current?.kind !== 'room' || event.target.id !== 'chat-room-body' || !current.completion?.items.length) return; + const c = current.completion; + if (['ArrowDown', 'ArrowUp'].includes(event.key)) { event.preventDefault(); c.index = (c.index + (event.key === 'ArrowDown' ? 1 : c.items.length - 1)) % c.items.length; drawRoomCompletion(); } + if (['Enter', 'Tab'].includes(event.key)) { event.preventDefault(); completeRoom(c.items[c.index].instance); } + if (event.key === 'Escape') { event.preventDefault(); current.completion = null; drawRoomCompletion(); } + }); + document.addEventListener('mousedown', event => { if (event.target.closest?.('[data-room-complete]')) event.preventDefault(); }); + function capture() { if (!current) return null; const active = document.activeElement, log = current.container.querySelector('.chat-log'); @@ -202,14 +358,16 @@ const keep = capture(), c = current; let html = '

    Chat projects

    '; if (c.error) html += ``; - if (c.kind === 'thread') { + if (c.kind === 'room') { + html += c.refused ? heading('Room unavailable') : roomConversation(); + } else if (c.kind === 'thread') { const t = c.thread; if (t && (c.session || c.legacyDefault) && !c.refused) html += conversation(t); else html += heading('Thread unavailable'); } else if (c.kind === 'project') { const p = c.projects.find(p => p.id === c.id); html += heading(p?.name ?? 'Project unavailable'); - if (p && !c.refused) html += threads(c.threads.filter(t => !t.shared)) + '

    Shared with me

    ' + threads(c.threads.filter(t => t.shared)) + creation('thread', c.id); + if (p && !c.refused) html += roomOpenControl(c.id) + threads(c.threads.filter(t => !t.shared)) + '

    Shared with me

    ' + threads(c.threads.filter(t => t.shared)) + creation('thread', c.id); } else { html += heading('Chat') + '

    Business projects and your named assistant threads.

    ' + c.projects.map(p => `

    ${link('projects', p.id, p.name)}

    ${p.repo ? `

    Repository: ${txt(p.repo)}

    ` : ''}${threads(c.threads.filter(t => t.project === p.id && !t.shared))}
    `).join('') + (c.projects.length ? '' : '

    No projects yet.

    ') + '

    Shared with me

    ' + threads(c.threads.filter(t => t.shared)) + creation('project', 'projects'); @@ -231,6 +389,7 @@ if (keep.field.start != null && typeof f.setSelectionRange === 'function') f.setSelectionRange(keep.field.start, keep.field.end); } } else if (navigated) c.container.querySelector('h1')?.focus({ preventScroll: true }); + updateRoomCompletion(); } function readError(err) { return err.code === 'thread-not-owned' ? 'This thread is not available to this user.' : @@ -239,6 +398,7 @@ } async function render({ path, container, canSend, user = false, tester = false, navigated = false, next = false }) { if (out()) return; + if (/^\/chat\/rooms(?:\/|$)/.test(path)) return renderRoom({ path, container, canSend, user, tester, navigated, next }); const match = /^\/chat(?:\/(projects|threads)\/([0-9a-f-]+)(?:\/sessions\/([0-9a-f-]+))?)?$/.exec(path); controller?.abort(); controller = new AbortController(); const signal = controller.signal, g = ++generation; @@ -389,6 +549,7 @@ } document.addEventListener('input', event => { if (!current || out()) return; + if (event.target.id === 'chat-room-body') { state(current.key).draft = event.target.value; updateRoomCompletion(); return; } if (event.target.id === 'chat-operation') { const f = form('clear:' + current.key); if (f.pending) return; f.op = event.target.value; f.record = null; const button = document.getElementById('chat-cancel'); if (button) button.disabled = !current.canSend || f.pending || !f.op; } if (event.target.id === 'chat-share-target') form('share:' + current.id).to = event.target.value; if (event.target.id === 'chat-body') state(current.key ?? current.id).draft = event.target.value; @@ -400,7 +561,7 @@ } }); document.addEventListener('scroll', event => { - if (event.target.matches?.('.chat-log') && current?.kind === 'thread') { + if (event.target.matches?.('.chat-log') && ['thread', 'room'].includes(current?.kind)) { const el = event.target; state(current.key ?? current.id).follow = el.scrollHeight - el.scrollTop - el.clientHeight < 40; } @@ -449,7 +610,9 @@ document.addEventListener('submit', event => { if (!current || !event.target.id.startsWith('chat-')) return; event.preventDefault(); - if (event.target.id === 'chat-share-form') { + if (event.target.id === 'chat-room-send-form') { + void sendRoom(); + } else if (event.target.id === 'chat-share-form') { void changeShare('share', form('share:' + current.id).to ?? ''); } else if (event.target.id === 'chat-send-form') { const id = current.id, session = current.session, key = current.key; @@ -473,6 +636,9 @@ }); document.addEventListener('click', event => { if (!current || out()) return; + if (event.target.id === 'chat-room-open') void openRoom(); + const option = event.target.closest?.('[data-room-complete]'); + if (option) completeRoom(option.dataset.roomComplete); if (event.target.dataset.unshare) void changeShare('unshare', event.target.dataset.unshare); if (event.target.id === 'chat-resume') void write('open', current.key, current.session ? { session: current.session } : {}, `threads/${current.id}/open`); if (event.target.id === 'chat-cancel') void cancelClear(); diff --git a/packages/webui/tests/room-browser.test.mjs b/packages/webui/tests/room-browser.test.mjs new file mode 100644 index 000000000..1e375c235 --- /dev/null +++ b/packages/webui/tests/room-browser.test.mjs @@ -0,0 +1,198 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { fixture } from './fixture.mjs'; +import { browser } from './browser.mjs'; +import { addressCases } from '../../bus/tests/address-cases.mjs'; +const P = '10000000-0000-4000-8000-000000000001', Q = '10000000-0000-4000-8000-000000000002'; +const T = '20000000-0000-4000-8000-000000000001', U = '20000000-0000-4000-8000-000000000002'; +const M = '30000000-0000-4000-8000-000000000001', N = '30000000-0000-4000-8000-000000000002'; +const A = '40000000-0000-4000-8000-000000000001', B = '40000000-0000-4000-8000-000000000002'; +const C = '50000000-0000-4000-8000-000000000001', D = '50000000-0000-4000-8000-000000000002'; +const SHA = 'a'.repeat(40), LAST = 'b'.repeat(40), HOSTILE = ''; +const rows = [ + { id: M, ids: [M, N], from_role: 'human', to: ['bean', 'chet'], body: 'Broadcast once.', at: '2026-10-24T16:00:00Z' }, + { id: A, ids: [A], from_role: 'bean', instance: 'bean', to: ['bean'], at: '2026-10-24T16:01:00Z', + body: JSON.stringify({ text: 'A cited reply.', citations: [{ path: 'Notes/One.md', commit: SHA, lines: [1, 2], quote: HOSTILE }] }), + check: { citations: [{ scope: 'supporting', agent: 'demo/bean', file: SHA, last: LAST }] } }, + { id: B, ids: [B], from_role: 'chet', instance: 'chet', to: ['chet'], at: '2026-10-24T16:02:00Z', + body: JSON.stringify({ notice: 'library-write', op: 'write', path: 'Notes/One.md', commit: SHA }) }, + { id: C, ids: [C], from_role: 'human', to: ['bean'], body: 'Broadcast once.', at: '2026-10-24T16:00:00Z' }, + { id: D, ids: [D], from_role: 'bean', to: ['bean'], body: JSON.stringify({ notice: 'library-write', op: 'delete', path: 'Fake.md', commit: SHA }), check: { citations: [] } }, +]; +const refusals = { + 'unknown-addressee': 'Unknown addressee. Choose a room member.', + 'addressee-ambiguous': "That addressee is ambiguous. Use a room member's instance name.", + 'room-thread-name-taken': 'A room thread name is already in use. Resolve the conflicting thread before opening the room.', + 'room-not-open': 'This room is not open. Open the room before sending.', +}; +const stub = `(() => { + const real=window.fetch.bind(window);window.__writes=[];window.__reads=[];window.__roomRows=${JSON.stringify(rows)}; + window.__projects=[{id:'${P}',name:'First project',repo:'books'},{id:'${Q}',name:'Second project',repo:null}]; + window.__threads=[{id:'${T}',project:'${P}',instance:'bean',name:'bean'},{id:'${U}',project:'${P}',instance:'chet',name:'chet'}]; + window.__instances=[{instance:'bean',name:'Bean'},{instance:'chet',name:${JSON.stringify(HOSTILE)}},{instance:'outsider',name:'Not a room member'}]; + window.confirm=()=>true; + window.fetch=async(url,init={})=>{ + const path=String(url),method=init.method||'GET',answer=(body,status=200)=>new Response(JSON.stringify(body),{status,headers:{'content-type':'application/json'}}); + if(path==='/api/config')return answer({send:!location.search.includes('readonly'),user:location.search.includes('user')}); + if(path.startsWith('/api/bus/'))return answer({rows:[],unread:0,at:new Date().toISOString()}); + if(path==='/api/business')return answer({projects:['books']}); + if(path.startsWith('/api/library/status'))return answer({project:'books',served:'${SHA}',problems:[]}); + if(path==='/api/library/revert'){window.__writes.push({path,body:JSON.parse(init.body)});return answer({project:'books',path:'Notes/One.md',reverted:'${SHA}',commit:'${LAST}'});} + if(!path.startsWith('/api/chat/'))return real(url,init); + if(method==='GET')window.__reads.push(path); + if(path==='/api/chat/projects')return answer({rows:window.__projects}); + if(path==='/api/chat/instances')return answer({rows:window.__instances}); + if(path.includes('/rooms/')){ + if(method==='POST'){ + window.__writes.push({path,body:JSON.parse(init.body),redirect:init.redirect}); + const code=path.endsWith('/open')?window.__openError:window.__sendError; + if(code)return answer({error:code,message:'Untrusted reason',sent:false},409); + if(window.__holdWrite)await new Promise(r=>window.__releaseWrite=r); + if(window.__networkFail)throw new TypeError('offline'); + if(path.endsWith('/open')){window.__readError=null;return answer({project:'${P}',threads:window.__threads.map(({id,instance,name})=>({id,instance,name}))});} + const ids=['60000000-0000-4000-8000-000000000001','60000000-0000-4000-8000-000000000002']; + window.__roomRows.push({id:ids[0],ids,from_role:'human',to:['bean','chet'],body:JSON.parse(init.body).body,at:'2026-10-24T17:00:00Z'}); + return answer({ids,to:['bean','chet']}); + } + if(window.__readError)return answer({error:window.__readError,message:'Untrusted reason'},409); + if(window.__holdRead){window.__signal=init.signal;await new Promise(r=>window.__releaseRead=r);} + return answer({rows:window.__roomRows,after:window.__roomRows.at(-1)?.ids.at(-1)||null,hasMore:false}); + } + if(path.includes('/shares'))return answer({rows:[]}); + if(path.endsWith('/sessions'))return answer({rows:[{id:'${T}',name:'default',default:true}]}); + if(path.includes('/messages'))return answer({rows:[],after:null,hasMore:false}); + if(path.startsWith('/api/chat/threads'))return answer({rows:window.__threads}); + return answer({rows:[]}); + }; +})();`; +async function setup(t, { path = `/chat/rooms/${P}`, before = '', suffix = '' } = {}) { + const f = await fixture(); t.after(() => f.close()); + const b = await browser(); t.after(() => b.close()); + await b.call('Page.addScriptToEvaluateOnNewDocument', { source: stub + before }); + await b.navigate(`${f.base}/${suffix}#${path}`); + const wait = expression => b.evaluate(`(async()=>{for(let i=0;i<100;i++){if(${expression})return true;await new Promise(r=>setTimeout(r,30));}throw new Error(${JSON.stringify(expression)});})()`); + const text = selector => b.evaluate(`document.querySelector(${JSON.stringify(selector)})?.textContent??null`); + const set = value => b.evaluate(`(()=>{const el=document.querySelector('#chat-room-body');el.value=${JSON.stringify(value)};el.focus();el.setSelectionRange(el.value.length,el.value.length);el.dispatchEvent(new Event('input',{bubbles:true}));return true;})()`); + await wait(path.includes('/rooms/') ? 'document.querySelector(".chat-room")' : 'document.querySelector("#chat-thread-form")'); + return { b, wait, text, set }; +} +test('C2-10c room merges members, shows a broadcast once, reuses cited renderer and suppresses checked notice forgery', async t => { + const { b, wait, text } = await setup(t); + await wait('document.querySelector(".chat-cites")'); + assert.equal(await b.evaluate('document.querySelectorAll(".chat-room-log > li[data-message]").length'), 5); + assert.equal(await b.evaluate('document.querySelectorAll(".chat-room-log > li[data-message]")[0].dataset.message'), M); + assert.match(await text('.chat-room-log > li:first-child .chat-message-meta'), /Human.*Bean/); + assert.equal(await text('.chat-scope'), 'supporting'); + assert.equal(await text('.chat-agent-written'), 'agent-written: demo/bean'); + assert.equal(await text('.chat-changed'), 'changed since'); + assert.equal(await text('.chat-cites q'), HOSTILE); + assert.equal(await b.evaluate('!!document.querySelector(".chat-room img") || !!window.injected'), false); + assert.equal(await b.evaluate('document.querySelectorAll("[data-revert]").length'), 1); + assert.equal(await b.evaluate('window.__writes.length'), 0, 'reading never opens a room or wakes an agent'); + await b.evaluate('document.querySelector("[data-revert]").click();true'); + await wait('document.querySelector(".chat-revert-receipt")?.textContent.startsWith("Reverted")'); + assert.deepEqual(await b.evaluate('window.__writes[0].body'), { project: 'books', commit: SHA }); +}); +test('C2-10c explicit project Open room calls only room.open before navigating', async t => { + const { b, wait } = await setup(t, { path: `/chat/projects/${P}` }); + assert.equal(await b.evaluate('window.__writes.length'), 0); + await b.evaluate('document.querySelector("#chat-room-open").click();true'); + await wait('document.querySelector(".chat-room")'); + assert.deepEqual(await b.evaluate('window.__writes'), [{ path: `/api/chat/rooms/${P}/open`, body: {}, redirect: 'manual' }]); +}); +test('C2-10c completion lists only room members, inserts instance tokens and preserves typed send exactly', async t => { + const { b, wait, set } = await setup(t); + await set('@be'); + assert.deepEqual(await b.evaluate('[...document.querySelectorAll("[data-room-complete]")].map(e=>e.dataset.roomComplete)'), ['bean']); + await b.key('Enter'); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), '@bean '); + await set('@bean @ch'); + await b.evaluate('document.querySelector("[data-room-complete=chet]").click();true'); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), '@bean @chet '); + const body = ' \t@bean\n@chet unchanged text '; + await set(body); + await b.evaluate('document.querySelector("#chat-room-send-form").dispatchEvent(new Event("submit",{bubbles:true,cancelable:true}));true'); + await wait('window.__writes.length===1 && !document.querySelector("#chat-room-body").disabled'); + assert.deepEqual(await b.evaluate('window.__writes[0]'), { path: `/api/chat/rooms/${P}/messages`, body: { body }, redirect: 'manual' }); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), ''); + assert.equal(await b.evaluate('document.querySelectorAll(".chat-room-log > li[data-message]").length'), 5, 'no optimistic copies of a broadcast'); + await wait('!document.querySelector("#refresh").disabled'); + await b.evaluate('document.querySelector("#refresh").click();true'); + await wait('document.querySelectorAll(".chat-room-log > li[data-message]").length===6'); + const sentSelector = '.chat-room-log > li[data-message="60000000-0000-4000-8000-000000000001"]'; + assert.equal(await b.evaluate(`document.querySelectorAll(${JSON.stringify(sentSelector)}).length`), 1); +}); +test('C2-10c browser leading tag reader matches every broker parseAddress vector', async t => { + const { b, set } = await setup(t); + for (const [label, input, expected] of addressCases) { + await set(input); + assert.deepEqual(await b.evaluate('[...document.querySelectorAll("[data-room-tag]")].map(e=>e.dataset.roomTag)'), expected.tags, label); + } + await set('ordinary prose @be'); + assert.equal(await b.evaluate('document.querySelectorAll("[data-room-complete]").length'), 0); + assert.equal(await b.evaluate('window.__writes.length'), 0); +}); +test('C2-10c room refusals show fixed lines, preserve drafts and never retry', async t => { + const { b, wait, set, text } = await setup(t); + for (const code of ['unknown-addressee', 'addressee-ambiguous', 'room-not-open']) { + await set('@unknown hello'); + const count = await b.evaluate('window.__writes.length'); + await b.evaluate(`window.__sendError=${JSON.stringify(code)};document.querySelector('#chat-room-send-form').dispatchEvent(new Event('submit',{bubbles:true,cancelable:true}));true`); + await wait(`window.__writes.length===${count+1} && !document.querySelector('#chat-room-body').disabled`); + assert.equal(await text('#chat-room-receipt'), refusals[code]); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), '@unknown hello'); + } + await b.evaluate("window.__openError='room-thread-name-taken';document.querySelector('#chat-room-open').click();true"); + await wait(`document.querySelector('#chat-room-open-receipt')?.textContent===${JSON.stringify(refusals['room-thread-name-taken'])}`); + assert.equal(await text('#chat-room-open-receipt'), refusals['room-thread-name-taken']); +}); +test('C2-10c read-only room does not offer a send or an implicit open', async t => { + const { b, set } = await setup(t, { suffix: '?readonly' }); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").disabled'), true); + assert.equal(await b.evaluate('document.querySelector("#chat-room-open").disabled'), true); + await set('not allowed'); + await b.evaluate('document.querySelector("#chat-room-send-form").dispatchEvent(new Event("submit",{bubbles:true,cancelable:true}));true'); + assert.equal(await b.evaluate('window.__writes.length'), 0); +}); +test('C2-10c late reads and sign-out cannot repaint private room state', async t => { + const { b, wait, set } = await setup(t); + await set('private room draft'); + await b.evaluate('window.__holdRead=true;document.querySelector("#refresh").click();true'); + await wait('typeof window.__releaseRead==="function"'); + await b.evaluate(`location.hash='#/chat/projects/${Q}';true`); + await wait('document.querySelector("#chat-thread-form")'); + assert.equal(await b.evaluate('window.__signal.aborted'), true); + await b.evaluate('window.__holdRead=false;window.__releaseRead();true'); + await b.evaluate('document.dispatchEvent(new Event("mosaic-signed-out"));true'); + assert.equal(await b.evaluate('!!document.querySelector(".chat-room")'), false); + assert.equal(await b.evaluate('document.body.textContent.includes("private room draft")'), false); +}); + + +test('C2-10c quiet members complete in an empty room, and Escape closes suggestions', async t => { + const { b, set } = await setup(t, { before: 'window.__roomRows=[];' }); + await set('@'); + assert.deepEqual(await b.evaluate('[...document.querySelectorAll("[data-room-complete]")].map(e=>e.dataset.roomComplete)'), ['bean', 'chet']); + await b.key('ArrowDown'); await b.key('Tab'); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), '@chet '); + await set('@b'); await b.key('Escape'); + assert.equal(await b.evaluate('document.querySelector("#chat-room-completion").hidden'), true); + assert.equal(await b.evaluate('window.__writes.length'), 0); +}); + +test('C2-10c pending sends do not duplicate and uncertain sends preserve the exact draft', async t => { + const { b, wait, set, text } = await setup(t); + await set('one pending send'); + await b.evaluate('window.__holdWrite=true;document.querySelector("#chat-room-send-form").dispatchEvent(new Event("submit",{bubbles:true,cancelable:true}));true'); + await wait('typeof window.__releaseWrite==="function"'); + await b.evaluate('document.querySelector("#chat-room-send-form").dispatchEvent(new Event("submit",{bubbles:true,cancelable:true}));true'); + assert.equal(await b.evaluate('window.__writes.length'), 1); + await b.evaluate('window.__holdWrite=false;window.__releaseWrite();true'); + await wait('!document.querySelector("#chat-room-body").disabled'); + await set('keep this uncertain draft '); + await b.evaluate('window.__networkFail=true;document.querySelector("#chat-room-send-form").dispatchEvent(new Event("submit",{bubbles:true,cancelable:true}));true'); + await wait('document.querySelector("#chat-room-receipt").textContent.includes("Outcome unknown")'); + assert.equal(await b.evaluate('document.querySelector("#chat-room-body").value'), 'keep this uncertain draft '); + assert.equal(await b.evaluate('window.__writes.length'), 2); + assert.match(await text('#chat-room-receipt'), /Nothing was retried/); +}); diff --git a/packages/webui/tests/room-http.test.mjs b/packages/webui/tests/room-http.test.mjs new file mode 100644 index 000000000..198502054 --- /dev/null +++ b/packages/webui/tests/room-http.test.mjs @@ -0,0 +1,114 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { request } from 'node:http'; +import { startServer } from '../src/serve.mjs'; +import { createChat } from '../src/chat.mjs'; +import { BusReadError } from '../src/bus.mjs'; +const P = '10000000-0000-4000-8000-000000000001', T = '20000000-0000-4000-8000-000000000001'; +const M = '30000000-0000-4000-8000-000000000001', N = '30000000-0000-4000-8000-000000000002'; +const headers = { host: 'console.example', 'x-user': 'jason', origin: 'https://console.example', 'sec-fetch-site': 'same-origin', 'content-type': 'application/json' }; +const lines = { + 'unknown-addressee': 'Unknown addressee. Choose a room member.', + 'addressee-ambiguous': "That addressee is ambiguous. Use a room member's instance name.", + 'room-thread-name-taken': 'A room thread name is already in use. Resolve the conflicting thread before opening the room.', + 'room-not-open': 'This room is not open. Open the room before sending.', +}; +async function setup(t, { enabled = true } = {}) { + const calls = [], state = { value: null }; + const chat = createChat({ call: async (verb, args) => { + if (verb === 'plugins') return { plugins: { channel: ['webui'] } }; + calls.push([verb, args]); + if (state.value instanceof Error) throw state.value; + return state.value; + } }); + const server = await startServer({ port: 0, preview: { host: 'console.example', header: 'x-user', user: 'jason' }, send: enabled ? async () => ({}) : null, chat, log: () => {} }); + t.after(() => new Promise(r => { server.close(r); server.closeIdleConnections(); })); + const call = (action, { method = 'GET', value, hs = headers, query = '' } = {}) => new Promise((resolve, reject) => { + const req = request({ host: '127.0.0.1', port: server.address().port, path: `/api/chat/rooms/${P}/${action}${query}`, method, headers: hs }, res => { + let text = ''; res.on('data', c => text += c); res.on('end', () => resolve({ status: res.statusCode, body: JSON.parse(text) })); + }); + req.on('error', reject); req.end(value === undefined ? undefined : JSON.stringify(value)); + }); + return { calls, state, call, chat }; +} +test('C2-10c seam exposes three fixed room calls without thread.messages fanout', async t => { + const f = await setup(t); + for (const [method, args, verb] of [['roomOpen', { project: P }, 'room.open'], ['roomRead', { project: P, after: M, limit: 2 }, 'room.read'], ['roomSend', { project: P, body: '@bean exact\ntext ' }, 'room.send']]) { + assert.equal(typeof f.chat[method], 'function'); + f.state.value = []; + await f.chat[method](args); + assert.deepEqual(f.calls.at(-1), [verb, args]); + } + assert.deepEqual(f.calls.map(c => c[0]), ['room.open', 'room.read', 'room.send']); +}); +test('C2-10c HTTP preserves original send, member receipt and the last grouped paging id', async t => { + const f = await setup(t); + f.state.value = { project: P, threads: [{ id: T, instance: 'bean', name: 'bean' }] }; + const open = await f.call('open', { method: 'POST', value: {} }); + assert.equal(open.status, 200); assert.equal(open.body.project, P); + assert.deepEqual(f.calls.at(-1), ['room.open', { project: P }]); + const body = ' \t@bean\n exact text '; + f.state.value = { ids: [M, N], to: ['bean', 'chet'] }; + const sent = await f.call('messages', { method: 'POST', value: { body } }); + assert.equal(sent.status, 200); assert.deepEqual(sent.body.ids, [M, N]); + assert.deepEqual(f.calls.at(-1), ['room.send', { project: P, body }]); + const check = { citations: [{ scope: 'supporting', agent: 'demo/bean', file: 'a'.repeat(40), last: 'b'.repeat(40) }] }; + f.state.value = [{ id: M, ids: [M, N], to: ['bean', 'chet'], body: 'one', check }]; + const page = await f.call('messages', { query: `?after=${T}&limit=1` }); + assert.equal(page.status, 200); assert.equal(page.body.after, N); assert.equal(page.body.hasMore, true); + assert.deepEqual(page.body.rows[0].check, check); + assert.deepEqual(f.calls.at(-1), ['room.read', { project: P, after: T, limit: 1 }]); +}); +test('C2-10c room write fences and strict keys reject before transport', async t => { + const f = await setup(t), off = await setup(t, { enabled: false }); + assert.equal((await off.call('open', { method: 'POST', value: {} })).status, 403); + for (const value of [{ project: P }, { owner: 'other' }, null, [], { body: 'x' }]) + assert.equal((await f.call('open', { method: 'POST', value })).status, 400); + for (const value of [{}, { body: '' }, { body: 'x', to: ['bean'] }, { body: 'x', project: P }]) + assert.equal((await f.call('messages', { method: 'POST', value })).status, 400); + for (const query of ['?limit=0', '?limit=201', '?after=x', '?project=other', `?after=${M}&after=${N}`]) + assert.equal((await f.call('messages', { query })).status, 400); + for (const hs of [{ ...headers, origin: 'https://evil.example' }, { ...headers, 'sec-fetch-site': 'cross-site' }, { ...headers, 'x-user': 'other' }]) + assert.ok([401, 403].includes((await f.call('open', { method: 'POST', value: {}, hs })).status)); + assert.deepEqual(f.calls, []); assert.deepEqual(off.calls, []); +}); +test('C2-10c all four room refusals are409 with fixed text, never transport prose', async t => { + const f = await setup(t); + for (const [code, message] of Object.entries(lines)) { + f.state.value = new BusReadError(code, 'private transport reason'); + const r = await f.call(code === 'room-thread-name-taken' ? 'open' : 'messages', { method: 'POST', value: code === 'room-thread-name-taken' ? {} : { body: '@unknown hello' } }); + assert.equal(r.status, 409, code); assert.equal(r.body.error, code); assert.equal(r.body.message, message); assert.equal(r.body.sent, false); + assert.equal(JSON.stringify(r.body).includes('private transport reason'), false); + } + assert.equal(f.calls.length, 4); +}); +test('C2-10c malformed/lost write receipts are unknown and never retried', async t => { + const f = await setup(t); + for (const value of [null, { ids: [M], to: [] }, { ids: ['bad'], to: ['bean'] }, new Error('socket closed')]) { + f.state.value = value; + const before = f.calls.length, r = await f.call('messages', { method: 'POST', value: { body: 'hi' } }); + assert.equal(r.status, 503); assert.equal(r.body.error, 'outcome-unknown'); assert.equal(r.body.sent, 'unknown'); + assert.equal(f.calls.length, before + 1); + } +}); + +test('C2-10c room receipts reject coerced member keys and duplicate grouped ids', async t => { + const f = await setup(t); + f.state.value = { project: P, threads: [{ id: T, instance: 17, name: 17 }] }; + const opened = await f.call('open', { method: 'POST', value: {} }); + assert.equal(opened.status, 503); assert.equal(opened.body.sent, 'unknown'); + for (const row of [{ id: M, ids: [M, M], to: ['bean', 'chet'], body: 'x' }, { id: M, ids: [M, N], to: ['bean', 'bean'], body: 'x' }]) { + f.state.value = [row]; + const read = await f.call('messages'); + assert.equal(read.status, 502); assert.equal(read.body.error, 'invalid-response'); + } +}); + +test('C2-10c granted-user room calls never borrow the owner transport', async () => { + const owner = [], user = []; + const chat = createChat({ owner: async (...a) => { owner.push(a); return { plugins: { channel: ['webui'] } }; }, + call: async (...a) => { user.push(a); throw new BusReadError('human-required'); } }); + await assert.rejects(chat.roomRead({ project: P, limit: 100 }), { code: 'human-required' }); + assert.deepEqual(owner, [['plugins', {}]]); + assert.deepEqual(user, [['room.read', { project: P, limit: 100 }]]); +});