✔ resolveSeat: by name under --repo resolves the repo layout (2.571856ms) ✔ resolveSeat: by path resolves the fleet layout (0.733308ms) ✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (1.502708ms) ✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (1.320435ms) ✔ makeRegistration produces a record that validates; each shape violation throws SeatError (1.629035ms) ✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (2.372825ms) ✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.798218ms) ✔ CLI launch: registers, execs the fake launch script, and passes args through (64.567607ms) ✔ CLI launch: --harness lands in the record (57.869902ms) ✔ CLI launch: the launch script's own exit code passes through (43.095625ms) ✔ CLI launch: relaunching a seat rewrites the one registration record (93.424815ms) ✔ CLI launch: omitting --task records an empty string, not null (46.406032ms) ✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (133.037855ms) ✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (204.105953ms) ✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.619616ms) ✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.743583ms) ✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (1.034ms) ✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (1.309264ms) ✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (424.850272ms) ✔ family: exactly one launch.max key in the model name, else null (1.134819ms) ✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (1.321324ms) ✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (2.696089ms) ✔ session file and launch log: 0600, the session file written once (1.648677ms) ✔ endReason maps the runner's exit codes; a signal is killed (0.21076ms) ✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.820038ms) ✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.401457ms) ✔ a session runs under unshare as pid 1 of its namespace, claims, answers, and stops on mosaic stop (250.310689ms) ℹ tests 27 ℹ suites 0 ℹ pass 27 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 1192.412558