fix(install): preserve user fleet data on re-seed + refresh active units (CRITICAL) #632

Merged
jason.woltje merged 1 commits from fix/631-reseed-preserves-fleet-data into main 2026-06-22 21:38:10 +00:00
Owner

fix(install): preserve user fleet data on re-seed + refresh active units (closes #631)

CRITICAL data-loss in the routine update path. mosaic update auto-runs install.sh keep-mode sync (#610). The rsync --delete honored PRESERVE_PATHS, but fleet/ was not listed → the sync wiped ~/.config/mosaic/fleet/roster.yaml (and fleet/run, fleet/agents). Any operator running mosaic update lost their fleet.

PRIMARY fix (data-loss)

  • install.sh PRESERVE_PATHS += fleet/*.yaml, fleet/agents, fleet/run. The framework still seeds fleet/examples + fleet/roles + fleet/roster.schema.json (synced/refreshed); the operator's roster, custom rosters, per-agent env, and heartbeat run dir are preserved.
  • Made the cp (no-rsync) fallback glob-aware so fleet/*.yaml is preserved there too; fixed the restore to re-glob per pattern (restores only the user file, not the whole freshly-synced fleet/ dir).
  • file-adapter.ts (TS installer): mirrored the preserve list for dual-installer parity. (syncDirectory is copy-only — never --delete — so it never had the bug; parity + belt-and-suspenders.)

SECONDARY fix (stale active units)

  • refreshActiveFleetUnits(): the re-seed updates ~/.config/mosaic/systemd/user/ but systemd runs ~/.config/systemd/user/, so shipped unit fixes (e.g. #627's socket change) didn't take effect after update. mosaic update now copies the fresh mosaic-*.service → the active dir + daemon-reload (best-effort, only when a fleet is already installed).

Verification

  • bash F6 fixture (roster + custom *.yaml + agents/ + run/ survive; examples refreshed; schema seeded) → 20/20 migration matrix.
  • TS file-adapter keep-mode test (roster/run/agents survive).
  • 2 refreshActiveFleetUnits unit tests (refreshes when installed; no-op otherwise).
  • tsc/eslint/prettier/sanitize clean. Cheap under #619.

🤖 Generated with Claude Code

## fix(install): preserve user fleet data on re-seed + refresh active units (closes #631) **CRITICAL data-loss in the routine update path.** `mosaic update` auto-runs `install.sh` keep-mode sync (#610). The rsync `--delete` honored `PRESERVE_PATHS`, but **`fleet/` was not listed** → the sync **wiped `~/.config/mosaic/fleet/roster.yaml`** (and `fleet/run`, `fleet/agents`). Any operator running `mosaic update` lost their fleet. ### PRIMARY fix (data-loss) - **`install.sh` `PRESERVE_PATHS` += `fleet/*.yaml`, `fleet/agents`, `fleet/run`.** The framework still **seeds** `fleet/examples` + `fleet/roles` + `fleet/roster.schema.json` (synced/refreshed); the operator's roster, custom rosters, per-agent env, and heartbeat run dir are **preserved**. - Made the **cp (no-rsync) fallback glob-aware** so `fleet/*.yaml` is preserved there too; fixed the restore to re-glob per pattern (restores only the user file, **not** the whole freshly-synced `fleet/` dir). - **`file-adapter.ts`** (TS installer): mirrored the preserve list for **dual-installer parity**. (`syncDirectory` is copy-only — never `--delete` — so it never had the bug; parity + belt-and-suspenders.) ### SECONDARY fix (stale active units) - **`refreshActiveFleetUnits()`**: the re-seed updates `~/.config/mosaic/systemd/user/` but systemd runs `~/.config/systemd/user/`, so shipped unit fixes (e.g. #627's socket change) **didn't take effect** after update. `mosaic update` now copies the fresh `mosaic-*.service` → the active dir + `daemon-reload` (best-effort, only when a fleet is already installed). ### Verification - **bash F6 fixture** (roster + custom `*.yaml` + `agents/` + `run/` survive; examples refreshed; schema seeded) → **20/20** migration matrix. - TS `file-adapter` keep-mode test (roster/run/agents survive). - 2 `refreshActiveFleetUnits` unit tests (refreshes when installed; no-op otherwise). - tsc/eslint/prettier/**sanitize** clean. Cheap under #619. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jason.woltje added 1 commit 2026-06-22 20:30:13 +00:00
fix(install): preserve user fleet data on re-seed + refresh active units (#631)
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was canceled
0d310c083e
CRITICAL data-loss in the routine update path. `mosaic update` auto-runs
install.sh keep-mode sync (#610); the rsync --delete honored PRESERVE_PATHS but
fleet/ was not listed, so the sync WIPED ~/.config/mosaic/fleet/roster.yaml (and
fleet/run, fleet/agents). Any user running `mosaic update` lost their fleet.

PRIMARY (data-loss):
- install.sh PRESERVE_PATHS += fleet/*.yaml, fleet/agents, fleet/run. The
  framework still SEEDS fleet/examples + fleet/roles + fleet/roster.schema.json
  (synced); the operator's roster, custom rosters, per-agent env, and heartbeat
  run dir are preserved.
- Made the cp (no-rsync) fallback GLOB-AWARE so fleet/*.yaml is preserved there
  too; fixed the restore to re-glob per pattern (restores only the user file,
  not the freshly-synced fleet/ dir).
- file-adapter.ts (TS installer): mirrored the preserve list for dual-installer
  parity. (syncDirectory is copy-only — never --delete — so it never had the
  bug; this is parity + belt-and-suspenders.)

SECONDARY (stale active units):
- refreshActiveFleetUnits(): the re-seed updates ~/.config/mosaic/systemd/user
  but systemd runs ~/.config/systemd/user, so shipped unit fixes (#627) did not
  take effect after update. `mosaic update` now copies the fresh mosaic-*.service
  → the active dir + daemon-reload (best-effort, only when a fleet is installed).

Verified: bash F6 fixture (roster/custom-yaml/agents/run survive + examples
refreshed + schema seeded), 20/20 migration matrix; TS file-adapter keep-mode
test; 2 refreshActiveFleetUnits unit tests. tsc/eslint/prettier/sanitize clean.

Refs #631

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
jason.woltje force-pushed fix/631-reseed-preserves-fleet-data from 0d310c083e to b55deb4cc3 2026-06-22 21:15:43 +00:00 Compare
jason.woltje merged commit bf2a6745c8 into main 2026-06-22 21:38:10 +00:00
jason.woltje deleted branch fix/631-reseed-preserves-fleet-data 2026-06-22 21:38:10 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#632