✔ a first launch clones the root at its branch, with the root's path as origin (39.085501ms) ✔ the clone is not at its place until git clone has finished (25.473252ms) ✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (69.566952ms) ✔ a clone ahead of the root keeps its commits and counts as current (42.43914ms) ▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves ✔ a modified file (49.440191ms) ✔ an untracked file (46.89984ms) ✔ a staged file (47.992377ms) ✔ another branch (46.754525ms) ✔ a detached HEAD (49.738168ms) ✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (241.952966ms) ✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (50.365257ms) ▶ a clone kept before the branch check, or for a failed status, gets no fetch ✔ not-a-clone (28.796849ms) ✔ hooks-present (29.454258ms) ✔ submodule (34.782222ms) ✔ config-changed (33.862547ms) ✔ root-unreadable (31.487044ms) ✔ root-detached (36.514687ms) ✔ status-failed, on the root's branch and clean (37.267326ms) ✔ status-failed, dirty (36.322914ms) ✔ a clone kept before the branch check, or for a failed status, gets no fetch (269.853758ms) ✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (41.823879ms) ✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (48.280733ms) ✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (75.453357ms) ▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it ✔ user.name (27.788079ms) ✔ user.email (27.22666ms) ✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (55.50194ms) ✔ a commit git can't read after the fast-forward is null (51.70937ms) ✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (19.795054ms) ▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it ✔ core.fsmonitor (37.271626ms) ✔ core.hooksPath (37.838451ms) ✔ a hook file (33.696746ms) ✔ include.path (33.294438ms) ✔ includeIf (35.001969ms) ✔ a filter driver (35.124785ms) ✔ origin moved (33.010664ms) ✔ a second origin url (33.227716ms) ✔ the origin url twice, both the root (37.438324ms) ✔ an ext:: origin (32.873841ms) ✔ a branch tracking another remote (37.586105ms) ✔ a branch merging a tag (33.618536ms) ✔ a fetch line onto local branches (33.775146ms) ✔ no origin (33.598509ms) ✔ a config file over the size cap (32.755027ms) ✔ config a symlink to /dev/zero (33.702007ms) ✔ the clone a symlink to the bait (34.135153ms) ✔ the clone a file (33.823894ms) ✔ the clone a plain directory (31.291667ms) ✔ .git a gitdir: file (30.872126ms) ✔ .git a symlink (31.168163ms) ✔ .git/logs a symlink (31.155015ms) ✔ .git/refs/heads a symlink (30.743204ms) ✔ .git/objects a symlink (32.325497ms) ✔ a reflog hard-linked to a file outside (35.599097ms) ✔ HEAD a fifo (34.922619ms) ✔ a commondir file (31.166418ms) ✔ an alternates file (34.794248ms) ✔ a gitlink staged, no .gitmodules (46.194218ms) ✔ a gitlink and .gitmodules staged (46.094003ms) ✔ a gitlink to a repository with its own gitlink (57.310231ms) ✔ a gitlink and .gitmodules committed (50.67991ms) ✔ a gitlink and submodule.active in config (48.106954ms) ✔ a .git/modules with no gitlink (35.8019ms) ✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1234.499114ms) ▶ a root that can't be cloned refuses with the project id and leaves nothing behind ✔ missing (11.366762ms) ✔ not a repository (10.216396ms) ✔ a plain directory inside another repository (16.120453ms) ✔ unreadable (10.157802ms) ✔ on no branch (12.157858ms) ✔ missing an object (15.034369ms) ✔ a root that can't be cloned refuses with the project id and leaves nothing behind (75.895379ms) ✔ a clone whose root is on no branch, or gone, is kept and named (30.882157ms) ✔ no credential or forge remote of the root reaches a clone (51.32251ms) ✔ every project in the business file gets its own clone at its own branch (37.336204ms) ✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.143775ms) ✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1018.448448ms) ✔ a timeout signals git's process group, so a process git started dies with it (519.487194ms) ✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (513.519017ms) ✔ rootHits: a top-level file, a new top-level directory, src/ and v1/ are the root; paths under known directories aren't (1.024521ms) ✔ gateEnv keeps the named variables that are strings and drops everything else (0.160896ms) ✔ isMosaicStack: a checkout whose HEAD descends from the root commit and has node_modules; nothing else (30.422845ms) ✔ gateSteps: each package with tests but queue in name order, then each scripts/test-*.sh (1.437187ms) ✔ runGate: every step passes, each with its own log and a summary line, under the environment it was given (151.765683ms) ✔ runGate: the first failing step stops the gate and names its log (238.655672ms) ✔ runGate: an abort stops the running step and everything in its group, and runs nothing after it (165.535114ms) ✔ the CLI: root-file prints the hits and exits 2, or exits 0; gate exits 0, or 2 with the step and its log; anything else is usage (543.626238ms) ✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (2.62174ms) ✔ sandboxProblem names a missing bwrap and a bwrap that fails (9.025077ms) ✔ every bind says why; the bundle and session file stay read-only over the run directory (1.302907ms) ✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.870847ms) ✔ the host's git socket is bound only when given, read-only and before the writable binds (0.701557ms) ✔ the git identity is the instance's, at @.mosaic.invalid, and sandboxArgv refuses without it (1.123441ms) ✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1797.960395ms) ✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2431.443546ms) ✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (267.782084ms) ✔ resolveSeat: by name under --repo resolves the repo layout (1.239011ms) ✔ resolveSeat: by path resolves the fleet layout (0.445873ms) ✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.773921ms) ✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.712083ms) ✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.841723ms) ✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.348917ms) ✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.169924ms) ✔ CLI launch: registers, execs the fake launch script, and passes args through (29.342276ms) ✔ CLI launch: --harness lands in the record (28.792763ms) ✔ CLI launch: the launch script's own exit code passes through (30.220973ms) ✔ CLI launch: relaunching a seat rewrites the one registration record (53.35556ms) ✔ CLI launch: omitting --task records an empty string, not null (28.568452ms) ✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (82.347965ms) ✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (146.313743ms) ✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.380159ms) ✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.666632ms) ✔ 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.857817ms) ✔ 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 (2.510229ms) ✔ 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.915073ms) ✔ REQ-LIMIT-1: family substring matching is no longer exported (0.85939ms) ✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.691607ms) ✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.249264ms) ✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.504293ms) ✔ session file and launch log: 0600, the session file written once (1.366906ms) ✔ endReason maps the runner's exit codes; a signal is killed (0.117197ms) ✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.340348ms) ✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.867533ms) ✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.434063ms) ✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.050695ms) ✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (301.189234ms) ✔ workRef and validBranch take only what a ref name can hold (1.172816ms) ✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (159.355889ms) ✔ a rewritten branch refuses non-fast-forward and the work ref stays (146.550495ms) ✔ a branch with no history in common with main refuses unrelated-history (68.667783ms) ✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (49.929025ms) ✔ the root is fetched again before each push and main follows it, so a clone of a newer root pushes (164.046199ms) ✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (87.710881ms) ✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (92.176818ms) ✔ only a v2 bundle with the named branch is read (53.859158ms) ✔ a branch named main, or named for another task, moves only this task's work ref (105.801855ms) ✔ a record that throws moves the work ref back, or removes a new one (153.968287ms) ✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (396.216195ms) ✔ a root that can't be read refuses root-unreadable (27.304901ms) ✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2176.410913ms) ✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.524388ms) ✔ a working repository path that isn't a directory refuses (31.303443ms) ✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (126.957261ms) ✔ review of a project with no working repository refuses unknown-commit (15.187547ms) ✔ the runner's git tools hold the host's limits and branch rule (1.249042ms) ✔ a reseed moves root but leaves a landed main, and main forwards once root contains it (219.407158ms) ✔ after a landing, a push built on the root still lands and main stays where the landing put it (149.355435ms) ✔ once the root shares no history with a landed main, a push is checked against main, not the root (220.936253ms) ✔ a landing squashes the reviewed diff onto main as the bus host and moves main only at finish (120.211153ms) ✔ a landing refuses ref-moved, base-conflict and root-file before it makes a commit (371.482815ms) ✔ a landing whose applied diff isn't the reviewed one refuses patch-drift and leaves no worktree (146.109815ms) ✔ finish refuses base-moved when main moved, and a record that throws moves main back (242.527276ms) ℹ tests 150 ℹ suites 0 ℹ pass 150 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 6418.579313