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