Brain-split host: fleet start returns 0 and starts nothing — [email protected] gates on the config home, the reconciler writes the brain home #1310
Open
opened 2026-08-18 18:57:20 +00:00 by fred
·
0 comments
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
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#1310
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.
On a brain-split host (
~/.mosaicadopted as the brain home),mosaic fleet startreturns 0, reports nothing, and starts no seat. All three units are skipped, not failed, so every status surface agrees the fleet is fine.Measured 2026-08-18 on
mosaic-sbx-dev(VMID 1124), rolled to the permanentgreenfieldsnapshot,nextlane, package0.0.50-next.2507.Cause
packages/mosaic/framework/systemd/user/[email protected]gates on the config home:On a roster-v2 fleet in split mode the reconciler writes the generated env to the brain home. After a clean
fleet init --write+fleet install+fleet start:The condition can therefore never be met, and an unmet condition is reported as success:
journal:
[email protected] ... skipped, unmet condition check ConditionPathExists=/home/mosaic/.config/mosaic/fleet/agents/orchestrator.env.generatedCausal test, not correlation
One seat's env file copied into the config home. Nothing else changed. The other two seats are the untouched negative controls:
The started seat's pane shows the Mosaic identity wizard, i.e. it reaches the authentication boundary — so nothing downstream of the condition is implicated.
Controls on the measurement
mosaic fleet no-such-subcommand-zq7→ RC=1, run first, so the RC=0 results are not a CLI that returns 0 for everything.tmux -L mosaic-fleet has-session zzz-nonce-8d2e→can't find session, so the_holder-only session list is a real reading of that socket.[email protected]on the VM is sha2563614731f70a3326e4409c5fe1e1708289d8afb6fed4ff0d4dd87b11d75f074f2, byte-identical toorigin/next— this is the shipped unit, not a local edit.Caution for anyone reproducing: a unit that does not exist also reports
ConditionResult=no, so that field alone cannot tell "skipped" from "absent". I lost time to this by queryingmosaic-fleet-holder.service, which is not a real unit name (mosaic-tmux-holder.serviceis). Confirm the unit exists first.The existing test cannot observe this
packages/mosaic/src/commands/fleet-roster-v2-dispatch.spec.ts:214-255names exactly this drift:Its fixture calls
v2Home(), a custom mosaic-home.resolveBrainHome()deliberately never adopts~/.mosaicwhen--mosaic-homeis custom (hermetic sandboxes), so inside the fixture the brain home always equals the config home and the two paths cannot come apart. The assertion passes in both the broken and the fixed state. Any fix needs a fixture that reaches split mode — a real default home, orMOSAIC_BRAIN_HOMEset explicitly — or it will stay green over the change.Fix direction
The condition is a deliberate boot-window guard; the in-file comment explains that
installenables the unit before the reconciler has written env, and that a skipped unit is the honest state for "enabled but not yet configured". A fix should keep that intent:fleet installwrite a per-host drop-in that clears and re-points the condition at the resolved brain home —ConditionPathExists=(empty, to reset) followed by the correct path with%i; orDeleting the condition outright loses the boot-window behaviour the comment documents.
Scope
Measured on one host, one VM, one package version, split mode only. Legacy (non-split) mode on the same snapshot does not hit this — its blocker is #1256. I have not measured whether web1's current install is split or legacy.
This blocks the web1 fleet migration: on a host where
~/.mosaic/fleet/agentsexists, the fleet reports healthy and is empty.-- fred (sb-it-1-dt)