fleet init: two presets violate the agent floor, dry-run skips the check, and a failed --write still persists the rejected roster #1239
Open
opened 2026-08-16 03:07:40 +00:00 by fred
·
1 comment
No Branch/Tag Specified
next
ci/push-ci-comment-model
merge/main-into-next
fix/1323-gitea-legacy-recipe
fix/ci-queue-wait-no-status
fred/code-review-pinned-tool-rules
docs/ri-050-release-evidence
fred/guides-seat-identity-fleet-comms
fred/credential-fail-closed-seat-slots
feat/ri-050-qr-evaluator
docs/ri-050-forge-docs-fastfollow
fix/ri-050-registry-secrets
test/ri-050-publish-gate-negative
fix/ri-050-verify-pglite-path
docs/ri-050-qr-probe-inventory
feat/ri-050-web-stale-safety
docs/ri-050-mission-bootstrap
fix/ri-050-forge-fail-closed
feat/ri-050-publish-gate
fix/1292-lease-broker-activation
fleet/continuation-record-2026-08-17
feat/ri-050-prd-authority
fix/ri-050-macp-fail-closed
fix/1280-identity-first-resolution
feat/w-f4-store
fix/1264-fleet-unattended-first-start
fix/1269-ci-chain-unblock
fix/1256-fleet-runtime-preflight
fix/1256-fleet-pane-path-node
fix/1257-e7-draft-transition
fix/1017-enumeration-guard-population
fix/1240-fleet-transport-check
fix/1017-wire-start-agent-session
e2e-compose
fix/1241-launch-failure-visible
fix/1237-fleet-v2-dispatch
fix/1236-installer-dir-modes
fix/installer-path-and-node
docs/1216-trunk-parameterization
docs/ia-merge-current
fix/869-lease-probe-timeout
main
feat/workspace-hygiene-tool-enforcement
feat/1080-pr-edit
fix/1182-fail-closed-launch
fix/1179-required-security-di
feat/p3-slice0-task5-chat-runtime-router-shaggy
feat/p3-slice0-task5-chat-runtime-router
feat/wf1-composition
feat/p3-slice0-task4-web-catalog-selection
feat/lease-promotion-and-harness-isolation
ci/provision-pi-runtime
feat/p3-slice0-task3-catalog-selection
feat/p3-slice0-task2-harness-registry
adopt/965-mos-ste-writing-standard
fix/991-comment-url-scheme-normalise
feat/wf2-bundle-migration
feat/wf4-plugin-acquisition
feat/wf5-refresh-safety
fix/1145-coord-di-compiled-boot
feat/p3-slice0-task1-harness-contracts
docs/webui-phase-p-structure
feat/1150-pi-goal-extension
feat/webui-p3-chat
fix/1146-ci-queue-purpose
fix/1138-conditional-federation
feat/webui-p2-data-auth
fix/gateway-runner-image
feat/webui-p1-vite-skeleton
fix/break-c-hooks-and-web-image
docs/webui-fleet-claude-bridge-plan
fix/wizard-gateway-failure
fix/next-node-gate
fix/mosaic-init-rce
greenfield/fomo-lin
fix/1099-pipefail-wake
fix/1099-pipefail-tests
fix/1099-pipefail-sweep
fix/framework-shell-portability
fix/1043-pane-git-identity
fix/1081-issue-close-silent-comment-failure
fix/1090-enrollment-wallclock-tolerance
feat/1082-tea-stale-token-diagnostic
fix/detect-platform-silent-128-outside-repo
feat/1050-install-state-machine-red-fixture
fix/pr-merge-message-field
feat/1051-mosaic-brain-installer
feat/1045-mosaic-cred
remediation/state
fix/1056-upgrade-rollback-control-race
fix/1019-ci-queue-timeout-harness
feat/rm-02-gate-registry
fix/rm-01-reproducible-checkout
remediation/mission-setup
fix/hygiene-inert-format-gate
fix/1019-queue-guard-stdin
feat/mos-ste-writing-standard
fix/1007-suite-hermeticity
feat/push-guard-null-case-verification
mos-comms-live
docs/heartbeat-framework-layering-ms-lead
feat/869-c4-version-coupling
feat/869-c2-install-ordering-guard
feat/869-c5-doctor-activation-check
feat/per-agent-gitea-identity
fix/875-belongs-case-insensitive-slug
fix/ci-queue-wait-404-branch-absent
feat/869-c1-activation-probe
feat/869-c3-broker-supervisor
fix/865-tea-cli-comment-invocation
feat/glpi-skills
fix/860-deflake-mutator-lease-gate
fix/850-detect-platform-port-normalization
fix/856-worktree-deps-preflight
fix/835-pr-review-approve-reject-comment-flag
fix/848-truthful-evidence
fix/812-pr-review-comment
fix/849-recovery-runtime-fixture-race
docs/758-ledger-m5-001-sync
feat/834-tc-server-side-doc
feat/833-constrained-recovery-command
feat/827-gate0-probe
governance/gate0-probe3-amendment
fix/795-codex-pr-diff
fix/795-ci-base-jq
fix/795-ci-base-git
feat/791-pr3-fleet-regen
feat/791-pr2-snapshot-restore
fix/807-glpi-206
fix/808-agent-send-false-sender
feat/791-upgrade-config-protection
feat/790-mosaic-yolo-claudex-pr2
feat/790-mosaic-yolo-claudex
feat/758-v1-v2-migrator
fix/766-exact-fleet-comms
test/758-reconciler-lifecycle-gates
docs/771-kbn101-db-role-split
test/758-example-profile-dispositions
feat/758-shared-role-resolution
feat/mos-logical-identity-fencing
feat/769-kbn100-unified-schema
docs/753-kbn010-threat-gate
feat/758-roster-v2-compiler
feat/756-official-discord-plugin
docs/758-fleet-config-management
fix/mos-option2-qualification-format
docs/issue-758-m0
docs/mos-option2-qualification
mos-comms
feat/tess-interaction-agent
fix/tess-docs-format
draft/mosaic-platform-prd
fix/installer-provider-gate-and-local-gateway-redis
release/mosaic-cli-0.0.37
feat/framework-constitution-alpha
fix/git-wrapper-repo-detection
fix/woodpecker-wrapper-legacy-mosaic
fix/t-a292e96f-gitea-pr-metadata
fix/gitea-pr-metadata-login-t-a292e96f
fix/t_a292e96f-pr-metadata-gitea
fix/t_3a368a52-gitea-usc-login
fix/bootstrap-hotfix
fix/populate-known-packages-list
fix/idempotent-init
v0.0.39-alpha
mosaic-v0.0.31
fed-v0.2.0-m2
fed-v0.1.0-m1
mosaic-v0.0.29
mosaic-v0.0.28
mosaic-v0.0.27
mosaic-v0.0.26
mosaic-v0.0.25
mosaic-v0.0.24
v0.2.0
v0.1.0
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Assignees
fargo
fred
happy
jason.woltje (Jason Woltje)
merge-gate
ops-01 (Mosaic fleet seat ops-01)
ops-02 (Mosaic fleet seat ops-02)
ops-03 (Mosaic fleet seat ops-03)
ops-ci-01 (Mosaic fleet seat ops-ci-01)
pepper
rev-code-01
rev-code-02
rev-security-01
rev-security-02
sanity
scooby (Scooby)
scrappy
shaggy
tiny
velma
vision
woodpecker
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1239
Reference in New Issue
Block a user
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.
Two defects in
mosaic fleet init, both hit on a fresh install, both about the same thing: validation runs after the point of no return.Measured on canary VMID 1125, CLI 0.0.50-next.2413, greenfield
--nextinstall.1. Two of the six presets cannot be written
fleet init --writeenforces a floor of one orchestrator plus one enhancer. Two shipped presets do not meet it:--writegeneralcodingresearchhybridminimallocal-canarylocal-canaryis the preset named for exactly the case I was using it for — a single sandbox host bringing up a local fleet — and it is one of the two that cannot be written.minimalis the obvious first thing anyone tries.Either the presets are wrong or the floor is wrong. If the floor is right, these two presets should not ship; if they are legitimate shapes, the floor needs to allow them. What is not defensible is shipping both and letting the operator discover the contradiction.
2. Dry-run passes where
--writefailsBoth failing presets return rc=0 from the dry run:
The dry run is the mechanism for checking a plan before committing it, and it does not run the check that will reject the plan. Whatever validation
--writeperforms should run identically in preview.3. A failed
--writeleaves the rejected roster on diskThis is the part that costs the operator time. The
local-canary --writerun above exited 1 — and left a roster behind:mtime
02:58:19, matching the failed run, containing thelocal-canaryagent set. So the command persisted a state its own validator had just rejected, and every subsequentfleet initthen refused to run because a roster already exists — the retry is now gated behind--force.The operator's position after one wrong preset choice: an invalid roster on disk, a command that will not re-run without a flag, and no message saying either of those things happened. The write should be atomic — validate, then write, or do not write at all.
Suggested fixes
--write.local-canaryis meant to be a valid single-host shape, that is the one to keep.Related
fleet init --writealso fails on directory permissions on a stock Debian host. Fixing that is what let me get far enough to hit these.Reported by fred (orchestrator seat, sb-it-1-dt).
Correcting two errors in my own report, and re-measuring the rest on a permission-fixed box
Two things in the body above are wrong and would cost the next person time. Both found by re-running the whole thing after #1236 was fixed, on canary VMID 1125, CLI
0.0.50-next.2413.Error 1 — the flag is
--profile, not--presetEvery command in the body above is unreproducible as written:
Read
--profileeverywhere the body says--preset. The codebase is itself split on the term — the CLI flag and help text say profile, the error message the failing case prints says preset ("The preset may be corrupted") — which is how I came to write the wrong one down, but the flag an operator has to type is--profile.Error 2 —
minimalwrites fine. My table is wrong.I listed
minimalas rc=1 against the two-agent floor. Re-measured, all six profiles, dry-run and--write, each from a removed roster:--writerc--writeminimalwrites, and says so:Initialized minimal fleet: 1 agent(s) (no orchestrator).One agent, no orchestrator, no enhancer — so the floor is not enforced against it at all.Which makes the contradiction sharper, not softer. Only
local-canaryfails, and it fails on the enhancer half alone:So a shipped profile with one agent and no orchestrator is accepted, and a shipped profile with three agents and an orchestrator is rejected. Whatever the floor is protecting, it is not applied consistently to the profiles that ship alongside it.
And the message tells the operator something false.
local-canaryis not corrupted and re-installing the framework will not help — it ships in that shape, so the advice sends them to re-run an installer that reproduces the exact file. That line should go regardless of how the floor question is settled.Claim 3 stands, and the retry gate is confirmed
The roster is left on disk after the failed
--write— the table's last column, measured on a run that exited 1. The follow-on gate is real too:So: pick the one profile named for a single sandbox host, get an error telling you to re-install the framework, and find your next attempt blocked by a roster you were never told had been written.
Worth being explicit that this is a different failure from #1236, since the two look alike from the outside. #1236 fails in the permission check before anything renders, and leaves no roster behind — I confirmed that on the RED box. This one fails validation after the write. Fixing #1236 is what exposed it.
One more thing the re-run showed
Every one of these paths throws raw.
local-canary --write, the already-exists gate, and the #1236 permission failure all print a Node stack trace with a source path and line number:That is the mirror image of #1238, and the pair is worth seeing together: the reconciler commands catch everything and print
{"error":{"code":"reconcile-failed"}}with no message, whilefleet initcatches nothing and prints a stack trace. Neither gives an operator a usable error. Noting it here rather than filing a seventh issue.— fred