Files

337 lines
23 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.
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1121.652366ms)
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (59.477458ms)
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (146.117245ms)
✔ NO_COLOR: no escape codes, except reverse video on the selected row (204.950193ms)
✔ 1-9 shows the decide flow's own lines and question; only y resolves (48.153ms)
✔ the app shows the same decide text as mosaic decide (19.759474ms)
✔ any key but y or Y at the question answers No; nothing is sent (178.43424ms)
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (62.923265ms)
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (229.986793ms)
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (29.999435ms)
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (18.774058ms)
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (404.340608ms)
✔ quitting at the question answers No and sends nothing, armed or not (39.204203ms)
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (29.685824ms)
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (42.891944ms)
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (278.963934ms)
✔ at every size the decide box shows each line y depends on, or says it is hidden (8145.538976ms)
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (61.287549ms)
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (29.828155ms)
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (14.49415ms)
✔ keys: views, moving, trail of a selection, the command line, help and quit (72.306521ms)
✔ one option: the status line says Press 1, not 1-1 (14.620775ms)
✔ no business: the app says so and :business picks one (8.119722ms)
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.805534ms)
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (163.499123ms)
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.452085ms)
✔ decide with --note still asks; a No sends nothing (10.275383ms)
✔ the app's business comes from a live bus host only (1.131127ms)
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (7.020195ms)
✔ draw is pure: same state, same frame (0.769013ms)
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (15.852731ms)
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (12.336739ms)
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (10.039739ms)
✔ decide prints a declining choice as declining (9.108848ms)
✔ an unknown outcome is reported once and never resent (7.699179ms)
✔ a decision closed before the answer arrives exits 2 and points at its trail (7.519771ms)
✔ a prefix that matches two open decisions exits 2 and resolves neither (7.122371ms)
✔ without --business a command uses the live host's business, and a stale host.json is not a host (6.732556ms)
✔ every human command refuses inside an agent run before it touches the bus (6.746574ms)
✔ usage errors exit 4; no business and no host is a usage error (7.562074ms)
✔ agents and tasks print through the broker (6.943048ms)
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.054446ms)
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (31.970092ms)
✔ trackers come from the tracker.* variables of the one project that names a tracker project (55.210151ms)
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (25.950418ms)
✔ two projects that each name a tracker project refuse, since the boot shape holds one (29.214393ms)
✔ a business without tracker.baseUrl gets no trackers entry (26.346839ms)
✔ an unknown business and a broken system config refuse with exit 3 (47.981901ms)
✔ follow prints an unsolicited message after plain talk returned (95.980388ms)
✔ talk --follow continues after reply and prints a later unsolicited message (24.715319ms)
✔ inbox lists all unread human messages under decisions, does not deliver or read them (203.091443ms)
✔ follow refuses agent context and bad arguments (8.652411ms)
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (8.040659ms)
✔ plain talk leaves the process SIGINT handlers unchanged (8.780067ms)
✔ empty views say so (0.616341ms)
✔ the trail keeps the broker's order and names a decision's task without its rows (0.738756ms)
✔ tasks print the tracker fields the snapshot carries (0.123286ms)
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (283.906056ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (276.134348ms)
✔ the size cap refuses a push before any byte (132.427401ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (280.697069ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (138.263086ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (228.07992ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (179.584626ms)
✔ a review of a project the business no longer has refuses unknown-project (175.152991ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (120.845109ms)
✔ close() answers host-closing to a connection still sending its request line (120.005731ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (541.181635ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (394.674097ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (422.066513ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (40.914244ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (434.231135ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.188029ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.328511ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (310.766495ms)
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (816.234292ms)
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (145.779759ms)
✔ a second host for the same data root refuses with exit 3 while the first runs (77.476775ms)
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (443.610958ms)
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (1.618588ms)
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.750404ms)
✔ a live host's lock stays, however old the file is (0.491738ms)
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (651.372967ms)
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (207.314684ms)
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (26.750088ms)
✔ a broker fork that throws leaves no host.lock and no host.json (29.520666ms)
✔ a broker send that throws leaves no host.lock and no host.json (25.660704ms)
✔ a broker that misses its boot wait leaves no host.lock and no host.json (27.89985ms)
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (75.983713ms)
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (74.439395ms)
✔ 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 (72.107171ms)
✔ 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 (78.124904ms)
✔ a host.json that can't be written stops both children and leaves no host.lock (176.101702ms)
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (28.725944ms)
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (75.778323ms)
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (171.803051ms)
✔ 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 (176.323753ms)
✔ 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 (169.214461ms)
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1087.406112ms)
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (154.93192ms)
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (76.071655ms)
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (125.563878ms)
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (129.453832ms)
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (81.776118ms)
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (123.790329ms)
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (83.402842ms)
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (138.837902ms)
✔ watchChildren reports a child that died before it was called, and one that dies later (20.956526ms)
✔ bus stop refuses to signal a live pid that is not a bus host (202.571636ms)
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (235.341987ms)
✔ bus start refuses with exit 3 without a notifier config (99.530252ms)
✔ bus start runs until bus stop; status reports it while it runs (648.710281ms)
✔ bus-service.sh renders the unit and installs it into a given directory (55.948587ms)
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (66.913172ms)
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (12.508043ms)
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (7.833353ms)
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (21.935809ms)
✖ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (122.745684ms)
✖ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (112.830992ms)
✖ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (110.494699ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (118.483266ms)
✖ a runner that stops at once ends its launch with the runner's reason (114.667119ms)
✔ a Claude Code launch with no session credential refuses before it starts (94.581245ms)
✖ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (111.305512ms)
✖ a runner killed from the host ends its launch as killed, not failed (111.348741ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (92.719059ms)
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (117.008533ms)
node:fs:3413
const stats = binding.lstat(base, true, undefined, true /* throwIfNoEntry */);
^
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
Node.js v26.8.1
✖ 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 (30005.587899ms)
node:fs:3413
const stats = binding.lstat(base, true, undefined, true /* throwIfNoEntry */);
^
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
Node.js v26.8.1
✖ 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 (30004.900336ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (89.124771ms)
Interrupted while running:
⚠ packages/cli/tests/launcher.test.mjs (packages/cli/tests/launcher.test.mjs:1:1)
✖ packages/cli/tests/launcher.test.mjs (61320.850548ms)
✖ packages/cli/tests/limits.test.mjs
✖ packages/cli/tests/notifier.test.mjs
✖ packages/cli/tests/other-tree.test.mjs
✖ packages/cli/tests/stack-copy.test.mjs
✖ packages/cli/tests/tester.test.mjs
✖ packages/cli/tests/trackers-boot.test.mjs
✖ packages/cli/tests/transport.test.mjs
✖ packages/cli/tests/verbs.test.mjs
ℹ tests 139
ℹ suites 0
ℹ pass 121
ℹ fail 7
ℹ cancelled 11
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 85300.300681
✖ failing tests:
test at packages/cli/tests/launcher.test.mjs:134:1
✖ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (122.745684ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:214:1
✖ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (112.830992ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:296:1
✖ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (110.494699ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:370:1
✖ a runner that stops at once ends its launch with the runner's reason (114.667119ms)
AssertionError [ERR_ASSERTION]: {"ok":false,"error":"launch-failed"}
false !== true
at TestContext.<anonymous> (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/tests/launcher.test.mjs:381:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/cli/tests/launcher.test.mjs:405:1
✖ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (111.305512ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:418:1
✖ a runner killed from the host ends its launch as killed, not failed (111.348741ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:452:1
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (117.008533ms)
Error: ENOENT: no such file or directory, lstat '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
at realpathSync (node:fs:3413:29)
at binds (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/sandbox.mjs:103:53)
at spawnSession (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/seat/src/session.mjs:117:28)
at start (file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:257:19)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async file:///mnt/storage/src/mosaic-stack-rocko-49/packages/cli/src/launcher.mjs:355:16 {
errno: -2,
code: 'ENOENT',
syscall: 'lstat',
path: '/mnt/storage/src/mosaic-stack-rocko-49/node_modules'
}
test at packages/cli/tests/launcher.test.mjs:511:3
✖ 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 (30005.587899ms)
'test timed out after 30000ms'
test at packages/cli/tests/launcher.test.mjs:511:3
✖ 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 (30004.900336ms)
'test timed out after 30000ms'
test at packages/cli/tests/launcher.test.mjs:1:1
✖ packages/cli/tests/launcher.test.mjs (61320.850548ms)
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/limits.test.mjs:1:1
✖ packages/cli/tests/limits.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/notifier.test.mjs:1:1
✖ packages/cli/tests/notifier.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/other-tree.test.mjs:1:1
✖ packages/cli/tests/other-tree.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/stack-copy.test.mjs:1:1
✖ packages/cli/tests/stack-copy.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/tester.test.mjs:1:1
✖ packages/cli/tests/tester.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/trackers-boot.test.mjs:1:1
✖ packages/cli/tests/trackers-boot.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/transport.test.mjs:1:1
✖ packages/cli/tests/transport.test.mjs
'Promise resolution is still pending but the event loop has already resolved'
test at packages/cli/tests/verbs.test.mjs:1:1
✖ packages/cli/tests/verbs.test.mjs
'Promise resolution is still pending but the event loop has already resolved'