Keeps remote/connectors inventory-only and observational commands effect-free.
Adds fake-adapter/filesystem/Commander coverage and operator/reference documentation.
Independent synthetic-tree REVIEW-6: VERIFIED APPROVE on exact tree 7dc35b8881f07a60de44d2328a37a27ef6c46f64. Commit head: b48f22b50b1beef5190818461df42773d4ae3076. Full package suite: 56 files / 820 tests passed. No live fleet/systemd/tmux actions were performed.
Relates to #758. Parent #758 remains open through M5.
Implements FCM-M3-001 local roster-owned reconciliation and lifecycle control through the existing `mosaic fleet` control plane.
- Adds plan/apply/reconcile/start/stop/restart/status/verify/doctor with stable JSON and exit behavior.
- Fences every mutation with mandatory expected generation, private exclusive locking, and canonical roster reread under lock.
- Preserves stopped desired state, exact systemd/tmux targets, private holder ownership, and truthful partial/cleanup recovery.
- Keeps remote/connectors inventory-only and observational commands effect-free.
- Adds fake-adapter/filesystem/Commander coverage and operator/reference documentation.
Independent synthetic-tree REVIEW-6: VERIFIED APPROVE on exact tree `7dc35b8881f07a60de44d2328a37a27ef6c46f64`. Commit head: `b48f22b50b1beef5190818461df42773d4ae3076`. Full package suite: 56 files / 820 tests passed. No live fleet/systemd/tmux actions were performed.
Relates to #758. Parent #758 remains open through M5.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Reconfirmed the REVIEW-6 invariants in the committed head: mandatory expected generation for mutating paths; private lock before canonical roster reread; locked canonical roster drives generation/plan/projections/targets/lifecycle for effects; stale/missing generation effect-free; observational status/doctor/verify lock-free/effect-free; safe private ancestors/leaf; EEXIST-only concurrency; inode/token-bound release; replacement-lock retention; additive cleanup truth with non-zero CLI exit; stopped-state preservation; exact systemd/tmux targets; holder ownership/global environment proof; unmanaged/remote rejection; redacted stable JSON/exit behavior.
No live fleet/systemd/tmux/session/site/migration/canary/deploy/runtime/remote/connector action was performed; tests used fake runners/temp files only.
Current origin/main has advanced to c593a15ef88b78d91cdd62916bcfcdec36040768; diff against the recorded base did not touch the 12 scoped files, and the FCM-M3-001 behavior review remains valid.
Adversarial committed-head fixtures passed for stale-generation under-lock fencing, mandatory generation before observe/effects, doctor lock-free/effect-free, cleanup truth/non-zero, and primary-error preservation.
Blocking finding:
Required PR CI is red for this exact head. ~/.config/mosaic/tools/git/pr-ci-wait.sh -n 785 -t 1200 -i 15 reported failure for PR #785 head b48f22b50b1beef5190818461df42773d4ae3076.
Woodpecker pipeline 1834 status is failure; steps: ci-postgres, install, sanitization, typecheck, lint, and format passed; test failed with exit 1.
Because the exact committed head has failing required CI, this cannot receive verified approval yet even though the local review and local gates passed. Please remediate or rerun to terminal green CI, then request another reviewer-of-record pass on the unchanged or new exact head.
REQUEST CHANGES — reviewer-of-record for PR #785 head b48f22b50b1beef5190818461df42773d4ae3076
I verified the exact committed head and reviewed the 12-file scope against FCM-M3-001 / #758.
Remote/state evidence:
- PR #785 is open; head branch `feat/758-local-reconciler`; base `main`.
- PR body says `Relates to #758. Parent #758 remains open through M5.` and does not use `Fixes #758`.
- Parent #758 is open.
- `git ls-remote origin refs/heads/feat/758-local-reconciler refs/pull/785/head` => `b48f22b50b1beef5190818461df42773d4ae3076` for both.
- Commit tree: `7dc35b8881f07a60de44d2328a37a27ef6c46f64`.
- Parent/base recorded by commit: `bc5e73629e92c56a80fa6a769ebad17c0177f504`.
- Exact scope: 12 files, 1865 insertions / 38 deletions.
Code/security review result:
- Reconfirmed the REVIEW-6 invariants in the committed head: mandatory expected generation for mutating paths; private lock before canonical roster reread; locked canonical roster drives generation/plan/projections/targets/lifecycle for effects; stale/missing generation effect-free; observational status/doctor/verify lock-free/effect-free; safe private ancestors/leaf; EEXIST-only concurrency; inode/token-bound release; replacement-lock retention; additive cleanup truth with non-zero CLI exit; stopped-state preservation; exact systemd/tmux targets; holder ownership/global environment proof; unmanaged/remote rejection; redacted stable JSON/exit behavior.
- No live fleet/systemd/tmux/session/site/migration/canary/deploy/runtime/remote/connector action was performed; tests used fake runners/temp files only.
- Current `origin/main` has advanced to `c593a15ef88b78d91cdd62916bcfcdec36040768`; diff against the recorded base did not touch the 12 scoped files, and the FCM-M3-001 behavior review remains valid.
Local gates passed:
- `git diff --check` — pass.
- `pnpm --filter @mosaicstack/mosaic test -- src/fleet/fleet-reconciler.spec.ts src/commands/fleet-reconciler-command.spec.ts src/commands/fleet.spec.ts` — pass, 3 files / 222 tests.
- `pnpm --filter @mosaicstack/mosaic test` — pass, 56 files / 820 tests.
- `pnpm --filter @mosaicstack/mosaic typecheck` — pass.
- `pnpm --filter @mosaicstack/mosaic lint` — pass.
- `pnpm typecheck` — pass, 42/42 turbo tasks cached.
- `pnpm lint` — pass, 23/23 turbo tasks cached.
- Prettier check on exact 12-file scope — pass.
- Adversarial committed-head fixtures passed for stale-generation under-lock fencing, mandatory generation before observe/effects, doctor lock-free/effect-free, cleanup truth/non-zero, and primary-error preservation.
Blocking finding:
- Required PR CI is red for this exact head. `~/.config/mosaic/tools/git/pr-ci-wait.sh -n 785 -t 1200 -i 15` reported failure for PR #785 head `b48f22b50b1beef5190818461df42773d4ae3076`.
- Woodpecker pipeline `1834` status is `failure`; steps: `ci-postgres`, `install`, `sanitization`, `typecheck`, `lint`, and `format` passed; `test` failed with exit 1.
Because the exact committed head has failing required CI, this cannot receive verified approval yet even though the local review and local gates passed. Please remediate or rerun to terminal green CI, then request another reviewer-of-record pass on the unchanged or new exact head.
Woodpecker pipeline 1836: terminal success for head 38de24787d2b1fdca880e782ac37dbea3dd36346; steps ci-postgres, install, sanitization, typecheck, lint, format, test all OK.
~/.config/mosaic/tools/git/pr-ci-wait.sh -n 785 -t 60 -i 5 — green for PR #785 exact head.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements FCM-M3-001 local roster-owned reconciliation and lifecycle control through the existing
mosaic fleetcontrol plane.Independent synthetic-tree REVIEW-6: VERIFIED APPROVE on exact tree
7dc35b8881f07a60de44d2328a37a27ef6c46f64. Commit head:b48f22b50b1beef5190818461df42773d4ae3076. Full package suite: 56 files / 820 tests passed. No live fleet/systemd/tmux actions were performed.Relates to #758. Parent #758 remains open through M5.
🤖 Generated with Claude Code
REQUEST CHANGES — reviewer-of-record for PR #785 head
b48f22b50bI verified the exact committed head and reviewed the 12-file scope against FCM-M3-001 / #758.
Remote/state evidence:
feat/758-local-reconciler; basemain.Relates to #758. Parent #758 remains open through M5.and does not useFixes #758.git ls-remote origin refs/heads/feat/758-local-reconciler refs/pull/785/head=>b48f22b50b1beef5190818461df42773d4ae3076for both.7dc35b8881f07a60de44d2328a37a27ef6c46f64.bc5e73629e92c56a80fa6a769ebad17c0177f504.Code/security review result:
origin/mainhas advanced toc593a15ef88b78d91cdd62916bcfcdec36040768; diff against the recorded base did not touch the 12 scoped files, and the FCM-M3-001 behavior review remains valid.Local gates passed:
git diff --check— pass.pnpm --filter @mosaicstack/mosaic test -- src/fleet/fleet-reconciler.spec.ts src/commands/fleet-reconciler-command.spec.ts src/commands/fleet.spec.ts— pass, 3 files / 222 tests.pnpm --filter @mosaicstack/mosaic test— pass, 56 files / 820 tests.pnpm --filter @mosaicstack/mosaic typecheck— pass.pnpm --filter @mosaicstack/mosaic lint— pass.pnpm typecheck— pass, 42/42 turbo tasks cached.pnpm lint— pass, 23/23 turbo tasks cached.Blocking finding:
~/.config/mosaic/tools/git/pr-ci-wait.sh -n 785 -t 1200 -i 15reported failure for PR #785 headb48f22b50b1beef5190818461df42773d4ae3076.1834status isfailure; steps:ci-postgres,install,sanitization,typecheck,lint, andformatpassed;testfailed with exit 1.Because the exact committed head has failing required CI, this cannot receive verified approval yet even though the local review and local gates passed. Please remediate or rerun to terminal green CI, then request another reviewer-of-record pass on the unchanged or new exact head.
VERIFIED APPROVE — reviewer-of-record for PR #785 head
38de24787dExact identity and remote state verified:
38de24787d2b1fdca880e782ac37dbea3dd36346.6b02c257b68db1af2448474f911f1ab3ba047fe7.b48f22b50b1beef5190818461df42773d4ae3076.b48f22b50b1beef5190818461df42773d4ae3076/7dc35b8881f07a60de44d2328a37a27ef6c46f64.bc5e73629e92c56a80fa6a769ebad17c0177f504.git ls-remoteconfirms bothrefs/heads/feat/758-local-reconcilerandrefs/pull/785/headpoint to38de24787d2b1fdca880e782ac37dbea3dd36346.Relates to #758. Parent #758 remains open through M5.17581applied to superseded headb48f22b50b1beef5190818461df42773d4ae3076and is not a verdict on this head.Reviewed scope:
bc5e73629e92c56a80fa6a769ebad17c0177f504: exact 12 files, 1888 insertions / 45 deletions.b48f22b50b1beef5190818461df42773d4ae3076: exact 3 files, 29 insertions / 13 deletions:packages/mosaic/src/commands/fleet.spec.tspackages/mosaic/src/fleet/fleet-reconciler.spec.tspackages/mosaic/src/fleet/fleet-reconciler.tsReview result:
EIOproveslock-io-faileddeterministically.acquirePrivateReconcileLockdefaults tonode:fs/promisesopen; injection is a direct test seam, not CLI/runtime input.EEXISTmaps to concurrency after existing-leaf validation; unsafe leaves reject asunsafe-lock.CI and local gates:
1836: terminalsuccessfor head38de24787d2b1fdca880e782ac37dbea3dd36346; stepsci-postgres,install,sanitization,typecheck,lint,format,testall OK.~/.config/mosaic/tools/git/pr-ci-wait.sh -n 785 -t 60 -i 5— green for PR #785 exact head.git diff --check— pass.pnpm --filter @mosaicstack/mosaic test -- src/fleet/fleet-reconciler.spec.ts src/commands/fleet-reconciler-command.spec.ts src/commands/fleet.spec.ts— pass, 3 files / 222 tests.pnpm --filter @mosaicstack/mosaic test— pass, 56 files / 820 tests.typecheckandlint— pass.pnpm typecheck— pass, 42/42 turbo tasks cached.pnpm lint— pass, 23/23 turbo tasks cached.EEXIST/EIO/unexpected open failures, pre-open managed-path validation, unsafe existing leaves, and v2 missing/malformed fail-closed behavior.Residual risks / boundaries: