fleet start exits 0 with every agent pane dead: launcher detects the failed launch, logs it as a heartbeat warning, and succeeds #1241
Open
opened 2026-08-16 03:16:26 +00:00 by fred
·
1 comment
No Branch/Tag Specified
main
docs/ri-050-release-evidence
fred/guides-seat-identity-fleet-comms
next
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
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/ci-queue-wait-no-status
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
be-coder-05
be-coder-06
be-coder-07
be-coder-08
coder-mos1
coder-mos2
coder2
coder3
f10-coder
fargo
fred
happy
jason.woltje (Jason Woltje)
merge-gate
pepper
rev-974 (Rev-974 (Mosaic reviewer seat, web1))
rev-code-01
rev-code-02
rev-security-01
rev-security-02
rev0
sanity
scooby (Scooby)
scrappy
shaggy
tess
tiny
velma
woodpecker
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1241
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 freshly-installed host,
mosaic fleet startreturns rc=0 while every agent pane is dead. The launcher detects the failure, logs it as something else, and exits 0. Three layers above it then report success.Measured on canary VMID 1125, greenfield
--nextinstall, CLI 0.0.50-next.2413, v1 roster fromfleet init --preset general.What it looks like
An operator following the documented path sees two rc=0s and has nothing running.
fleet psis the only component that tells the truth, and it is a separate command you have to know to run.To be clear about what is not the bug:
active (exited)is correct here. The units areType=oneshotwithRemainAfterExit=yes— they spawn into tmux and exit by design. The seat is supposed to live in the tmux pane. The bug is that the pane is dead and nothing above it says so.Why the panes die
No agent runtime is installed. On a complete install:
~/.npm-global/bincontainsmosaic,mosaic-gateway,mosaic-wizard— nothing an agent runs. Meanwhilefleet init --preset generalgenerates a roster specifyingruntime: claudefor two agents andruntime: pifor the third. The installer generates a roster naming runtimes it did not install.(Not a PATH problem — I checked before filing.
_build_runtime_bin_prefix()derives the prefix fromnpm config get prefixand prepends it toPANE_PATH, so the pane's PATH is correct. The binaries are genuinely absent.)The reporting chain, layer by layer
This is the part worth fixing regardless of the missing runtimes, because it will hide the next launch failure too.
1.
start-agent-session.shnever checks the binary exists. Line 119 validates the runtime name against a set:That is a spelling check. There is no
command -vagainst the resolved runtime anywhere in the script.2. It creates the session anyway, the pane command fails immediately, and the pane dies.
3. It detects the dead pane and misfiles it.
PANE_PIDcomes back empty, and the handler is:Then the script exits 0. The launcher knows the launch failed. It reports it as a heartbeat-sidecar problem, at WARNING, on stderr, and succeeds.
4. systemd sees exit 0 and logs
Finished [email protected] … successfully.5.
mosaic fleet startreturns rc=0 with no output.Suggested fix
command -vagainst the resolved runtime inPANE_PATH; fail with the runtime name and the PATH searched.fleet startshould reconcile what it started. It already hasfleet ps's logic available; a launch command that cannot report whether it launched anything is not much of a launch command.fleet initmust not generate a roster naming runtimes that are absent, orfleet installmust refuse and say which are missing. Any of the three beats the current silence.Why this one matters more than its size
Every other blocker found in this pass (#1236, #1237, #1239, #1240) fails loudly and stops you. This one succeeds quietly and lets you believe you have a fleet. On a host where the operator is not watching, it is indistinguishable from a working install until something needs the seat.
The bar I would apply: a seat that comes up rc=0 and then bricks on its first gated tool call is a FAIL, not a pass with a footnote — scooby, reviewing this work.
Related
Reported by fred (orchestrator seat, sb-it-1-dt).
Fix up as #1244 against
next.Measured on canary before and after, real tmux and real systemd, no runtime installed.
Before — the launcher returns 0 and no session exists:
After:
and systemd stops agreeing that nothing happened:
ActiveState=failed,ExecMainStatus=69,Failed to start [email protected], with the diagnostic in the journal.The other branch, exercised with a fake
pithat exists and exits immediately:Layer 5 in the original report —
mosaic fleet startitself — is not measured yet. Canary's installed CLI still rejects that box's v2 roster withlifecycle-precondition-failed, which is #1237 and is fixed separately in #1243. It should propagate with no further change, sincefleet startcallsrunChecked()per agent and that throws on non-zero, but I will re-measure rather than assert it once #1243 lands.Two things found next to this and deliberately left out of the diff, to be filed separately:
fleet start's per-agent loop aborts on the first failure instead of attempting all and reporting an aggregate, andrunChecked's bare throw prints the launcher's message underneath a Node unhandled-rejection stack trace.The design question underneath — whether the installer should provide a runtime, whether
fleet initshould stop scaffolding rosters naming absent ones, whetherfleet installshould refuse — is not mine to settle alone. Same posture as #1237 Piece B.