Files

1113 lines
118 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
npm notice run @mosaic/[email protected] test
npm notice run node --test tests/*.test.mjs
✔ R6 a configured peer id validates as a user's home and an unconfigured one refuses (19.440662ms)
✔ R6 B1 a boot with access.json binds a granted user, whose home is a configured peer (176.01766ms)
✔ R6 B2 a boot without access.json has no access and binds no user (167.394505ms)
✔ R6 B3 a boot with a file R1's loader refuses still boots, binds no user and says so once (521.773676ms)
✔ list prints the revision and the users (70.591593ms)
✔ grant writes one revision up, a receipt line, and the id in the file (176.631192ms)
✔ a viewer grant writes the viewer level, one revision up (149.090165ms)
✔ a second write appends a second receipt and leaves the first intact (252.761371ms)
✔ a stale revision refuses with revision-conflict and writes nothing (199.315119ms)
✔ a live holder's lock refuses and leaves the file and the lock alone (59.983061ms)
✔ an empty or unreadable lock refuses, since its holder may still be writing (120.092186ms)
✔ a lock left by a dead pid refuses, names the pid, and is not reclaimed (103.817907ms)
✔ a failed rename leaves the old bytes, removes the temp file, and writes no receipt (69.941706ms)
✔ a group-writable access file refuses with exit 3, names the file, and changes nothing (75.073881ms)
✔ an agent or tester caller is refused before the context or the access file is read (2.698477ms)
✔ the lock is mode 0600 while held and removed after a refused write (60.128721ms)
✔ a grant naming an unknown instance is refused before any write (50.807031ms)
✔ a project name resolves to its id at grant time (126.59217ms)
✔ an unknown project name refuses before any write (68.550377ms)
✔ revoke removes the user's grants and leaves a revision behind (249.237455ms)
✔ revoke of a user with no grant refuses and writes nothing (78.970947ms)
✔ an agent caller is refused before the bus is asked (3.682313ms)
✔ --tester is refused on every verb before the bus is asked (6.394622ms)
✔ a bus that refuses the human proof blocks the write (77.460139ms)
✔ the context reads console.sso subjects and the business files, and peers stay empty (43.657666ms)
✔ the real human-cli, run from agent ancestry, refuses and writes nothing (5346.518081ms)
✔ T1 user add writes the user one revision up, prints it and appends a user.add receipt (63.631459ms)
✔ T2 a bad user add refuses before any write (643.347479ms)
✔ T3 user remove of a user with no grant drops them one revision up, with a user.remove receipt (52.080635ms)
✔ T4 user remove refuses with user-has-grants while the user holds a grant, and writes nothing (177.570827ms)
✔ T5 user remove of an id not in the file refuses and writes nothing (48.91774ms)
✔ T6 a stale revision refuses both user verbs with revision-conflict (100.48544ms)
✔ T7 --tester and an agent caller are refused on both user verbs before the bus is asked (3.059801ms)
✔ T8 a user verb of the wrong shape prints the help (3.652713ms)
✔ T9 a bus that refuses the human proof blocks both user verbs (91.71361ms)
✔ R4 grant and revoke call access.reload after the write, and nothing else does (299.044406ms)
✔ R4 a refused access.reload after a good write exits 0, stdout reports the write, stderr names the code and the 30 s timer (101.438558ms)
✔ R4 the help keeps the provider-removal order and says what a refused reload means (1.652952ms)
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (3179.081691ms)
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (159.241542ms)
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (331.43342ms)
✔ NO_COLOR: no escape codes, except reverse video on the selected row (547.109298ms)
✔ 1-9 shows the decide flow's own lines and question; only y resolves (132.259499ms)
✔ the app shows the same decide text as mosaic decide (60.621108ms)
✔ any key but y or Y at the question answers No; nothing is sent (547.172089ms)
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (191.926161ms)
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (683.990759ms)
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (73.64106ms)
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (53.781056ms)
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (540.499848ms)
✔ quitting at the question answers No and sends nothing, armed or not (87.7105ms)
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (73.387808ms)
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (107.115717ms)
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (704.461586ms)
✔ at every size the decide box shows each line y depends on, or says it is hidden (18773.237061ms)
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (150.632102ms)
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (78.981219ms)
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (37.958142ms)
✔ keys: views, moving, trail of a selection, the command line, help and quit (206.373815ms)
✔ one option: the status line says Press 1, not 1-1 (47.733084ms)
✔ no business: the app says so and :business picks one (23.118121ms)
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (4.13823ms)
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (334.136927ms)
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.59825ms)
✔ decide with --note still asks; a No sends nothing (26.816836ms)
✔ the app's business comes from a live bus host only (1.654616ms)
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (28.978567ms)
✔ draw is pure: same state, same frame (2.15196ms)
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (11.213533ms)
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (1662.25991ms)
✔ a missing file is recorded too, and a valid file clears the status on the next start (1194.196553ms)
✔ row253 socket observation uses configured root, metadata and the Console peer without sending bytes (4960.983053ms)
✔ row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure (47982.060861ms)
✔ row253 acceptance rejects bad config and unsupported copies before talk (1685.306318ms)
✔ row253 stalled peer observation ends within its bound without leaving a reader (4360.839909ms)
✔ row253 P8 refuses both retired TCP and board listeners (4609.180944ms)
✔ row253 C4 acceptance query inner reason holds under both sudo models (10875.442541ms)
✔ row253 C4 acceptance query outer reason discards stdout and names residual cleanup (14214.146042ms)
✔ row253 C4 acceptance query overflow is output-limit in both models (704.185033ms)
✔ row299 P10 timing copy preserves shipped bytes and isolates observer variables (1.272721ms)
✔ row299 P10 observers preserve stdout stderr status and the EXIT trap (4.259606ms)
✔ row299 P10 observer records are complete and ordered (0.764892ms)
✔ row253 C4 P10 inner reason holds under both sudo models (12845.696914ms)
ℹ {"fault":"inner","mode":"exec","baselineSeconds":2.216959216999996,"faultSeconds":4.42816661,"probeSeconds":2.27}
ℹ {"fault":"inner","mode":"hop","baselineSeconds":1.950547934000002,"faultSeconds":4.180937552000003,"probeSeconds":2.29}
✔ row253 C4 P10 outer reason holds under both sudo models (15930.940688ms)
ℹ {"fault":"outer","mode":"exec","baselineSeconds":2.0704665899999966,"faultSeconds":5.904106264000002,"probeSeconds":4}
ℹ {"fault":"outer","mode":"hop","baselineSeconds":2.0467206270000022,"faultSeconds":5.850665687,"probeSeconds":4}
✔ row253 C4 P10 overflow reason holds under both sudo models (4067.835905ms)
✔ row 195 accept: every check passing exits 0, with each P mark and counts that match the lines (2032.402924ms)
✔ row 195 accept: exits 1 with each F check failing alone, and its line names it (21616.420015ms)
✔ row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error (3742.460768ms)
✔ row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic (3497.77341ms)
✔ row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port (3838.240195ms)
✔ row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space (8669.441911ms)
✔ row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone (4009.111998ms)
✔ row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment (5152.460341ms)
✔ row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by (5585.501836ms)
✔ row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential (5680.396018ms)
✔ row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag (5749.005539ms)
✔ row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it (5427.625895ms)
✔ row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory (3787.235637ms)
✔ row 195 accept: each P check reports unnamed on its fault, and the exit stays 0 (17051.253333ms)
✔ row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker (3785.157436ms)
✔ row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys (1834.05986ms)
✔ row 195 accept: P9 is unnamed once for each item missing (9324.709919ms)
✔ row253 accept: P10 fails its observation with another peer; P11 with the unit disabled (3777.574009ms)
✔ row 195 accept: every P check unnamed together still exits 0 (1653.703766ms)
✔ row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason (96.991991ms)
✔ row 195 accept: usage errors and a run without --root as a user exit 2 (10.516981ms)
✔ row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:... (1859.056741ms)
✔ row 195 accept: the host check runs with --check and never --enforce (1890.30245ms)
✔ row276 legacy call inventory pins every production bound and the conversation contract (0.342517ms)
✔ row276 talk legacy inner timeout cleans both sudo models (1672.790815ms)
✔ row276 precheck legacy inner timeout cleans both sudo models (1684.114464ms)
✔ row276 claude-version legacy inner timeout cleans both sudo models (1678.216316ms)
✔ row276 pm-list legacy inner timeout cleans both sudo models (1695.955919ms)
✔ row276 node-version legacy inner timeout cleans both sudo models (1679.034953ms)
✔ row276 legacy streams and display status preserve failures without granting success (2613.913212ms)
✔ row276 trailer grammar cannot make supervisor failure pass (2057.571655ms)
✔ row276 earlier forged trailer and appended zero remain failures (527.571529ms)
✔ row276 precheck outer bound discards success status and fixture cleans residual (2184.71001ms)
✔ row276 case1 capture and legacy tools refuse unsafe system tools (76.621415ms)
✔ row276 stderr retention is bounded and keeps the final diagnostic (282.085797ms)
✔ row276 version and PM checks refuse successful-looking stdout on supervisor failure (16.60825ms)
✔ row276 full acceptance keeps all five healthy calls in both sudo models (3818.706371ms)
✔ row276 vanished pid stat read returns 3 with empty stderr in both scripts (4.125307ms)
✔ row276 legacy stdout snapshot preserves exact bytes on success and command failure (3211.409246ms)
✔ row 240 check: exits 0 with all seven items and a note that bubblewrap is the install pin (163.843904ms)
✔ row 240 check: exits 1 with each item failing alone, and its line names it (925.245447ms)
✔ row 240 check: item 1 fails when a package owns the profile, when dpkg -S errs, or with no pin (283.261173ms)
✔ row 240 check: item 2 fails on a loaded mosaic-bwrap, a missing unpriv_bwrap or a failed aa-status (400.463192ms)
✔ row 240 check: item 3 fails on a second file naming bwrap as a word, /{usr/,}bin/bwrap included (702.882583ms)
✔ row 240 check: item 4 reads the label under the units' no-new-privs and matches it exactly (377.644335ms)
✔ row 240 check: item 5 needs the statoverride and stat to agree (87.911305ms)
✔ row 240 check: item 6 fails on protected_hardlinks 0; item 7 fails with the floor at 732 and reads 1023 with no unit (459.935444ms)
✔ row 240 check: a bubblewrap version other than the install pin is a note, not a failure (76.397109ms)
✔ row 240 enforce: a pass with no DRIFT changes nothing and exits 0 (73.070179ms)
✔ row 240 enforce: each failure exits 0, unloads the profile, closes bwrap, writes DRIFT and one log line (615.476197ms)
✔ row 240 enforce: with DRIFT present and every item passing, it still closes bwrap (111.302392ms)
✔ row 240 enforce: no unload when aa-status lists neither bwrap profile; never writes the statoverride (725.658903ms)
✔ row 240 upstream: a candidate whose profile differs prints the difference and exits 0 (155.94142ms)
✔ row 240 boot unit: a oneshot after apparmor and before the bus that runs --enforce (0.37346ms)
✔ row 240 pins and usage: the shipped pins are r6's, the script reads the pins beside it, and bad usage exits 2 (111.660841ms)
✔ Vikunja 614 check: item 5 accepts dpkg's bare octal mode and leading-zero equivalents (175.35123ms)
✔ Vikunja 614 enforce: dpkg's bare 750 leaves bwrap open and writes no DRIFT (67.045919ms)
✔ Vikunja 614 check: item 5 refuses other modes, owners, groups, paths and malformed overrides (1839.276754ms)
✔ the library install writes the business file, personas and slot dir, makes the copy and starts nothing (654.980029ms)
✔ a library re-run passes and leaves every file as it was (1054.03717ms)
✔ a re-run refuses business-file-differs and leaves the file unchanged (862.068732ms)
✔ a re-run refuses persona-differs when an installed persona isn't the staged one, and writes nothing (611.181383ms)
✔ the factory install writes no library mapping, persona or slot dir (388.818196ms)
✔ the factory install refuses a library project and bus.tester off, before anything is written (153.783338ms)
✔ the library install refuses bus.tester on and a persona var in the input (187.787627ms)
✔ the install refuses root, a business id mismatch, another --home and a config dir with group bits (103.934283ms)
✔ the library install needs --personas (12.694795ms)
✔ a validate refusal removes the business file this run wrote (507.102899ms)
✔ N4: a validate refusal on a re-run leaves the matching business file in place, byte for byte (858.912753ms)
✔ a clean library host passes the precheck with no mirror yet (826.782411ms)
✔ the library precheck refuses a persona file at 0644 (763.297274ms)
✔ the library precheck refuses a persona whose digest isn't persona.sha256 (908.513727ms)
✔ the library precheck refuses a persona dir with group bits (876.446921ms)
✔ the library precheck refuses a business file at 0644 (859.893121ms)
✔ the library precheck refuses a changes.jsonl at 0644 (1166.063805ms)
✔ the library precheck refuses a Discord binding (787.866682ms)
✔ --library-status refuses library-mirror-missing before the bus has made the mirror (623.067027ms)
✔ --library-status refuses library-never-synced on a fresh mirror (628.547493ms)
✔ --library-status names a recorded lastError before the null lastFetch it leaves (N3) (584.392453ms)
✔ --library-status prints each R-problem's path as an escaped JSON string, then the count, and passes (770.456587ms)
✔ --library-status takes no --profile (12.579837ms)
✔ Vikunja 614: install preserves the explicit notifier decision bytes and mode and creates none when absent (943.82086ms)
✔ row 322 F8: library personas install from the copy with no clone node_modules (355.185459ms)
✔ row 322 F9: importer refusal keeps the error line rather than the Node banner (224.142076ms)
✔ stage takes each profile's SOUL.md byte for byte and prints the pairing with sizes and digests (183.745141ms)
✔ stage lists the per-channel prompts in all three places by name and byte count only (131.831805ms)
✔ a config key with a newline prints as one quoted line (122.138474ms)
✔ a read trace shows stage and the dry run open SOUL.md and config.yaml and never memory, sessions or secrets (247.145219ms)
✔ the pairing refuses anything but two existing profiles naming Bean and Chet once each, and writes nothing (1065.763045ms)
✔ a profile with no persona refuses: no SOUL.md, a blank one, a symlink, not UTF-8 (967.526019ms)
✔ the import applies C2-08's exported fence at its boundaries (875.883335ms)
✔ install writes 0600 persona files in 0700 directories whose digests match, and prints the vars (214.422277ms)
✔ install refuses an open or foreign staging file, a digest off the manifest and an existing persona (1067.562576ms)
✔ --dry-run writes nothing and prints only counts and the fence fault, two heading lines in a fixture counted (95.262646ms)
✔ --dry-run applies C2-08's fence: over it the fault prints, nothing is written and it exits 1 (205.198931ms)
✔ a directory made between the check and mkdir refuses by name, at stage and at install (315.889832ms)
✔ --dry-run counts three lines naming a Hermes tool or channel and prints none of the words (90.187279ms)
✔ usage: stage needs one of --staging and --dry-run, install takes only its own options (618.524905ms)
✔ row253 factory socket uses actual config and target-uid query without widening hardening (1030.905316ms)
✔ row253 installer refuses unsafe location and query facts before unit writes (7025.311831ms)
✔ row253 query timeout kills its process group and leaves no running child (7103.559135ms)
✔ row253 protected homes refuse before any filesystem access (23.509263ms)
✔ row253 C4 sleep query has exact inner reason and cleans all members (11579.537156ms)
✔ row253 C4 signals query has exact inner reason and cleans all members (10931.15253ms)
✔ row253 C4 member query has exact inner reason and cleans all members (10825.862721ms)
✔ row253 C4 overflow is output-limit in both sudo modes (474.601679ms)
✔ row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup (14194.109908ms)
✔ row253 C4 inline supervisor is byte-identical in both host scripts (0.393456ms)
✔ row253 C4 cleanup budget starts after inventory pass one (38.544492ms)
✔ row253 query reaps its group even when a child closes stdout before the query returns (142.005829ms)
✔ row253 config parser is strict (10.528804ms)
✔ a clean library render writes both units 0644 with the fixed lines, and enables both then starts the bus then the Console (109.927619ms)
✔ PATH starts with the --node directory, for a node outside the default list and for /usr/bin/node (119.545344ms)
✔ a failed bus start refuses with the Console not started (114.55597ms)
✔ the script never links a unit file (0.158151ms)
✔ factory renders --pm once and one MOSAIC_CLAUDE_BIN line, and without them both tokens render empty (611.446215ms)
✔ a re-install over running units says they are still on the old copy and must restart together, never that it started them (519.741913ms)
✔ a re-install to another copy re-renders both units, and an edited installed unit refuses (1188.682643ms)
✔ a template with a namespace, user or system call restriction refuses (321.837449ms)
✔ the bus template's EnvironmentFile line must be there and point at the session env, and the Console template must have none (225.220245ms)
✔ a template holding an unknown token, PermissionsStartOnly or a privileged Exec prefix refuses (170.307897ms)
✔ a symlink at either unit path refuses (206.876154ms)
✔ a --node that is relative, not root-owned or under <home> refuses (19.695775ms)
✔ a re-install with a different --node or different serve flags refuses (500.439188ms)
✔ an installed pair whose units name different copies refuses (282.250725ms)
✔ a copy id that is short, uppercase, holds / or .., or names no directory refuses (30.372862ms)
✔ library refuses a privileged-floor miss, a bad proof pair and every flag outside its set (330.664137ms)
✔ library refuses a proof file not owned by <user>'s uid (20.350989ms)
✔ factory refuses duplicate socket, a missing --port or --business, and each proxy flag (203.853949ms)
✔ row253 factory refuses retired TCP and a value after the socket marker (30.406882ms)
✔ factory refuses a --claude that is relative, not root-owned or under <home>, and a re-install with another --pm or --claude (1401.551986ms)
✔ the precheck passes on a good host and prints free memory, without the key (172.35798ms)
✔ the precheck refuses each failed host check (1515.950658ms)
✔ the precheck refuses a user missing from passwd, a business file that does not load, and a symlinked run root (865.632936ms)
✔ a bwrap that fails refuses and prints the sysctl and where bwrap is (166.489853ms)
✔ an unprivileged port floor at or below the Console's port refuses, and so does a missing Console unit (893.079341ms)
✔ bus.tester: library refuses it on, factory needs it on, and factory refuses a library business (644.251277ms)
✔ the claude check runs only for a claude-code instance, and refuses a claude that appends or answers wrong (1355.919087ms)
✔ the claude check runs the bus unit's MOSAIC_CLAUDE_BIN over claude on PATH (415.033191ms)
✔ the session env file refuses when missing, open to others, a symlink, empty, or emptied by a later line (1029.746409ms)
✔ inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds (80.105752ms)
✔ Vikunja 614 factory: scoped @anthropic-ai Claude path renders and passes installed read-back (864.760242ms)
✔ Vikunja 614 factory: plain paths still refuse every named unsafe character (93.409534ms)
✔ Vikunja 614 precheck: explicit null and named notifier decisions pass (332.07012ms)
✔ Vikunja 614 precheck: notifier config refuses missing, public, malformed and extra-key decisions (1356.90404ms)
✔ CLI off, absent and other-only channel selections refuse every project/thread flow before any effect (28.168307ms)
✔ CLI enabled project/thread lists dispatch through selection without changing output (3.108085ms)
✔ both channels off recover through the existing human CLI, socket and organization writer (4971.649931ms)
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (69.336629ms)
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (48.250596ms)
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (55.878064ms)
✔ decide prints a declining choice as declining (39.653506ms)
✔ an unknown outcome is reported once and never resent (42.773374ms)
✔ a decision closed before the answer arrives exits 2 and points at its trail (28.552254ms)
✔ a prefix that matches two open decisions exits 2 and resolves neither (38.028192ms)
✔ without --business a command uses the live host's business, and a stale host.json is not a host (31.913785ms)
✔ every human command refuses inside an agent run before it touches the bus (34.831874ms)
✔ usage errors exit 4; no business and no host is a usage error (37.36094ms)
✔ agents and tasks print through the broker (30.096289ms)
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (3.44358ms)
usage: {"event":"usage-unknown","business":"acme","run":"r0beacbdb1909","instance":"assistant","turn":"b9dd4aaa-399f-4ccc-958c-ace51fecb6c7","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r79d60c151124","instance":"assistant","turn":"f335efc7-59f5-4ec4-9580-339320f3105a","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T3 a run collects compactions at its start and its end, and the count holds across a resume and a host restart (4015.286265ms)
usage: {"event":"usage-unknown","business":"acme","run":"r4462f8f47176","instance":"assistant","turn":"e1173d8f-0dfa-45b6-8a4e-2660a0267e61","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r7ff34e3b0f4e","instance":"assistant","turn":"914bda6b-ed22-49d5-a634-206d7a4c49a5","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T3 a collection that fails is logged and recorded store-unreadable, and the run ends as one whose collections count (3376.157072ms)
usage: {"event":"usage-unknown","business":"acme","run":"r8bd8e8ca1ed1","instance":"assistant","turn":"e59d0bad-f45b-408e-8304-eba51b278bb2","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r166a26420aeb","instance":"assistant","turn":"dba2ac5e-13a2-4296-9abd-4c4ecd1a04a4","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T3 the read budget is the system config's compactionReadBytes, and a bad value takes the default (3605.679597ms)
usage: {"event":"usage-unknown","business":"acme","run":"r2e53a0da04af","instance":"assistant","turn":"ce92c608-09c1-4c09-83d4-49da0671953e","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"ra8edc1d91462","instance":"assistant","turn":"9002c702-5152-480e-9d66-4742ec527c9b","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T3 the stream cap is the system config's compactionStreams, and a bad value takes the default (3475.306679ms)
usage: {"event":"usage-unknown","business":"acme","run":"r5d129cbfadd4","instance":"assistant","turn":"130570f2-b027-4954-b12f-440440d4e7c5","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T3 T4 a clear leaves the retired session's count as it was, its successor counts from 0, and a legacy session reads the thread's ledger (3208.548035ms)
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (100.944112ms)
✔ trackers come from the tracker.* variables of the one project that names a tracker project (156.863737ms)
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (78.19274ms)
✔ two projects that each name a tracker project refuse, since the boot shape holds one (75.340937ms)
✔ a business without tracker.baseUrl gets no trackers entry (75.65331ms)
✔ an unknown business and a broken system config refuse with exit 3 (131.963666ms)
✔ Row 252 (Webby N1): every console.sso subject reaches the boot as a console owner, and no sso means no consoleOwners key (78.447179ms)
✔ row 199: issue and rotate send the stdin token once to credentials.issue and print no value (13.926536ms)
✔ row 199: rotate goes ahead on each held state, rotation-due included, and refuses not-issued, revoked and an unknown entry (7.399422ms)
✔ row 199: status, revoke and delete; the tester runs status and revoke only (7.726811ms)
✔ row 210: issue of a host.<id> kind prints public material only (3.837223ms)
✔ row 199: scripts/mosaic sends credentials to packages/cli, not the seat CLI (219.79204ms)
✔ follow prints an unsolicited message after plain talk returned (70.342915ms)
✔ talk --follow continues after reply and prints a later unsolicited message (75.557014ms)
✔ inbox lists all unread human messages under decisions, does not deliver or read them (904.73876ms)
✔ follow refuses agent context and bad arguments (44.422889ms)
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (36.277127ms)
✔ plain talk leaves the process SIGINT handlers unchanged (49.365114ms)
✔ empty views say so (1.504179ms)
✔ agents adds a thread line for each held thread claim, after the roles (0.265607ms)
✔ the trail keeps the broker's order and names a decision's task without its rows (2.730757ms)
✔ tasks print the tracker fields the snapshot carries (0.275152ms)
✔ guardDocker refuses a compose run unless PI_AUTH_FILE is a regular file inside the lane temp root (9.883376ms)
✔ cleanEnv points PI_AUTH_FILE at the lane fixture and drops MOSAIC_LIVE_PROVIDER (1.196274ms)
✔ test-release.sh activates through the mock adapter with a 0600 fixture auth file (3402.867757ms)
ℹ {"script":"test-release.sh","extra":[],"wallMs":2790,"status":1}
✔ test-task.sh mounts only its fixture, uses only the mock adapter and prints the live skip twice (13282.824762ms)
ℹ {"script":"test-task.sh","extra":[],"wallMs":13116,"status":1}
✔ M-T: MOSAIC_LIVE_PROVIDER=1 runs the real-model cases, which fail under a fixture auth file (14234.825924ms)
ℹ {"script":"test-task.sh","extra":["MOSAIC_LIVE_PROVIDER","PI_AUTH_FILE"],"wallMs":14081,"status":1}
✔ parallel lease holders use only the active lane and its shared state (42.675683ms)
✔ unrelated home changes do not become lane writes, and own-root references do (0.544899ms)
✔ proof summaries refuse missing timings, non-overlap and a pair without a lane swap (1.360626ms)
✔ an exhausted single-port band refuses, and an occupied foreign listener survives the probe (28.736085ms)
✔ parallel child allocators share real lane locks; a lease remains held through child shutdown (311.812641ms)
✔ abrupt allocator death releases its holder without touching a foreign lease (97.323528ms)
✔ fixture caches survive a replacement environment with a separate tmp subdirectory (46.823919ms)
✔ an unrelated session can append while a supervised step runs without becoming an attributed write (124.752091ms)
✔ a changed COPY input or actual image ID refuses compatible image sharing (10.022682ms)
✔ warm Docker guard disables implicit build and pull and refuses image mutation (8.614874ms)
✔ exclusive image preparation records actual image ID and build wall time and requires a grant (5.287878ms)
✔ cleanup refuses a foreign Docker label and removes only an exact owned project (0.797292ms)
✔ missing receipt and missing image refuse without permitting a gate (3.34132ms)
✔ a tag changed between supervised steps fails the next boundary and suppresses gate success (66.147092ms)
✔ mutable-base rebuilds with identical files have distinct image IDs; cold and warm counters stay separate (8.216069ms)
✔ warm pinned execution records zero builds and checks the tag again after its final step (94.090951ms)
✔ installed Compose accepts rewritten run argv without starting a container (165.371184ms)
✔ installed Compose resolves the private override with no build and the pinned image (131.699301ms)
ℹ {"installedComposeConfig":{"buildPresent":false,"image":"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}
✔ guard owns every Compose file argument and refuses caller configuration overrides (2.188016ms)
✔ changing packages/processing-control/src/state.mjs invalidates the image receipt (3.832556ms)
✔ changing packages/processing-control/src/entrypoint.mjs invalidates the image receipt (5.489665ms)
✔ unfinished dead-owner runs quarantine their lane and a recovery record clears only that run (7.879544ms)
✔ a legacy landing gate beside a lane stays legacy even with the same parent (3.74657ms)
✔ the shell status entry reads scratch receipts and reports legacy processes without mutating old slots (142.581695ms)
✔ recovery supersedes an unclean terminal without rewriting either receipt (5.686032ms)
✔ the wrapper refuses a held lane lock and preserves its inode (106.355855ms)
✔ a held kernel lock without a start receipt is BUSY rather than CLEAR (19.829125ms)
✔ SIGKILL leaves a quarantined run and locked recovery publishes a new clean receipt (601.932057ms)
✔ a malformed receipt refuses status and an identity mismatch cannot look live (5.219396ms)
✔ a symlink lock is refused before acquiring or replacing its target (87.914965ms)
✔ failed recovery keeps quarantine and never publishes a clean recovery receipt (518.317846ms)
✔ two shared image holders coexist, but exclusive preparation refuses their lock (233.377756ms)
✔ two simultaneous shell claims have one winner; supervisor retains lock FDs and ordinary children do not (219.268118ms)
✔ same checkout and a legacy land gate each refuse a claim on an otherwise free lane (10.556412ms)
✔ recovery kills a proven surviving child, preserves a foreign child and keeps quarantine if interrupted (956.998647ms)
✔ preflight refuses unsafe lane roots, missing grants and live port 9 before side effects (73.519956ms)
✔ discovery preserves all package and script steps while ignoring non-file shell names (36.872177ms)
✔ a failed step stops the gate and records its nonzero exit without running the next step (43.911488ms)
✔ a cancelled step stops its process group and records failure (149.359643ms)
✔ step receipts retain pass fail skipped counts and hashes of their actual logs (80.846712ms)
✔ preflight rejects a real 31-byte root, missing dependency tree, occupied band and missing inventory (113.299193ms)
✔ preflight refuses canonical and builder checkouts and an existing output (40.44806ms)
✔ both candidates must carry every approved launcher file (36.029268ms)
✔ the 92-byte socket example passes and an over-107-byte pathname refuses (0.473578ms)
✔ package/script duplicates stay and every supervised step clears NODE_TEST_CONTEXT (200.011016ms)
✔ scoped ss loopback and wildcard port 9 listeners refuse (94.408535ms)
✔ step children use legacy umask 022 while the supervisor retains 077 (93.545074ms)
✔ lane wrapper keeps its state directory and lock files private (200.278028ms)
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (2233.556799ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (1838.528109ms)
✔ the size cap refuses a push before any byte (477.009099ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (1545.019975ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (772.194028ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1414.988457ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (897.192078ms)
✔ a review of a project the business no longer has refuses unknown-project (842.768725ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (439.515572ms)
✔ close() answers host-closing to a connection still sending its request line (433.927108ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (819.434834ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (1448.146974ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (3212.183335ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.885709ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (865.168325ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (48.963375ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.339631ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (1119.488844ms)
✔ land: the squash runs the gate in its own worktree, then main moves and the broker records it (1711.821986ms)
✔ land: an arbiter-resolved landing's squash says the arbiter resolved it through the broker (1709.485749ms)
✔ land: refusals before the gate answer the role at once and leave main and no worktree (1725.911927ms)
✔ land: a failed gate is refused gate-failed with its step, told to the role, and main stays (1346.586942ms)
✔ land: a record the broker refuses moves main back, and the landing is refused with the broker's code (1221.408412ms)
✔ land: a second landing while one runs refuses land-busy, and close() stops the gate and refuses host-closing (1148.703799ms)
✔ row 298 CLI: scope reads and scope set sends JSON and the observed revision (11.996303ms)
✔ row 298 CLI: every access agent marker refuses scope set before transport (6.43813ms)
✔ row 298 CLI: --tester cannot read or change the scope (1.325369ms)
✔ row 298 CLI: missing revision and empty, invalid or oversized JSON refuse without a call (6.297106ms)
✔ row 236: grants status prints one line per entry, and --json the answer (11.001821ms)
✔ row 236: run, revoke, sweep and admin rotate and remove send their args (1.785706ms)
✔ row 236: admin set sends the stdin token once to grants.admin.set and prints no value (10.654434ms)
✔ row 236: a malformed grants command is a usage error and calls nothing (18.480678ms)
✔ row 236: a bus refusal exits 2 with its code (0.831092ms)
✔ row 236: scripts/mosaic sends grants to packages/cli, not the seat CLI (230.546439ms)
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1292.173723ms)
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (515.909792ms)
✔ a second host for the same data root refuses with exit 3 while the first runs (365.626222ms)
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (1009.338716ms)
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (2.097521ms)
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (1.687848ms)
✔ a live host's lock stays, however old the file is (0.946478ms)
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (1494.875238ms)
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (504.001657ms)
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (66.599241ms)
✔ a broker fork that throws leaves no host.lock and no host.json (76.389417ms)
✔ a broker send that throws leaves no host.lock and no host.json (74.356687ms)
✔ a broker that misses its boot wait leaves no host.lock and no host.json (96.993724ms)
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (387.302312ms)
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (356.825413ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (382.231442ms)
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (359.352383ms)
✔ a host.json that can't be written stops both children and leaves no host.lock (569.291167ms)
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (60.963821ms)
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (305.664912ms)
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (451.432645ms)
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (493.438818ms)
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (489.022ms)
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1354.883738ms)
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (680.396767ms)
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (368.768787ms)
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (439.553002ms)
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (476.315699ms)
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (364.142165ms)
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (448.273529ms)
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (331.882977ms)
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (447.513044ms)
✔ watchChildren reports a child that died before it was called, and one that dies later (43.020225ms)
✔ bus stop refuses to signal a live pid that is not a bus host (206.279459ms)
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (721.692922ms)
✔ bus start refuses with exit 3 without a notifier config (254.11278ms)
✔ bus start runs until bus stop; status reports it while it runs (1434.38905ms)
✔ bus start --no-launch says launches are disabled in its host-up line and stops cleanly; with --pm it is a usage error (1227.020769ms)
✔ bus-service.sh renders the unit and installs it into a given directory (545.388038ms)
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (939.405428ms)
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (195.852408ms)
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (130.721616ms)
✔ bus start --pm while halted keeps the control host up without launching the chief (833.55008ms)
✔ row 234: hosts status prints one line per host, and --json the rows (4.619345ms)
✔ row 234: hosts check and remove send the host id, as the human or the tester (1.067849ms)
✔ row 234: a malformed hosts command is a usage error and calls nothing (4.702501ms)
✔ row 234: a bus refusal exits 2 with its code (1.003184ms)
✔ row 234: scripts/mosaic sends hosts to packages/cli, not the seat CLI (180.483354ms)
✔ row 235: hosts revoke sends agent, host and reason, and sweep the host, as the human or the tester (0.928083ms)
✔ row 235 (N10): revoke without --reason, --reason on another verb, and inherited names are usage errors (8.831228ms)
✔ row 235: a status line shows the tags of a revoke in progress (0.877977ms)
usage: {"event":"usage-unknown","business":"acme","run":"ra8b89e4ac873","instance":"assistant","turn":"d0ad9cb8-34c0-4c52-a9d5-73aa879cf3fc","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r5d9d92909fd2","instance":"assistant","turn":"560955f9-2c65-4a40-8286-8eeebafe1c59","source":"@none","code":"baseline-unknown"}
✔ row 302 REQ-THREAD-2 an idle-released run whose call lands before the SIGTERM ends stopped/0; a run whose claim the human revoked in the same window still ends session-invalid/22 (1921.507358ms)
organization: {"event":"reload-needs-restart","business":"acme"}
organization: {"event":"reload-needs-restart","business":"acme"}
✔ row 165 CLI: instance add puts an instance in the file, validate exits 0, the log names the human, and the instance binds with no restart (row 194, T1) (336.273378ms)
✔ row 194 CLI: a bus whose boot credential references differ from the file answers restart needed, and doesn't bind the instance (D3 item 3) (200.022034ms)
✔ row 165 CLI: instance set passes the vars file and --no-launch, and a vars-only change needs no restart (290.533846ms)
✔ row 165 CLI: a refusal names its code and why, exits 2 and keeps the bytes (170.95135ms)
✔ row 165 CLI: usage errors exit 4 before any bus call, and an agent session is refused (129.783555ms)
✔ row 165: scripts/mosaic sends business instances, instance and (row 194) veto to packages/cli, and validate still to packages/business (424.923052ms)
✔ row 194 CLI V6: veto keep, unkeep, nohire and hire write through veto.set, the read shows kept and noHire, and a no-op refuses (285.320198ms)
✔ row 194 CLI: the read lists each instance's running run from the bus claims (169.005519ms)
✔ row 194 CLI D1.1 item 5: launch and regenerate poll instance.request and print the run; a done with a refusal exits 3 with its code and the request id (157.087941ms)
✔ row 194 CLI D1.1 item 5: an open request at --wait exits 3 with its id, and a taken one with no done is outcome-unknown (1259.391901ms)
✔ row 194 CLI: a request cancelled by a terminate exits 3 request-cancelled (131.383285ms)
✔ row 194 CLI V3: terminate prints the runs, the cancelled and the taken requests, and nothing held refuses not-held (133.043624ms)
✔ row 194 CLI V5: delete polls to the transaction and the read lists the name retired; workspace-rename-failed names the transaction (253.187055ms)
✔ row 239 T5 CLI: a delete closed -revoked says the tokens may already be revoked; a plain revision-conflict doesn't (197.077845ms)
✔ row 194 CLI: lifecycle and veto usage errors exit 4 before any bus call (134.138832ms)
✔ REQ-LIMIT-2 a claude-code launch asks mayLaunch with launch.account.name (34.549055ms)
✔ REQ-LIMIT-2 each login set the account can name is accepted when the bus host holds exactly it (67.472411ms)
✔ REQ-LIMIT-2 account-credential-missing: the named set is not a login set, or the bus host lacks part of it (66.080363ms)
✔ REQ-LIMIT-2 account-credential-ambiguous: the bus host sets a credential variable outside the named set, ANTHROPIC_BASE_URL included (41.297162ms)
✔ REQ-LIMIT-2 account-is-credential: launch.account.name is the value of a credential variable the bus host sets (24.649988ms)
✔ REQ-LIMIT-2 a pi launch carries account null and skips both account checks (33.493399ms)
✔ REQ-LIMIT-2 with no launch.account a claude-code launch carries null and the environment is not checked for ambiguity (17.08426ms)
✔ REQ-LIMIT-4 the launcher asks mayLaunch with the instance, provider, model and account (row 126), and goes on to authorization on an allow (33.666035ms)
✔ REQ-LIMIT-3 REQ-LIMIT-4 a launch whose subject is at its limit is refused limit-reached and logged with the check, limit and count (15.701049ms)
✔ REQ-LIMIT-4 fail closed: a refused op, a check failure or a malformed answer refuses limit-check-failed, naming the check and the code (150.775642ms)
✔ REQ-LIMIT-4 the launcher reaches token-limit only through the bus: launcher.mjs imports no limit check (1.144066ms)
✔ a launcher before trusted control initialization refuses processing-uninitialized (5.821978ms)
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (77.768606ms)
✔ row 65 a passing primary is the route: its provider and model reach mayLaunch, and a stated fallback is never used (37.324528ms)
✔ row 65 a failed primary preflight takes the stated fallback, and the limit checks see the fallback route (23.953635ms)
✔ row 65 a failed primary with no fallback refuses with the preflight code and never asks mayLaunch (22.668469ms)
✔ row 65 a fallback whose own preflight fails refuses with its code and names both reasons (48.160813ms)
✔ row 65 the fallback route spends launch.account when its module counts the account (20.688145ms)
✔ row 65 a missing harness, model or thinking var refuses no-route naming it, and the system execution keys never fill it (54.263304ms)
✔ row 65 a harness that is not switched on refuses harness-off, primary or fallback, and an off primary never falls back (65.066607ms)
✔ row 65 the loader refusing a module refuses harness-refused and names it; a module that throws refuses harness-failed (41.408157ms)
✔ row 65 a thinking level the route harness does not apply refuses thinking-unsupported, on the primary or a fallback taken (58.813833ms)
✔ C2-04: launcher workspace clones code but never the library (1739.882224ms)
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1682.649983ms)
usage: {"event":"usage-unknown","business":"acme","run":"rf1d6e28b94e5","instance":"chief","turn":"5e5dbaa6-f5a3-4814-ab09-abe9a2b6a938","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r3ef2261df66c","instance":"coder","turn":"b674fccf-a83d-4ed3-9edc-acfa1edbfeec","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rf1d6e28b94e5","instance":"chief","turn":"951555f9-a63d-438f-95b1-f36b8627eee2","source":"@none","code":"baseline-unknown"}
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (1303.562495ms)
usage: {"event":"usage-unknown","business":"acme","run":"rccf448cd24d8","instance":"chief","turn":"cae1b9a8-8d34-4a60-83f1-0754ccf0909f","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rb513a44eae1f","instance":"pm","turn":"adddaf51-3ddc-45cd-86fe-bb854983eadb","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rccf448cd24d8","instance":"chief","turn":"3642901c-3ffa-462a-8bb9-cf15371d2602","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rccf448cd24d8","instance":"chief","turn":"f8944f4a-9ca7-4504-b8f4-dafc8eda7662","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rb513a44eae1f","instance":"pm","turn":"3fb7011d-105b-4530-a935-408105cf8974","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rb513a44eae1f","instance":"pm","turn":"f38e079c-0e30-4a4d-b3a6-52e86e99d4b8","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rccf448cd24d8","instance":"chief","turn":"d8fda3b5-494e-429c-97d4-82c8e7df5eb1","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rb513a44eae1f","instance":"pm","turn":"823d812a-b5f1-4742-83a2-19053ca9376e","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rccf448cd24d8","instance":"chief","turn":"c957d825-c4d4-46c7-a19f-8fdd8876ed04","source":"@none","code":"baseline-unknown"}
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1815.938864ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (5130.058218ms)
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (1264.734224ms)
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (817.961655ms)
usage: {"event":"usage-unknown","business":"acme","run":"rcfb2293ff24f","instance":"coder","turn":"5116c126-26ca-4719-a533-e453c7613840","source":"@none","code":"baseline-unknown"}
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (1387.281727ms)
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (1519.040669ms)
✔ after a restart, the new host's first tick starts a holder whose decision is still held (1874.066459ms)
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (1168.12818ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (620.886697ms)
✔ a runner that stops at once ends its launch with the runner's reason (665.905511ms)
✔ a Claude Code launch with no session credential refuses before it starts (373.993544ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (582.123385ms)
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/beakley-row217/packages/plugins/harness/down is missing","kept":[]}
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/beakley-row217/packages/plugins/harness/down is missing","kept":[]}
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (592.058924ms)
✔ a runner killed from the host ends its launch as killed, not failed (591.845367ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (328.045592ms)
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (306.353546ms)
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (422.021803ms)
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (302.5524ms)
usage: {"event":"usage-unknown","business":"acme","run":"rc362fe69c564","instance":"chief","turn":"e32b5baf-5cc8-44b4-a0ea-8036da9ca503","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rc362fe69c564","instance":"chief","turn":"097e3d49-f4ed-434f-a38e-45b2cb450e65","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r31b0d21b18a2","instance":"coder","turn":"37baa864-5655-4ee7-b0aa-79c57d0f24c3","source":"@none","code":"baseline-unknown"}
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1908.14738ms)
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1458.958359ms)
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4380.441229ms)
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (329.236521ms)
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (245.901667ms)
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1356.729498ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (290.164088ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (310.118414ms)
✔ a launch client that never closes its side doesn't hold the host's close (407.741749ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1626.085747ms)
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (573.153388ms)
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (577.044224ms)
✔ a launch waiting across halt and resume cannot use its stale admission (420.062526ms)
✔ row 194 T2: the human's launch runs an unlisted instance and launch.by through the pm branch, and closes with the run (766.901913ms)
✔ row 194 T2: a request past its 60 s never launches, and a refused check closes the request with its code (163.675199ms)
✔ row 194 T3: a --no-launch host closes each request launches-disabled and starts nothing (141.296614ms)
✔ row 194 T3: a limit refusal closes the request with its code and the limit in the launch log (399.400614ms)
✔ row 194 T4: terminate revokes and cancels at the verb, then the pass signals the run, which ends once (504.852827ms)
✔ row 194 T5: regenerate ends the run in the registry and starts a new run on the same workspace (1091.742081ms)
✔ row 194 T5: a run that outlasts the request's mark closes the regenerate regenerate-timeout and starts nothing (2942.340487ms)
✔ row 194 V5: delete retires the name, renames the workspace to .retired/I-<transaction> at 0700, and a retry renames after workspace-rename-failed (209.697978ms)
✔ row 194 V5: a delete with no workspace commits and closes with the transaction (189.493834ms)
✔ row 281 T10: the delete pass closes a granted instance's first request grants-revoking and the host channel stays up (192.311356ms)
✔ row 194 D1.1 item 5: the CLI's launch, regenerate, terminate and delete end to end through the pass, and a closed refusal exits 3 with the request id (970.315885ms)
✔ row 194 T20: a store-only delete with a tracker bot closes naming the bot, and the CLI says to remove it in Vikunja (170.594648ms)
✔ row 194 T2a: a launch.revoke between the request and the pass closes it launch-revoked with no process; a done that fails once leaves the request taken and the next pass starts nothing (389.112825ms)
✔ row 194 T4: terminate signals a spawned run in the registry that the bus never bound, and not a run whose start time differs (471.078878ms)
✔ row 194 T9a: fire signals its bound run and a spawned but unbound registry run; a SIGTERM-ignoring runner gets SIGKILL and lifecycle.end.killed, and one whose kill fails gets lifecycle.end.alive (1213.714706ms)
✔ row 194 T9a: fire of a registry run with no runtime record reads lifecycle.end.alive with reason unknown, never killed (659.541333ms)
✔ row 194 T9a: a runner whose identity changed before the SIGTERM gets no signal, and one whose identity changed between the SIGTERM and the SIGKILL gets no SIGKILL (322.267306ms)
✔ row 194 T9a: V3 terminate of a SIGTERM-ignoring runner sends no SIGKILL (1076.358737ms)
✔ row 194 T9b: a halt during a fire's stop sends no second SIGTERM, keeps the fire's deadline, writes one stop receipt with reason fire and the request, and counts the run; a fire while halted refuses (1812.007011ms)
✔ row 194 T15: while halted the pass closes a launch and a regenerate processing-halted and runs no thread pass, terminate signals, and after a resume a launch starts (510.829629ms)
✔ row 194 N6: a run spawned after a terminate's verb survives its pass, and the next terminate ends it (632.496682ms)
✔ row 194 T6: a delete leaves the run evidence bytes unchanged, and the retired name refuses a create and a launch (662.917284ms)
✔ row 194 T11: two stack roots with the same business id; a launch, a terminate and a delete in one leave the other byte-identical (865.55069ms)
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"2798c194-a519-499f-9030-953ffa975c50","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"345306db-252a-49f2-8abf-67e846723bd9","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"ab26ce59-2785-4a39-a7ca-95f90d1dda81","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"7c2541b8-5820-4f8f-975b-ece208f51d62","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"c4d22421-a067-4d20-a1ae-b39cd5211410","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"cd79e05e-7e8e-446c-8c3d-87d54f647b31","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r68305ff2e1bf","instance":"chief","turn":"7a3165e7-5ede-4ab3-add2-f4d0f95e78f8","source":"@none","code":"baseline-unknown"}
✔ row 194 D3 item 5: the chief's session hires with its tool and launches its hire in the same session, then fires it (2092.35332ms)
✔ REQ-LIMIT-3 REQ-LIMIT-4 formatTokens shows each limit counted, not enforced, or check failed, in reset path words (1.479531ms)
✔ REQ-LIMIT-2 row 126: any daily quota row adds one line after the list saying the count is this stack's own use (0.448359ms)
✔ REQ-LIMIT-3 the view prints the limits then the token lines; --json keeps tokens in the result (4.920358ms)
✔ REQ-LIMIT-3 reset reads the revision, then sends limits.set with one path per limit, a word per level (1.42055ms)
✔ REQ-LIMIT-3 reset with no path, or with --file, is refused before the bus (2.355481ms)
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (23.407603ms)
✔ limits view/set use the human bus transport and pass only the explicit patch (3.428306ms)
✔ limits set passes an assistants patch through unchanged, and the usage names the key (1.752088ms)
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (325.186995ms)
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (4.116963ms)
✔ inbox --read marks one message by the id inbox prints, delivered or not, and leaves the rest unread (55.532073ms)
✔ inbox --read refuses an id that is not the human's, prints its code, still marks the rest and exits 2 (40.172107ms)
✔ inbox --read refuses an ambiguous or short prefix, names every match, reads nothing for them and marks the rest (1.580797ms)
✔ inbox --read-all marks every message the inbox walk lists, delivered or not, and inbox then shows 0 unread (1598.66114ms)
✔ inbox --read stops on an error that is not about one message (1.673319ms)
✔ inbox --read and --read-all refuse bad combinations; other verbs refuse them (32.235153ms)
✔ the human names an instance, lists it, and talk's message.send reaches it by that name (43.011672ms)
✔ name and names refuse the wrong number of arguments with the usage (27.224049ms)
✔ zoned uses the IANA zone across DST (24.938519ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (40.944118ms)
✔ two blocking decisions get two DMs with different nonces (30.275985ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.350377ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (29.835634ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (34.037498ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (40.848032ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (33.169483ms)
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (264.744428ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (146.176768ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (55.139995ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (31.936672ms)
✔ an inbox read failure is logged and the next poll retries (1.52626ms)
✔ no Discord id reaches the journal or the log (31.527796ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (3.185844ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (9.382263ms)
✔ the journal: a whole file that is one torn line truncates to empty (2.371257ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (1.150265ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (2.492252ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.979095ms)
✔ the journal: a symlinked directory refuses and says it is a link (0.692353ms)
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (1.030697ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.72132ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.847983ms)
✔ digest content stays within Discord's 2000 characters (0.549905ms)
✔ runLoop never overlaps ticks and stops after the one in flight (116.66849ms)
✔ processing halt prevents notifier reads and sends and fences the wait before delivery (71.373997ms)
✔ Q247: bootConfig omits tracker setup even with tracker variables left in the business (14.614051ms)
✔ Q247: trackerless business boots and registers no @sync credential (102.101513ms)
✔ Q247: Console business read works with tracker absent and shows no sync credential (5.476329ms)
✔ Q247: a present tracker with a missing token still refuses bus boot (29.714516ms)
✔ a human command refused with human-required prints the other-tree line and exits 3 (5.073208ms)
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.741627ms)
✔ other exit-3 refusals print no other-tree line (2.670909ms)
✔ the line names no path (0.196301ms)
✔ human halt/status/resume uses management transport without loading any channel (56.268583ms)
✔ halt refuses inside an agent before transport (25.724666ms)
✔ resume refuses inside an agent before transport (23.043458ms)
✔ unknown and partially stopped outcomes are never reported as a successful halt (32.122477ms)
✔ threads project resolution explains a business repository and falls back if its file cannot load (109.864584ms)
✔ project create prints the repository-name refusal and exits two without writing (60.396154ms)
✔ project init/check use declared business repo and never contact the bus (265.632378ms)
✔ project commands validate args and refuse undeclared projects and agent init (66.393572ms)
✔ project create and list validate their arguments before any bus call (56.226662ms)
✔ project dispatcher reaches the human CLI (186.481762ms)
✔ T3 end to end: publish under an approved decision sends the work commit to the agent's own fork and records it once (1312.69961ms)
✔ T3 end to end: a fork the token can't reach is fork-unavailable, filed once, and nothing is recorded as allowed (884.755804ms)
✔ a bad branch or project refuses before the broker; a fork, user or ref in the request is ignored (953.564145ms)
✔ T3 end to end: two agents, one project, each lands on its own fork only; the upstream receives nothing (1617.701014ms)
✔ T3: a push after checkPublish and before the lock refuses ref-moved; the fork receives nothing (1036.208937ms)
✔ T3: a push recorded while the bus process pushes refuses decision-mismatch; only the decision's commit reached the fork (948.422121ms)
✔ row 237: two publishes race on one decision; the second refuses publish-busy and exactly one push reaches the fork (1048.089841ms)
✔ sage-1440: the publishResult poll is bounded: publish-timeout, filed once, and nothing recorded (896.984617ms)
bus: publish c9c429bb-1551-4d55-b22a-f8fc8861390e: pushed after the git socket refused publish-timeout; recorded
✔ row 242: a retry after publish-timeout refuses publish-busy while the bus process's push runs; the late push is recorded and the decision pushes once (1142.259814ms)
✔ C2-06 CLI replies reads revision and sends only the JSON settings to the human verb (6.114121ms)
✔ C2-06 CLI replies requires a file and refuses tester writes before a bus call (1.009499ms)
usage: {"event":"usage-unknown","business":"acme","run":"r0482c4de2d88","instance":"assistant","turn":"6e963b1f-29a4-4d00-8227-06511849295f","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rb7b61df0203e","instance":"assistant","turn":"7ff4e737-6af4-468e-bc82-f9651b416d0f","source":"@none","code":"baseline-unknown"}
✔ row 306 REQ-LAUNCH-1 R4 a revoked run whose call lands before the SIGTERM ends stopped/0; a run the human stopped in the same window still ends session-invalid/22 (1153.490496ms)
usage: {"event":"usage-unknown","business":"acme","run":"r167ae8c70013","instance":"assistant","turn":"089be4a0-f596-422b-a36e-444da1499c4f","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rd4380be116e3","instance":"assistant","turn":"13d06d23-0adc-4e51-b5f4-05319fd50b27","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T4 D7 D8 N6: a clear of a running session stops its drained run once, retires it on the run's end, and starts the successor fresh in its own namespace (1324.808754ms)
usage: {"event":"usage-unknown","business":"acme","run":"r8aa04ad153e9","instance":"assistant","turn":"2f17c871-1b3e-483e-aeb3-ae81d38ad66c","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T4 D8: a successor start refused capacity-full is held, reported and logged once, and starts when capacity frees (5010.612198ms)
✔ REQ-THREAD-2 T4 D7 Q2: after a restart, a live survivor of the cleared run holds the clear at drained with no signal, and its exit lets it retire (811.171518ms)
usage: {"event":"usage-unknown","business":"acme","run":"r4a76efba2a45","instance":"assistant","turn":"c9338ef1-5d5b-410b-9d4d-24daeeaae3ee","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T4 D7: a drained run that outlives the stop timeout makes the clear uncertain once, with one signal, and it retires on the run's end (2172.839403ms)
usage: {"event":"usage-unknown","business":"acme","run":"rfc03cc9f7e72","instance":"assistant","turn":"68be642b-6333-47f2-9627-d2f90dbb72bb","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 T4 T6: a bus unavailable at the exit proof and then at retirement holds the clear with no retirement, successor or launch, and it resumes when the bus is back (3547.600554ms)
✔ session list/show/open select one session without changing the saved default (10.155919ms)
✔ create requires a reusable operation key and returns the broker identity (2.691761ms)
✔ invalid/foreign session selection never falls back to the default or opens a session (6.724657ms)
✔ unsupported clear refuses with a reason and never opens or creates a replacement (1.586037ms)
✔ clear waits by operation reads only, keeps revision, then reports pending at 30s (3.084559ms)
✔ count output distinguishes exact zero, lower bounds and unavailable collection (0.386714ms)
✔ session CLI real broker: create/list/open keeps default and selectors isolated (55.777739ms)
✔ explicit --session on thread reads, opens and talk never drops the selected id (5.440532ms)
✔ repeating clear with a recorded operation queries it and never sends a new revision (1.020793ms)
✔ new CLI surface refuses forged agent identity before reaching transport (0.665339ms)
✔ cancel requires confirmation, uses the clear op and accepts cancelled before or after retirement (1.919946ms)
✔ cancelled operation is terminal: clear polling stops without another write (0.796531ms)
✔ routed message cancellation prints its stored receipt and never waits for a reply (1.021083ms)
✔ 272 N2: reusing another session clear key gives a precise refusal without a write (0.697811ms)
usage: {"event":"usage-unknown","business":"acme","run":"r4d834ab9ed45","instance":"assistant","turn":"5a8c01c8-1858-4c33-8028-a35cd4ba29d8","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r5a62ebe55461","instance":"assistant","turn":"0bb441c4-14f1-4601-a229-a28c66d94e4e","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r6fe1f0aae090","instance":"assistant","turn":"cab01b31-ca46-4bb8-8b50-3b622e48a0c2","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r3c1832addd28","instance":"assistant","turn":"d1709124-2de4-48a6-917a-2ba06c83a13f","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 two sessions of one thread, and another thread's default, run at once, each with its own store and workspace; a restart of one resumes only that one (6792.898277ms)
usage: {"event":"usage-unknown","business":"acme","run":"r08d916564c1a","instance":"assistant","turn":"bc56fe19-2fd8-4a8b-81c7-441723dfe592","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a legacy session resumes the thread's old store at the old in-sandbox cwd, in a workspace of its own (611.299089ms)
usage: {"event":"usage-unknown","business":"acme","run":"r60647d498531","instance":"assistant","turn":"2e5d07fb-64f4-4de5-9c9b-504e9b84e5d3","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a live lock on a session workspace refuses session-workspace-busy before any checkout; a stale one is taken over (1711.359463ms)
usage: {"event":"usage-unknown","business":"acme","run":"r2914c8b4cdb8","instance":"assistant","turn":"c81e8471-d3e5-4307-b852-410c2946172d","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a session start refuses legacy-run-live while an earlier host's sessionless run lives, and starts once it has exited (1736.737222ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a symlinked session workspace root refuses session-workspace-unsafe and launches nothing (296.163626ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a session workspace that holds the legacy workspace root refuses session-workspace-overlap and launches nothing (350.528848ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a symlinked session store refuses thread-store-refused and makes no workspace (383.283291ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a named session's start refuses processing-generation-changed, then processing-halted, after check() and before any spawn (592.005631ms)
✔ a copy carries every file the harness modules read from it (1279.139896ms)
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (1108.303408ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (1445.010553ms)
✔ row 190 N6: check --instance passes only when the wrapper exports the instance's MOSAIC_CONFIG (1280.366581ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (1744.409649ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (709.23638ms)
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (8905.287873ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (1278.524878ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (733.056109ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (639.08322ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (577.805579ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (594.026082ms)
✔ inherited service.d override refuses without changing the unit (597.684633ms)
✔ inherited drop-in unreadable directory or file refuses before writing (463.253406ms)
✔ row 232: copy --bundle copies a SHA the bundle's refactor reaches, byte-identical to copy SHA, and refuses the rest (3259.382451ms)
✔ row 232: wrapper --create writes the first wrapper only, the same bytes wrapper ID writes, and refuses over any file (986.889835ms)
✔ row 232: check --units external reads the system units, the default reads the user units (911.390874ms)
✔ Vikunja 614: bundle and checkout copy leave an unreadable caller directory before find (1610.573807ms)
▶ T-I1 bootstrap --instance creates each instance's config, root and marker once, and refuses what it must not claim
✔ alpha and beta get a 0700 config dir, a config naming ~/.mosaic-NAME, a 0700 root and a 0644 marker (127.307502ms)
✔ under umask 077 the config and marker are 0600: the source honors the operator's umask (57.128365ms)
✔ a second bootstrap of each changes no byte, mode or mtime (262.646366ms)
✔ a non-empty root without its own marker refuses before anything is written, worktrees included (203.7906ms)
✔ an empty existing root is claimed, and an existing config whose root lost its marker refuses, not repairs (102.543729ms)
✔ a dangling symlink at the config path is never written through, named or default (99.18732ms)
✔ bad names and stray arguments exit 4 and write nothing (773.946356ms)
✔ --instance dev writes exactly what no flag writes (119.06942ms)
✔ T-I1 bootstrap --instance creates each instance's config, root and marker once, and refuses what it must not claim (1749.221522ms)
▶ T-I2 selection: the four rows of D1 through the instance op and through an entry point
✔ row 1: no flag and no MOSAIC_CONFIG is the default; a missing default config leaves the data root empty (111.101701ms)
✔ row 2: MOSAIC_CONFIG alone is that config with the default names (49.979962ms)
✔ row 3: --instance NAME alone is NAME's config, root and suffix (104.01937ms)
✔ row 4: both must name one file; a symlink to it agrees, any other file exits 4 (677.70635ms)
✔ a named instance with no config exits 3 with its own bootstrap hint (49.320893ms)
✔ an entry point takes --instance in any position, once, and refuses a mismatch before it prints (266.11778ms)
✔ copy takes no --instance in either script: every instance shares the copies (27.056986ms)
✔ T-I2 selection: the four rows of D1 through the instance op and through an entry point (1399.537849ms)
▶ T-I7 claims: the instance op refuses a root another instance claims, and a named root with no marker
✔ alpha's config pointing at beta's root refuses instance-root-mismatch in every op (228.998006ms)
✔ MOSAIC_CONFIG naming alpha's config with no flag refuses: the root is alpha's (43.74151ms)
✔ a default config whose root carries alpha's marker refuses; one naming dev, or none, passes (160.702265ms)
✔ a named root whose marker is missing, a symlink, unparsable or the wrong shape refuses instance-root-unclaimed (391.245657ms)
✔ T-I7 claims: the instance op refuses a root another instance claims, and a named root with no marker (924.540458ms)
✔ T-I5 two real bus hosts, one per instance, run at once and each answers from its own socket under its own root (2253.01927ms)
✔ T-I10 the guard protects every instance's config dir and data roots, even under a corrupt config (179.402311ms)
✔ row 232: confirm, revert, gate, --to and --expect-from need --units external; the user-only flags are usage under it, and so are row 273's --send and --no-sso (1927.206947ms)
✔ row 232: pm-on and activate --pm-after-harness refuse external-pm (1840.246671ms)
✔ row 232: units-running (N4) refuses while a unit is active and leaves the store, the log and TAKEN; failed counts as down (4250.13986ms)
✔ row 232: activate stages: the pointer stays, AWAITING-UNITS names TO, a backup of the stopped store, no directory in the set, no --user, no journal (3007.61152ms)
✔ row 232: A3 order: capture-failed and marker-failed refuse with exit 3 and leave no marker or FAILED (2454.208044ms)
✔ row 232: confirm and revert refuse open-activation with no marker, two, the wrong copy, or one the log holds closed; refusals name no activation (4504.320214ms)
✔ row 232: confirm polls: bus status good after 3 s fails with --timeout 1, writes FAILED and leaves the rest; FAILED then refuses activation-failed (4202.808101ms)
✔ row 232: confirm polls to a pass with --timeout 10: the pointer, an ok line that reads as the started run, no marker (6275.973694ms)
✔ row 232: stale-start: @1792540799 fails a start floor of 1792540800 with stale-start (3200.82743ms)
✔ row 232: stale-start is a gate code: an enter time that turns to @1792540800 after 2 s passes with --timeout 10 (4676.405667ms)
✔ row 232: gate (N2, A2f): --since 1792540800 passes @1792540800 and fails @1792540799; it writes nothing (2962.926151ms)
✔ row 232: the external PM check reads launches list: one live run of launch.by since the start passes (10351.395235ms)
✔ row 232: revert puts the wrapper back and leaves the store when nothing migrated (1607.122627ms)
✔ row 232: confirm --rollback refuses rollback-mismatch, and logs rollback-failed with exit 2 when OLD fails its gate (3892.389847ms)
✔ row 232: confirm --rollback after a --restore swap logs rollbackCode not-attempted; rollback --restore finds an external backup (3544.492742ms)
✔ row 232: sequence 1: activate, confirm times out, revert, confirm --rollback --cause A5: gate-failed rollback ok (5110.225428ms)
✔ row 232: sequence 2: activate --migrate, the wrapper install fails, revert restores TAKEN, confirm --rollback --cause A3 (3045.270688ms)
✔ row 232: sequence 3: activate, root's A4 fails, revert, confirm --rollback --cause A4: failed code units-start (3026.876971ms)
✔ row 232: sequence 4: a capture failure leaves nothing open, then A2f's gate OLD writes nothing (2242.491106ms)
✔ row 232: sequence 5: a confirm of the wrong copy is refused, and revert and confirm --rollback still close the activation (3896.179986ms)
✔ row 232: sequence 6: a revert that fails leaves the activation open, and the next --plan refuses interrupted-run (1871.420629ms)
✔ row 232: sequence 7: adopt, two confirmed activates, rollback --to the previous copy, confirmed, logs op rollback (7422.294146ms)
✔ row 232: sequence 8: a migration that writes and fails: revert restores the backup byte for byte, confirm --rollback --cause A3 (3089.712691ms)
✔ row 232: user mode: every systemctl call carries --user, and activate, rollback and check make the base's calls (6671.685377ms)
✔ row 232: user mode: a default activate --plan prints the base's bytes (2346.01362ms)
✔ T1 adopt writes the pointer from the units once; a failing check refuses check-failed (2627.385385ms)
✔ T2 activate installs exactly the pointer's pm, claude and Console flags (4357.359308ms)
▶ T3 a hand-edited unit refuses unit-flags-drift, names the difference and changes nothing
✔ pm (1746.749844ms)
✔ claude (1456.360618ms)
✔ console (1328.381972ms)
✔ T3 a hand-edited unit refuses unit-flags-drift, names the difference and changes nothing (4532.754311ms)
▶ T4 each item 3 refusal changes nothing and logs one line with its code
✔ copy-missing (1099.209996ms)
✔ copy-unreachable (1190.701918ms)
✔ copy-schema-unknown (994.053861ms)
✔ already-active (1092.692528ms)
✔ instance-busy (another business active) (983.249814ms)
✔ instance-busy (this business activating) (969.057055ms)
✔ drop-in-override (1227.220358ms)
✔ no-pointer (615.637558ms)
✔ T4 each item 3 refusal changes nothing and logs one line with its code (8173.994624ms)
✔ T5 an activate with no migration stops the Console then the bus, installs, starts the bus then the Console (2492.088453ms)
✔ T6 a migration without --migrate rolls back with migration-needs-flag (2313.388479ms)
✔ T7 --migrate takes the backup before the migration runs (2561.025461ms)
✔ T8 a failed migration restores the backup and keeps the store it replaced (2216.487823ms)
✔ T9 a store outside the target's chain rolls back with store-newer (1902.371379ms)
▶ T10 each gate check failing alone rolls back and puts every file back
✔ units-inactive (5534.27593ms)
✔ bus-status (4779.329939ms)
✔ healthz (5153.869107ms)
✔ copy-check (5422.191321ms)
✔ pm-launch-unconfirmed (5567.042852ms)
✔ T10 each gate check failing alone rolls back and puts every file back (26457.784978ms)
▶ T10b the PM check needs exactly one launched line for a live run of this start
✔ no launched line (5528.631389ms)
✔ two lines (6573.476585ms)
✔ a changed word (5886.987962ms)
✔ run not in launches list (5450.916884ms)
✔ run started before the start (5412.807502ms)
✔ a human launch with no journal line (5280.749751ms)
✔ run for another business (5442.833498ms)
✔ run not live (5352.151718ms)
✔ one well-formed line and a live run pass (2198.858385ms)
✔ T10b the PM check needs exactly one launched line for a live run of this start (47129.002506ms)
✔ T11 a rollback whose gate fails too: rollback-failed, exit 2, both units stopped, no retry (7220.510414ms)
✔ T12 rollback takes the previous copy from the log (3211.013795ms)
✔ T13 a rollback across a migration needs --restore, then restores and goes live (3866.352258ms)
✔ T14 events written after the backup need --events N with the right N (4270.765888ms)
✔ T14b a rollback --restore whose gate fails stops both units and skips item 6 (5684.104647ms)
✔ T14c a rollback without --restore whose gate fails runs item 6 (7126.094671ms)
✔ T15 --plan names the migration and the restore and changes nothing (2544.188219ms)
✔ T26 --plan lists the commits an activate adds, after the migration lines (1354.218066ms)
✔ T27 --plan names each migration step, or says the steps cannot be read (1047.895537ms)
✔ T25 --plan refuses copies-unrelated when neither copy is an ancestor of the other (463.734572ms)
▶ T23 --plan reads the store without changing a file, stopped or held
✔ stopped store (593.504474ms)
✔ held store (589.873547ms)
✔ T23 --plan reads the store without changing a file, stopped or held (1183.887446ms)
✔ T24 business-mismatch and capture-failed refuse with exit 3; a short id is a usage error (1321.078991ms)
✔ T16 status prints the pointer, the log, the check, bus status and drift, and writes nothing (854.119591ms)
✔ T19 a started line with no final line: status shows it and every changing verb refuses (1186.164191ms)
✔ T20 a held run lock refuses run-locked without a log line; status and --plan still run (1281.154742ms)
✔ T21 a bus unit with no MOSAIC_CLAUDE_BIN: adopt and activate refuse no-claude-pin (1388.718533ms)
▶ T22 the stopped store read: a -wal or -shm refuses store-unclean and is left alone; a clean read adds no file
✔ bus.sqlite-wal (1702.865519ms)
✔ bus.sqlite-shm (1755.799093ms)
✔ clean (1880.991056ms)
✔ T22 the stopped store read: a -wal or -shm refuses store-unclean and is left alone; a clean read adds no file (5340.301479ms)
▶ T28 a unit path, drop-in directory or drop-in file that cannot be read, or a relative unit path, refuses drop-in-override before any stop
✔ unit path (781.394747ms)
✔ drop-in directory (766.696529ms)
✔ drop-in file (792.41388ms)
✔ relative unit path (780.455934ms)
✔ T28 a unit path, drop-in directory or drop-in file that cannot be read, or a relative unit path, refuses drop-in-override before any stop (3121.758137ms)
▶ T29 a bus that stops during the held-store read: --plan says so, rollback --restore refuses restore-mismatch
✔ --plan (826.194634ms)
✔ rollback --restore (2293.503064ms)
✔ T29 a bus that stops during the held-store read: --plan says so, rollback --restore refuses restore-mismatch (3120.22566ms)
✔ T30 a copy check that agrees on another copy fails the gate with copy-check and rolls back (5833.257884ms)
▶ T31 a quoted or escaped Environment= or ExecStart= is unreadable: refusals by name, nothing read from /a
✔ Environment double quotes (1731.900574ms)
✔ Environment single quotes (1730.31489ms)
✔ Environment backslash (1754.086956ms)
✔ ExecStart quotes (1687.781516ms)
✔ Console ExecStart quotes (1740.866296ms)
✔ T31 a quoted or escaped Environment= or ExecStart= is unreadable: refusals by name, nothing read from /a (8645.984059ms)
▶ T32 item 1: --pm-after-harness refuses a target without harness or a file that sets it, and passes without the PM
✔ usage: not with --pm, and only for activate (674.093735ms)
✔ pm-after-harness-target (941.055459ms)
✔ pm-after-harness-set (1277.306189ms)
✔ a pointer without pm (848.108627ms)
✔ phase 1 installs without --pm, skips pm_launched and writes the pending pointer (1934.325717ms)
✔ T32 item 1: --pm-after-harness refuses a target without harness or a file that sets it, and passes without the PM (5675.852559ms)
▶ T33 item 2: read_pointer takes pmPending only as true beside pm false; a pending pointer refuses activate and shows in status
✔ read_pointer (1543.37235ms)
✔ pm-pending, already-adopted and the status line (2806.381482ms)
✔ T33 item 2: read_pointer takes pmPending only as true beside pm false; a pending pointer refuses activate and shows in status (4350.248824ms)
▶ T34 item 3: pm-on refuses before any stop, passes with the PM, or puts the phase-1 bus back
✔ not-pending (734.227266ms)
✔ harness-unset (2375.282265ms)
✔ a launched line passes: the bus alone restarts with --pm (3316.814656ms)
✔ a failed pm_launched puts the phase-1 unit back: exit 1, still pending (6064.108073ms)
✔ a failed phase-1 gate too: pm-on-down, exit 2, both units stopped (10309.352795ms)
✔ T34 item 3: pm-on refuses before any stop, passes with the PM, or puts the phase-1 bus back (22800.812946ms)
▶ T35 item 4: rollback from pending installs --pm; a plug-in kind the target lacks refuses by name
✔ rollback from pending gates pm_launched on the old copy (3275.653734ms)
✔ after the harness set, rollback refuses until harness is gone (4576.184079ms)
✔ activate names every kind the target lacks (1155.637541ms)
✔ T35 item 4: rollback from pending installs --pm; a plug-in kind the target lacks refuses by name (9008.093609ms)
✔ T36 --plan shows the pending state and lists the row 169 refusals it can see (3321.730807ms)
✔ T37 tester-port activate writes pointer and unit, replaces the port, and supported re-pin and rollback keep it (6208.468173ms)
✔ T38 tester-port rollback to unsupported target drops flag in plan, steps, unit and pointer (3360.197677ms)
✔ T39 tester-port explicit unsupported target reads target copy and refuses before stopping either unit (720.856301ms)
✔ T40 tester-port invalid values refuse exit 4 before stopping, including tunnel and main ports (750.234221ms)
✔ T41 tester-port inherited activate to unsupported target drops it and retains drift refusal and failed-run recovery (7980.241258ms)
✔ T42 tester-port pm-on preserves pointer Console flags (3023.049007ms)
▶ T43 row 180 item 1: runs in one second get distinct activation ids, rollback sets and post-attempt stores
✔ activate then pm-on on the same copy (3015.219864ms)
✔ two restores: an old-form id and a suffixed one, each with its own post-attempt store (6075.015624ms)
✔ adopt takes the next free id too (598.747596ms)
✔ all ten names taken: capture-failed before anything stops, and the log line names no activation (903.083054ms)
✔ --restore takes an id with or without -1 to -9 and nothing else (929.061542ms)
✔ T43 row 180 item 1: runs in one second get distinct activation ids, rollback sets and post-attempt stores (11522.159885ms)
▶ T44 row 180 item 2: --plan lists tester-port-invalid and tester-port-target with its other refusals
✔ a bad tester port (2003.991552ms)
✔ without --plan a bad port is usage before any pointer read (343.356299ms)
✔ a target Console without --tester-port (936.59421ms)
✔ T44 row 180 item 2: --plan lists tester-port-invalid and tester-port-target with its other refusals (3284.578233ms)
▶ T45 row 181 items 2 and 3: the restore guard counts events and every COUNTED table
✔ both modes count events and each listed table, and a table the store lacks counts 0 (1066.405247ms)
✔ one instance_names row and no event refuses before any stop; --events 1 restores (4129.391043ms)
✔ one usage_records row and no event refuses before any stop; --events 1 restores (4166.295753ms)
✔ a listed table that cannot be read refuses restore-mismatch before any stop (2319.592709ms)
✔ the in-run recount counts the listed tables too (3162.271875ms)
✔ T45 row 181 items 2 and 3: the restore guard counts events and every COUNTED table (14844.879084ms)
✔ T46 row 181 item 4: every table in the bus schema is in exactly one of four lists (3.788354ms)
✔ T47 row 185 test 1: a same-schema activate leaves a whole backup and the log line names it (1849.977655ms)
✔ T48 row 185 test 2: a gate failure on a same-schema activate rolls back without a restore (5826.335315ms)
▶ T49 row 185 test 3: a same-schema rollback --restore restores, or refuses rows written after STAMP
✔ no rows after STAMP: restores and goes live (3333.380208ms)
✔ one instance_names row after STAMP refuses post-backup-events; --events 1 restores (3768.625419ms)
✔ T49 row 185 test 3: a same-schema rollback --restore restores, or refuses rows written after STAMP (7102.554129ms)
✔ T50 row 185 test 4: activate --plan prints the backup line and writes nothing (2425.869547ms)
✔ T51 row 185 test 5: an activate with no store file takes no backup (2008.011778ms)
▶ T52 row 186: the activate plan's backup line says what the run will do
✔ same schema (2131.850425ms)
✔ same schema with --migrate (2120.283372ms)
✔ in chain with --migrate (2189.593982ms)
✔ in chain without --migrate (1944.068667ms)
✔ outside the chain (1944.935511ms)
✔ outside the chain with --migrate (1979.222104ms)
✔ T52 row 186: the activate plan's backup line says what the run will do (12311.013514ms)
✔ T178 proxy proof header and path survive re-pin and rollback unchanged in the pointer and unit (3151.921143ms)
✔ T178 proxy proof pair survives a tester-port replacement as well (1888.632372ms)
▶ T53 row 187: activate sets, carries and drops the proof pair
✔ tests 1 and 9: the pair goes after the preview flags, before --send and the kept --tester-port, as the unit renders it; a new pair replaces it (5410.905289ms)
✔ tests 2 and 3: an activate of the live copy writes the pair; a later activate and a rollback carry it (4990.187253ms)
✔ test 2: only a pair change may name the live copy; the log keeps from and to, and rollback still goes to the earlier copy (6545.94529ms)
✔ test 2: a live-copy activate says only the Console flags change, and backs up the stopped store before it installs (3965.336359ms)
✔ test 3: pm-on keeps the pair (2976.737644ms)
✔ test 4: --no-proof drops the pair from the pointer and the unit and says so; with no pair it says so and passes (5530.489338ms)
✔ test 5: each refusal exits 3 before anything stops (3778.33529ms)
✔ tests 5 and 9: --plan lists every proof refusal with the others and writes nothing (848.583793ms)
✔ test 6: usage errors (814.820879ms)
✔ test 7: a rollback to a copy without proof support drops the pair and says so (3385.469638ms)
✔ test 7: an activate to a copy without proof support refuses proof-target without --no-proof and passes with it (3775.020345ms)
✔ T53 row 187: activate sets, carries and drops the proof pair (42023.764147ms)
▶ T54 row 188: a carried pair gets the proof file checks, and a proof file inside the repository refuses
✔ test 1: an activate that carries the pair refuses after chmod 644, in the plan and the run, before anything stops (2347.234017ms)
✔ test 1: an activate that carries the pair refuses after a symlink to a mode-600 file, in the plan and the run, before anything stops (2384.801415ms)
✔ test 1: an activate that carries the pair refuses after removal, in the plan and the run, before anything stops (2406.236568ms)
✔ test 2: a rollback that carries the pair refuses after chmod 644, in the plan and the run, before anything stops (2419.512958ms)
✔ test 3: a proof file inside the repository refuses, in the plan and the run, before anything stops (1031.011433ms)
✔ test 4: a path outside the repository through a directory symlink into it refuses on its realpath (1032.956013ms)
✔ T54 row 188: a carried pair gets the proof file checks, and a proof file inside the repository refuses (11622.868365ms)
▶ T55 row 189: activate --no-send drops --send, and rollback and pm-on carry it off
✔ test 1: a live-copy --no-send drops --send from the pointer and the unit, keeps the rest in order, logs the step and backs up the stopped store (2128.340302ms)
✔ test 2: a plain live-copy activate still refuses already-active, and so does --no-send once --send is gone (3180.477572ms)
✔ test 3: --plan prints one send: line in each case, with the live-copy note on a same-copy run (4705.751778ms)
✔ test 4: after --no-send, a rollback to the earlier copy leaves --send out of the pointer and the unit (3465.907677ms)
✔ test 4: pm-on after --no-send keeps --send off (3235.290924ms)
✔ test 5: --no-send on rollback, pm-on, status, adopt or rehearse is a usage error (660.250872ms)
✔ test 6: with both a pair and --send in the pointer, --no-send and --no-proof each drop what they name and keep the rest (10999.901697ms)
✔ T55 row 189: activate --no-send drops --send, and rollback and pm-on carry it off (28377.197636ms)
▶ T57 row 200: activate --sso, its refusals before any stop, and the rollback to a Console without --sso
✔ item 1: --sso drops the preview set and the pair, puts --sso before --send and the tester port, and the plan names what it drops and carries (4188.956149ms)
✔ item 1: --sso may re-pin the live copy once; later activates carry it; --no-send still drops --send (10077.481557ms)
✔ item 1: --sso with a pair or --no-proof, or on any verb but activate, is a usage error (917.469083ms)
✔ item 2: a target without --sso, a missing or bad console.sso, and each slot problem refuse before any stop (6277.910031ms)
✔ item 3: a config whose console key the target loader refuses stops an activate or a rollback before any stop, naming the first step (4459.553989ms)
✔ row 203: a config whose federation key the target loader refuses stops an activate or a rollback before any stop, naming the first step (3742.561407ms)
✔ item 3: a rollback from --sso to a Console without it takes the flags from the set of the activation onto the copy, past a same-copy re-pin (sage-1389) (11324.174643ms)
✔ item 3: a rollback set that is missing, fails its sums, holds no argv or already ran --sso refuses sso-rollback-flags (4438.16199ms)
✔ round 2 (webby-0028 N1): run through a symlinked repository path, a slot or a proof file inside the repository still refuses (2267.689558ms)
✔ round 2 (webby-0028 N2): a config.json that does not parse stops the run before anything is read or stopped (2045.604552ms)
✔ round 3 (sage-1556): a named instance turns --sso on with its own config, slot and Console unit, and rolls back from its own set (4303.002981ms)
✔ row 238 (#1744): on a named instance the sso-config first step names --instance NAME in both commands (1037.05743ms)
✔ T57 row 200: activate --sso, its refusals before any stop, and the rollback to a Console without --sso (55081.903678ms)
▶ T58 row 273: activate --send and --no-sso
✔ T1: --sso --send turns send on after --sso and before the tester port, and the plan says so (2687.414025ms)
✔ T1: --send beside a carried --sso re-pins the live copy once, and the plan names the carried --sso (4258.718434ms)
✔ T2: --send without --sso, given or carried, refuses before any stop, and --plan lists it (1923.166507ms)
✔ T2 (sage-2315 B1): a rollback from an --sso --send pointer to a Console without --sso ends with neither flag (3787.620953ms)
✔ T2 and T4: --send with --no-send, --no-sso with --sso, --send, a pair or --no-proof, and either flag on another verb, is a usage error (2237.601326ms)
✔ T3: --no-sso on the same copy returns the unit and the pointer to the flags from before --sso, without --send (5326.697125ms)
✔ T3: the set walk passes later re-pins that ran with --sso, and the tester follows the pointer (5196.296216ms)
✔ T3 (sage-2305 a): after --sso, two later re-pins that carry it, then --no-sso restores the flags from before --sso byte for byte (7938.052703ms)
✔ T4 (sage-2305 b): a log in which every set holds a Console with --sso refuses before any unit stops (3824.257483ms)
✔ T4: --no-sso refuses before any stop on a pointer without --sso, a tampered or missing set, a set that ran with --sso, an ok line with no activation, and a log with no set (5652.200119ms)
✔ T58 row 273: activate --send and --no-sso (42833.896917ms)
✔ R1 rehearse passes on the same schema; the scratch root holds its files and the live files stay byte-identical (2446.274632ms)
✔ R2 rehearse runs the migration checks when the schema differs; the live store stays at 3g (2553.980547ms)
✔ R3 a failing migration gives REHEARSAL_FAIL migrate and starts nothing (371.346673ms)
✔ R4 a host that does not start, does not answer status, reports another pid, launches anyway, makes a launches directory or keeps its lock each fails by name (18494.228716ms)
✔ R5 a host that ignores SIGTERM gets SIGKILL and FAIL host-stopped (3444.731409ms)
✔ R6 a Console that does not answer /healthz gives REHEARSAL_FAIL healthz (4628.35147ms)
✔ R7 a host on another copy fails copy-match (4632.46826ms)
✔ R8 a scratch port in use or reserved refuses, and the rehearsal takes no other port (492.027738ms)
✔ R9 mos-0963: a role reference left outside placeholders/, or left on an env variable, fails credential-ref-live before the host starts (709.51728ms)
✔ R10 mos-0962: a scratch business that still sets a tracker fails tracker-configured (355.056199ms)
✔ R11 mos-0961: a scratch config on the live data root or on any root but the scratch one, or a sessions.json naming a running pid, refuses by name (1379.93757ms)
✔ R12 mos-0962: a notifier config with a binding fails notify-off (352.045398ms)
✔ R13 the pre-checks: an old copy, a backup that fails its sums, a missing backup or pointer, and usage (481.431781ms)
✔ R14 a host that writes the live config, the live business file or the backup fails the end check by name (7260.942229ms)
✔ R15 a rehearsal stopped by TERM, INT or HUP fails signal and still stops the host and Console and runs the end checks (7963.832357ms)
✔ row 233: --backup last takes the newest backup the log records; a later line with backup null does not hide it, and the store line names it (2459.681713ms)
✔ row 233: --backup last with no backup in the log, or no log, exits 3 with no-backup and makes no rehearsal directory (206.10946ms)
✔ row 233: --backup last refuses a newest backup that is not an activation id, with exit 1 (122.746077ms)
▶ T56 row 190: named instances side by side on one unit directory, $BIN and set of stand-ins
✔ T-I3 each instance renders its own config, session env and Description, and nothing of another (1521.134221ms)
✔ T-I4 a Console port another installed Console takes refuses port-claimed, and a named instance keeps off the default ports (1995.429401ms)
✔ T-I6 alpha's activate and rollback reach nothing of beta's (4010.159471ms)
✔ T-I6 swapped: beta's reach nothing of alpha's (4070.637339ms)
✔ T-I7 MOSAIC_CONFIG naming alpha's config with no flag refuses instance-root-mismatch and changes nothing (674.288503ms)
✔ T-I9 another instance's bus active refuses nothing; one of this instance's does (6063.089882ms)
✔ T56 row 190: named instances side by side on one unit directory, $BIN and set of stand-ins (18336.063295ms)
✔ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (5920.496834ms)
✔ row196 SSO socket conversion pins pointer and unit argv order without send (2323.23531ms)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✔ plan and started log preserve the same interpreter JSON (2234.857014ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (3337.224617ms)
✔ interpreter-drift fails at the gate and restores the pointer (3370.296561ms)
✔ missing-verifier refuses before any start or stop (1019.673808ms)
✔ interpreter-unsafe refuses before any start or stop (1069.999208ms)
✔ row196 interpreter activation checks receipt, identity, plan and startup log (11033.501649ms)
▶ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot
✔ socket copy (2435.468977ms)
✔ legacy copy (2423.522656ms)
✔ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot (4859.606668ms)
✔ config-any-key: a non-console target refusal stops activate and rollback before any stop (2800.738349ms)
✔ config-any-key: a pre-270 target refuses each row 270 key on a full activate and rollback, naming the key (4542.093406ms)
✔ config-any-key: accepting loaders run validate with the selected config on activate and rollback (3137.126748ms)
✔ config-any-key: missing-loader copies accept only the four oldest keys (128.613899ms)
✔ config-any-key: missing config passes but malformed JSON refuses without calling the loader (48.747704ms)
✔ row 233: sequence 1: confirm fails healthz, the driver reverts, renders the old copy and confirm --rollback --cause A5 passes: exit 1 (10744.117213ms)
✔ row 233: sequence 2: activate --migrate fails at the wrapper, revert restores the store, confirm --rollback --cause A3: exit 1 (4830.611004ms)
✔ row 233: sequence 3: root's render of the new copy fails, the driver rolls back with --cause A4, and holds the lock to the end: exit 1 (4436.055179ms)
✔ row 233: sequence 4: a capture failure is exit 3 from the stage, and A2f restarts the old units and gates them: exit 1 (3171.597923ms)
✔ row 233: N1: a bus that outlives A2's timeout keeps its old start, so A2f's gate fails stale-start: exit 2, both units stopped (8744.641104ms)
✔ row 233: sequence 5: confirm of the wrong copy is refused, and the driver rolls back with --cause A5: exit 1 (4257.726117ms)
✔ row 233: sequence 6: a revert that fails stops both units at exit 2, and the next run refuses at its --plan with nothing stopped (3200.045774ms)
✔ row 233: sequence 7: two upgrades and a rollback --to the previous copy with --restore, the args file following each confirm (8773.905301ms)
✔ row 240: I3 N1: a failed args move after A5 exits 5 args-failed, the new copy live and confirmed and both args files kept (3326.699363ms)
✔ row 233: sequence 8: a migration that writes and fails: the driver reverts to the backup byte for byte, --cause A3: exit 1 (3819.863294ms)
✔ row 233: a second run while the lock is held refuses upgrade-running with one log line and no call (760.662777ms)
✔ row 233: A1 refuses open-activation on any AWAITING-UNITS file, through the stack's user's --plan, with nothing stopped (1295.61894ms)
✔ row 233: a target that migrates refuses migrate-required without --migrate, with nothing stopped (1300.942252ms)
✔ row 233: the rehearsal runs after the plan and before A2; a failed one refuses rehearsal-failed with nothing stopped (1295.497417ms)
✔ row 233: the rehearsal's BACKUP_STORE line goes to the step log after a match, a malformed one as none, the rest of its output never (3241.951192ms)
✔ row 233: a real rehearsal with no backup in the log refuses no-backup, and goes on only with --no-rehearsal, which logs the skip (3858.557292ms)
✔ row 233: a real rehearsal after an upgrade names the log's newest backup; --no-rehearsal with a backup refuses rehearsal-required (4862.627701ms)
✔ row 233: the args file must be the running user's, with no group or other write, one --copy, and the copy the units run (992.071285ms)
✔ row 233: hostcheck (row 240): a nonzero --check or a missing file refuses profile-drift before the plan (1224.343143ms)
✔ row 233: the checkout must be at --sha (head-mismatch), and a commit the clone can't fast-forward to refuses fetch-failed (1120.291149ms)
✔ row 233: usage exits 4 before any log or lock (762.648994ms)
✔ tester HTTP helper uses instance socket, logical origin and JSON without retrying (29.028379ms)
✔ tester HTTP timeout closes the socket and does not retry (28.948281ms)
organization: {"event":"reload-needs-restart","business":"acme"}
✔ row 175: each read with --tester inside an agent prints the human form's output, and refuses without --tester (178.801702ms)
✔ row 175: --tester on limits set, reset and migrate and every write form outside W1-W7 exits 4 before any call (71.650743ms)
✔ row 175: scripts/mosaic sends plugins, name, names, follow, threads and thread to packages/cli, not the seat CLI (1014.754512ms)
✔ row 175 W7: project init --tester makes the repository under the project area, committed by tester (834.141652ms)
✔ row 175 W7: a repo outside the project area refuses tester-project-area before any bus call, and nothing changes (382.740801ms)
✔ row 175 W7: the tester bind refuses tester-off and tester-required before any directory (2309.758551ms)
✔ row 184: with --tester, thread create, threads, open, talk --thread and read run on the tester's own thread (114.16663ms)
organization: {"event":"reload-needs-restart","business":"acme"}
✔ row 184: talk --thread --follow and follow --thread with --tester print and read only that thread's messages, from message.receive (183.704602ms)
✔ row 184: with --tester a human thread refuses with the bus's code, and nothing is written (97.681324ms)
✔ row 184: without --tester the thread verbs stay the human's and never call the tester transport (68.378852ms)
✔ row 184: scripts/mosaic runs thread create, threads, talk --thread and thread read as the tester through tester-cli.mjs (4598.633373ms)
✔ talk --tester sends a message as tester from inside an agent and prints the role's reply (53.675041ms)
✔ talk --tester sends text with no prefix, and follow --tester reads (32.540881ms)
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (42.322622ms)
✔ decide, stop and launches take no --tester (34.634903ms)
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.60575ms)
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.979526ms)
✔ agents --tester makes one call; the human's agents also reads thread.claims, and --json is the agents array (43.556177ms)
✔ a refused thread.claims still prints the role rows and the refusal's code (33.465927ms)
✔ a thread.claims error without a bus code still throws and prints nothing (28.839835ms)
✔ talk --tester to a stopped role exits 3, prints no sent line and stores nothing (26.403152ms)
✔ only a --tester send refused tester-target-not-running is rewritten (30.040631ms)
✔ REQ-CLI-1 project create and list work on the bus record and refuse what the broker refuses (62.501781ms)
✔ REQ-CLI-1 thread create, list, open and read (124.590115ms)
✔ REQ-CLI-1 thread read pages through every message, oldest first (758.685818ms)
✔ REQ-CLI-1 the business needs exactly one threaded instance to create a thread (71.967951ms)
✔ REQ-CLI-1 a thread is its id, an id prefix of 8 characters or more, or <project>/<name>; anything else is refused before any write (106.944631ms)
✔ REQ-CLI-2 REQ-THREAD-2 talk --thread sends to the thread and prints only the reply to it; the rest stays unread (72.760298ms)
✔ REQ-CLI-2 talk --thread --wait gives up with exit 1 and leaves the thread's messages unread (1086.946679ms)
✔ REQ-CLI-2 talk --thread --follow and follow --thread print and read only that thread's messages (182.720215ms)
✔ REQ-CLI-2 plain talk to the assistant asks for a thread and exits 2 without a write (54.987652ms)
✔ REQ-USER-2 a thread of another user is refused for talk, open, read and follow, and nothing is written (126.296463ms)
✔ REQ-CLI-1 the new verbs refuse inside an agent run, as every human verb does (33.543671ms)
usage: {"event":"usage-unknown","business":"acme","run":"r8fa3c6216772","instance":"assistant","turn":"28b960af-44b6-4be1-805e-25479ad51569","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r3060bf55c601","instance":"assistant","turn":"17587972-800c-4be7-a4a3-7222695dae0d","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"ra24f33448c25","instance":"assistant","turn":"ea458168-9749-449f-9a35-f190c6c183a7","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"rfcb7b8af4232","instance":"assistant","turn":"1c13b4ba-0114-469a-8488-847e546574cf","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (6893.09501ms)
usage: {"event":"usage-unknown","business":"acme","run":"r751707f17d9a","instance":"assistant","turn":"2bbb4f6b-4e77-4be5-ada7-b09879af112f","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r5c34d6a681b7","instance":"assistant","turn":"ac72ec84-5536-4416-b131-c581879958fc","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (2049.572888ms)
usage: {"event":"usage-unknown","business":"acme","run":"r5875d0cc9f67","instance":"assistant","turn":"82fd685d-f268-45b2-9310-8823bc748d5c","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4569.042873ms)
usage: {"event":"usage-unknown","business":"acme","run":"re86476eb05e9","instance":"assistant","turn":"f7f92713-c84a-4c24-9ac7-237ed94f93b6","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"re86476eb05e9","instance":"assistant","turn":"7615fcdb-a992-4e84-979b-6a235869206c","source":"@none","code":"baseline-unknown"}
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2954.839412ms)
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (209.17701ms)
usage: {"event":"usage-unknown","business":"acme","run":"r2751fa41d017","instance":"assistant","turn":"ae4e3a84-c2df-4a97-8217-8d4631b90851","source":"@none","code":"baseline-unknown"}
✔ REQ-LAUNCH-1 a thread run's session file has no landing, even when landHolders names its instance (620.168039ms)
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (395.966665ms)
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (324.529131ms)
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (138.724109ms)
✔ C2-09a: fromSession refuses a creative instance outside a thread without a sandbox (140.42557ms)
limits: {"event":"limit-reached","business":"acme","check":"token-limit","export":"mayLaunch","subject":{"instance":"assistant","provider":"zai","model":"claude-sonnet-5-5","account":null},"path":["tokens","instances","assistant"],"limit":0,"count":0,"unknownTurns":0}
limits: {"event":"limit-reached","business":"acme","check":"token-limit","export":"mayLaunch","subject":{"instance":"assistant","provider":"zai","model":"claude-sonnet-5-5","account":null},"path":["tokens","instances","assistant"],"limit":0,"count":0,"unknownTurns":0}
✔ REQ-LIMIT-3 REQ-LIMIT-4 a thread start whose instance is at its token limit is refused, logged once with the limit and the count (265.133526ms)
usage: {"event":"usage-unknown","business":"acme","run":"ra114a0334b1d","instance":"assistant","turn":"5a6ce340-167f-4a24-84ca-4ef6ed497091","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"acme","check":"token-limit","export":"mustStop","subject":{"instance":"assistant","provider":"zai","model":"claude-sonnet-5-5","account":null},"path":["tokens","instances","assistant"],"limit":0,"count":0,"unknownTurns":1}
✔ REQ-LIMIT-4 a thread run at its token limit stops at the end of its turn: the reply lands, and the end record names the limit (633.344088ms)
usage: {"event":"usage-unknown","business":"acme","run":"r64f570d65f4d","instance":"bean","turn":"b3a52c6d-b29f-4f4c-bccf-10baa7c45bbc","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r5474ce026528","instance":"chet","turn":"f145d8b9-ea86-43d2-9ac0-d886b0a40fff","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r64f570d65f4d","instance":"bean","turn":"e2b62203-1b00-41c4-81c0-81787795b9e1","source":"@none","code":"baseline-unknown"}
✔ C2-09a: creative thread messages start distinct runs and keep each instance history separate (1170.44975ms)
usage: {"event":"usage-unknown","business":"acme","run":"r037e79959266","instance":"bean","turn":"d4716028-dde5-406a-b1ee-48b28e3ffec3","source":"@none","code":"baseline-unknown"}
usage: {"event":"usage-unknown","business":"acme","run":"r6eb01d356939","instance":"bean","turn":"4f6c92bd-e018-4c41-8eb5-6599cad39c7a","source":"@none","code":"baseline-unknown"}
✔ C2-09a: terminating one creative thread does not signal an unselected peer of the same instance (875.942861ms)
✔ REQ-LAUNCH-1 R4: a pending message on a revoked thread starts no run after a launcher restart (348.762742ms)
usage: {"event":"usage-unknown","business":"acme","run":"rd485e510574a","instance":"assistant","turn":"c45e8ef6-d43f-4342-b4d7-c863f0fe0d7b","source":"@none","code":"baseline-unknown"}
✔ REQ-LAUNCH-1 R4: a running thread's run gets SIGTERM at the first tick after the hand edit, with no idle check (619.27231ms)
✔ REQ-LAUNCH-1 R4 D1: recover() rebinds an earlier host's run on a revoked thread and ends it, which ends its claim (330.042686ms)
✔ C2-04: a library-only business with tracker.baseUrl boots without a project tracker (501.663009ms)
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (697.909618ms)
✔ the transport writes {business, verb, args} to the child and reads its JSON (48.7509ms)
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2273.840301ms)
✔ busExit and refuseInsideAgent (0.802887ms)
✔ REQ-LIMIT-4 mosaic usage shows each token kind and unknown turns beside every total (115.849703ms)
✔ usage is dispatched by scripts/mosaic and the shared read adapter (172.870048ms)
✔ talk sends a REQUEST, prints and reads only the reply to it, and leaves other messages unread (102.766971ms)
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1043.568877ms)
✔ a late reply the Console has listed stays unread for mosaic inbox, and the next talk skips it (2070.972372ms)
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (54.489478ms)
✔ talk to a role launch.by can't launch says it isn't in the launch block (27.746535ms)
✔ talk to a stopped role prints the waiting line once, skips a non-reply and prints the reply (58.41519ms)
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (25.677798ms)
✔ launches off and on go to the broker and change the business's launch state (27.888887ms)
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (29.471234ms)
ℹ tests 988
ℹ suites 0
ℹ pass 988
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 617644.001521