✔ resolveSeat: by name under --repo resolves the repo layout (1.245323ms)
✔ resolveSeat: by path resolves the fleet layout (0.310504ms)
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.697631ms)
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.632989ms)
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.786135ms)
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.257165ms)
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.105947ms)
✔ CLI launch: registers, execs the fake launch script, and passes args through (31.799286ms)
✔ CLI launch: --harness lands in the record (29.529466ms)
✔ CLI launch: the launch script's own exit code passes through (29.242989ms)
✔ CLI launch: relaunching a seat rewrites the one registration record (55.726663ms)
✔ CLI launch: omitting --task records an empty string, not null (30.591302ms)
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (80.218911ms)
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (134.378932ms)
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.403602ms)
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.532978ms)
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.718033ms)
✔ 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 (0.848881ms)
✔ 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 (268.708629ms)
✔ family: exactly one launch.max key in the model name, else null (0.713929ms)
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.664675ms)
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.485059ms)
✔ session file and launch log: 0600, the session file written once (0.953821ms)
✔ endReason maps the runner's exit codes; a signal is killed (0.111125ms)
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.285128ms)
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.017973ms)
✔ a session runs under unshare as pid 1 of its namespace, claims, answers, and stops on mosaic stop (246.632034ms)
ℹ tests 27
ℹ suites 0
ℹ pass 27
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 719.297907
