command: ["node", "--test", "/home/jwoltje/.t3/worktrees/mosaic-stack/magica-row329/packages/cli/tests/stack-upgrade.test.mjs"]
TMPDIR: /mnt/storage/scratch/tmp/XJhDxi
begin: {"utc": "2026-10-24T20:33:52.592+00:00", "load1": "3.39"}
launch nice: 19
✔ row 233: sequence 1: confirm fails healthz, the driver reverts, renders the old copy and confirm --rollback --cause A5 passes: exit 1 (7852.372089ms)
✔ row 233: sequence 2: activate --migrate fails at the wrapper, revert restores the store, confirm --rollback --cause A3: exit 1 (3608.479688ms)
✔ row 233: sequence 3: root's render of the new copy fails, the driver rolls back with --cause A4, and holds the lock to the end: exit 1 (3382.111443ms)
✔ row 233: sequence 4: a capture failure is exit 3 from the stage, and A2f restarts the old units and gates them: exit 1 (2523.56594ms)
✔ row 233: N1: a bus that outlives A2's timeout keeps its old start, so A2f's gate fails stale-start: exit 2, both units stopped (8297.045917ms)
✔ row 233: sequence 5: confirm of the wrong copy is refused, and the driver rolls back with --cause A5: exit 1 (3856.460153ms)
✔ row 233: sequence 6: a revert that fails stops both units at exit 2, and the next run refuses at its --plan with nothing stopped (3175.443553ms)
✔ row 233: sequence 7: two upgrades and a rollback --to the previous copy with --restore, the args file following each confirm (8049.56261ms)
✔ row 240: I3 N1: a failed args move after A5 exits 5 args-failed, the new copy live and confirmed and both args files kept (3265.253011ms)
✔ row 233: sequence 8: a migration that writes and fails: the driver reverts to the backup byte for byte, --cause A3: exit 1 (3553.665626ms)
✔ row 233: a second run while the lock is held refuses upgrade-running with one log line and no call (717.245165ms)
✔ row 233: A1 refuses open-activation on any AWAITING-UNITS file, through the stack's user's --plan, with nothing stopped (1249.295164ms)
✔ row 233: a target that migrates refuses migrate-required without --migrate, with nothing stopped (1250.634429ms)
✔ row 233: the rehearsal runs after the plan and before A2; a failed one refuses rehearsal-failed with nothing stopped (1232.105916ms)
✔ row 233: the rehearsal's BACKUP_STORE line goes to the step log after a match, a malformed one as none, the rest of its output never (3256.34367ms)
✔ row 233: a real rehearsal with no backup in the log refuses no-backup, and goes on only with --no-rehearsal, which logs the skip (3803.025078ms)
✔ row 233: a real rehearsal after an upgrade names the log's newest backup; --no-rehearsal with a backup refuses rehearsal-required (4253.787685ms)
✔ row 233: the args file must be the running user's, with no group or other write, one --copy, and the copy the units run (962.699541ms)
✔ row 233: hostcheck (row 240): a nonzero --check or a missing file refuses profile-drift before the plan (1171.513776ms)
✔ row 233: the checkout must be at --sha (head-mismatch), and a commit the clone can't fast-forward to refuses fetch-failed (1400.992453ms)
✔ row 233: usage exits 4 before any log or lock (796.879816ms)
ℹ tests 21
ℹ suites 0
ℹ pass 21
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 68640.454344
