✔ a first launch clones the root at its branch, with the root's path as origin (32.811284ms) ✔ the clone is not at its place until git clone has finished (23.948831ms) ✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (67.233751ms) ✔ a clone ahead of the root keeps its commits and counts as current (43.666115ms) ▶ a dirty clone, one on another branch and one diverged are kept as they are ✔ a modified file (33.077005ms) ✔ an untracked file (38.414761ms) ✔ a staged file (34.171849ms) ✔ another branch (35.366927ms) ✔ a detached HEAD (36.240137ms) ✔ a diverged branch (47.675496ms) ✔ a dirty clone, one on another branch and one diverged are kept as they are (226.143534ms) ▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it ✔ user.name (25.190655ms) ✔ user.email (25.992347ms) ✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (51.62715ms) ✔ a commit git can't read after the fast-forward is null (49.234616ms) ✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (22.417472ms) ▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it ✔ core.fsmonitor (37.6971ms) ✔ core.hooksPath (39.13204ms) ✔ a hook file (30.65272ms) ✔ include.path (32.412762ms) ✔ includeIf (36.14086ms) ✔ a filter driver (36.042022ms) ✔ origin moved (32.67077ms) ✔ a second origin url (32.399848ms) ✔ the origin url twice, both the root (38.520872ms) ✔ an ext:: origin (36.99087ms) ✔ a branch tracking another remote (36.981016ms) ✔ a branch merging a tag (34.359795ms) ✔ a fetch line onto local branches (36.467933ms) ✔ no origin (37.018911ms) ✔ a config file over the size cap (32.738565ms) ✔ config a symlink to /dev/zero (33.208159ms) ✔ the clone a symlink to the bait (31.859668ms) ✔ the clone a file (30.826692ms) ✔ the clone a plain directory (28.943176ms) ✔ .git a gitdir: file (29.79982ms) ✔ .git a symlink (29.1941ms) ✔ .git/logs a symlink (32.80446ms) ✔ .git/refs/heads a symlink (35.486024ms) ✔ .git/objects a symlink (32.200231ms) ✔ a reflog hard-linked to a file outside (30.874334ms) ✔ HEAD a fifo (30.273546ms) ✔ a commondir file (31.210921ms) ✔ an alternates file (33.652412ms) ✔ a gitlink staged, no .gitmodules (42.537313ms) ✔ a gitlink and .gitmodules staged (47.369242ms) ✔ a gitlink to a repository with its own gitlink (55.261351ms) ✔ a gitlink and .gitmodules committed (48.030149ms) ✔ a gitlink and submodule.active in config (46.900495ms) ✔ a .git/modules with no gitlink (38.474372ms) ✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1223.53712ms) ▶ a root that can't be cloned refuses with the project id and leaves nothing behind ✔ missing (11.640849ms) ✔ not a repository (9.952353ms) ✔ a plain directory inside another repository (14.292936ms) ✔ unreadable (9.572178ms) ✔ on no branch (11.455639ms) ✔ missing an object (19.229975ms) ✔ a root that can't be cloned refuses with the project id and leaves nothing behind (76.985894ms) ✔ a clone whose root is on no branch, or gone, is kept and named (32.325638ms) ✔ no credential or forge remote of the root reaches a clone (49.915285ms) ✔ every project in the business file gets its own clone at its own branch (40.31377ms) ✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.007959ms) ✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1017.472728ms) ✔ a timeout signals git's process group, so a process git started dies with it (513.491469ms) ✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (513.116787ms) ✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.65651ms) ✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.796141ms) ✔ every bind says why; the bundle and session file stay read-only over the run directory (1.476658ms) ✔ the host's git socket is bound only when given, read-only and before the writable binds (1.382251ms) ✔ the git identity is the instance's, at @.mosaic.invalid, and sandboxArgv refuses without it (1.080836ms) ✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1766.121443ms) ✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2460.186984ms) ✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (262.780721ms) ✔ resolveSeat: by name under --repo resolves the repo layout (1.257933ms) ✔ resolveSeat: by path resolves the fleet layout (0.30939ms) ✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.719252ms) ✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.656086ms) ✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.776544ms) ✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.316042ms) ✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.137296ms) ✔ CLI launch: registers, execs the fake launch script, and passes args through (28.302245ms) ✔ CLI launch: --harness lands in the record (27.480381ms) ✔ CLI launch: the launch script's own exit code passes through (25.733907ms) ✔ CLI launch: relaunching a seat rewrites the one registration record (59.301398ms) ✔ CLI launch: omitting --task records an empty string, not null (27.121894ms) ✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (79.893523ms) ✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (131.637893ms) ✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.41976ms) ✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.571295ms) ✔ 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.71967ms) ✔ 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.227595ms) ✔ 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 (266.860827ms) ✔ family: exactly one launch.max key in the model name, else null (0.666245ms) ✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.735265ms) ✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.283812ms) ✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.933043ms) ✔ session file and launch log: 0600, the session file written once (1.268976ms) ✔ endReason maps the runner's exit codes; a signal is killed (0.121045ms) ✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.217199ms) ✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.946114ms) ✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (362.553648ms) ✔ workRef and validBranch take only what a ref name can hold (1.193075ms) ✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (157.434023ms) ✔ a rewritten branch refuses non-fast-forward and the work ref stays (143.590227ms) ✔ a branch with no history in common with main refuses unrelated-history (82.447645ms) ✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (41.210774ms) ✔ main is fetched from the root again before each push, so a clone of a newer root pushes (137.881064ms) ✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (100.23025ms) ✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (73.330925ms) ✔ only a v2 bundle with the named branch is read (45.409465ms) ✔ a branch named main, or named for another task, moves only this task's work ref (101.937462ms) ✔ a record that throws moves the work ref back, or removes a new one (143.941065ms) ✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (401.044212ms) ✔ a root that can't be read refuses root-unreadable (30.862793ms) ✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2159.816302ms) ✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.560955ms) ✔ a working repository path that isn't a directory refuses (24.616223ms) ✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (112.474671ms) ✔ review of a project with no working repository refuses unknown-commit (12.986057ms) ✔ the runner's git tools hold the host's limits and branch rule (1.158241ms) ℹ tests 120 ℹ suites 0 ℹ pass 120 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 4860.236596