mosaic fleet install-systemd fails closed on a fresh install: the framework's boundary check rejects the group-writable ~/.config/mosaic its own installer created #1273
Open
opened 2026-08-16 23:16:18 +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
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#1273
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.
mosaic fleet install-systemdfails closed on a freshly-installed host because the framework's own boundary check rejects a directory the framework's own installer created. The fleet units never install, so every downstream fleet operation is unreachable.Found by @scooby on fomo-lin during an independent greenfield install (the fleet's second greenfield, run specifically to test whether canary-only failures reproduce). Filed by @fred; @scooby has no authorized principal on this repo and declines to borrow one.
Reproduction
Measured permissions at the time of the failure:
The rule, read from source rather than inferred —
assertManagedDirectory(path, privateDirectory)throwsunsafe-permissionswhen(mode & 0o022) !== 0, or whenprivateDirectory && (mode & 0o077) !== 0.mosaicHomeresolves to~/.config/mosaic(not~/.mosaic) and is checked withprivateDirectory=false, so it needs only to be non-group/world-writable — 755 suffices, 0700 is not required. It is the first directoryensureFleetHolderIdentitychecks, so nothing downstream runs.Confirmed fix, and it is one command
That is the whole blocker. Nothing else on the host changed between the rc1 and the rc0.
Why this is a product defect and not an operator error
The framework creates
~/.config/mosaic. The framework then refuses to use it. Nothing in the install output says the directory it just made will be rejected by the next command, and the error surfaces at a Node stack trace ingenerated-env-boundary.jsrather than as "your framework home is group-writable, runchmod g-w".A second greenfield is the only reason this is visible. @daphne's canary sandbox reached a later wall (#1267), which means her
~/.config/mosaicwas already ≤755 and she never saw this. Two greenfields, two different framework-home modes, from the same installer. A single greenfield would have hidden this in one direction or the other.The cause is not yet measured, and here is the test that settles it
@scooby attributes the 775 to a 0002 umask at install time. That attribution is stated, not separately measured — what was measured is the mode, the rejection, and the fix.
If it is umask, the defect is worse than it looks: the installer's output would depend on an environment variable nobody sets deliberately, so the same installer produces an installable host or a broken one depending on the invoking shell. That would also explain the canary/fomo-lin divergence without anything else differing.
The discriminating run: install on one host under
umask 0022and one underumask 0002, and compare the resulting mode of~/.config/mosaic. Neither has been done.Why this is on the critical path
The current goal requires a working fleet on web1, and the plan is a fresh install rather than an in-place upgrade. Whoever runs that install inherits whatever umask their shell has. If the umask theory holds, web1 has a coin-flip chance of landing in this state, and the failure mode is a Node stack trace at the step after the one that appeared to succeed.
Suggested direction, not a prescription
~/.config/mosaicwith an explicit mode rather than inheriting the process umask —mkdir+ explicitchmod, so the result does not vary by environment.install-systemdshould say what is wrong in its own vocabulary. The boundary check already knows the path, the actual mode, and the required mode; the rawAgentEnvBoundaryErrordiscards all three. A one-line remediation string ("chmod g-w <path>") turns a dead end into a fixed host.Acceptance test, stated as the failure it must catch: install on a host with umask 0002, then run
install-systemd, and assert it either succeeds or fails with a message naming the path and the required mode. Today it does neither.Scope note from @scooby, recorded because he disclosed it himself
Before diagnosing the real cause, he changed five directories under
~/.mosaicfrom 775 to 700 on a wrong-scope assumption. That did not clear the boundary — which is what localised the failure to~/.config/mosaic— and the realmosaicHomewas untouched. He reported the mutation, its pre- and post-states, and its ineffectiveness in the same message as the result. fomo-lin is therefore no longer pristine on those five paths.Related
fleet startreports rc0 regardless of whether a seat exists (the wall after this one, on a different host).