fix(fleet): consume model_hint + fix socket-default trap (stand-up fixes) #627
Reference in New Issue
Block a user
Delete Branch "feat/fleet-standup-fixes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fleet stand-up fixes — model_hint + socket-default trap (closes #626)
Two PoC-blocking spawn-side fixes found building the live roster.
FIX 1 —
model_hintnot consumedstart-agent-session.shbuiltmosaic yolo $RUNTIMEwith no--model, so pi workers ignored the roster's model. NowgenerateAgentEnvemitsMOSAIC_AGENT_MODEL=<hint>and the launcher appends${MOSAIC_AGENT_MODEL:+--model $MOSAIC_AGENT_MODEL}→ workers run on e.g.openai-codex/gpt-5.5:high.FIX 2 — socket-default trap (absent ⇒ literal default socket, no
-Leverywhere)An absent roster socket silently became
mosaic-factoryin three places (the original 2-file scope was actually 4 files — flagging the extra one):parseRosterTextfallback (fleet.ts) — wasDEFAULT_SOCKET_NAME→ now''.mosaic-agent@.service(found during investigation):Environment=MOSAIC_TMUX_SOCKET=mosaic-factoryandExecStop …${…:-mosaic-factory}— both were spawn-path traps. Removed the default; conditional ExecStop.start-agent-session.sh—:-mosaic-factorydefault → empty;_tmuxwrapper passes-Lonly when a socket is set.Plus:
socketArgs(name)helper →name ? ['-L', name] : []; replaces all ~15-Lrender sites infleet.ts(spawn-check, list-sessions/panes, watch/attach/kill, ps, agent-send).shellEnvValue('')now emits a bareVAR=(not'') — a quoted''in a systemdEnvironmentFilecould become a literal socket named''and defeat the whole fix.So spawn == systemd unit ==
fleet ps/watch observe == onboarding cheat-sheet: absent socket → default tmux socket, no-L.Containment (safety)
All 6 shipped presets set
socket_name: mosaic-factoryexplicitly → unaffected. Only socket-less rosters (the PoC) get default-socket behavior.DEFAULT_SOCKET_NAMEis exported as a named constant for explicit isolation (no longer the silent fallback).Verification
socketArgsnone/named;model_hint→env; explicit-socket renders-L; socket-less env is bare. Existing default-socket tests updated to the new no--Lcontract.bash -n+ end-to-end sim: socket-less →tmux has-session(no-L); model →mosaic yolo pi --model ….🤖 Generated with Claude Code
Two spawn-side blockers found building the live PoC roster. FIX 1 — model_hint not consumed: start-agent-session.sh built 'mosaic yolo $RUNTIME' with no --model, so pi workers ignored the roster's model. Now generateAgentEnv emits MOSAIC_AGENT_MODEL=<hint> and the launcher appends ${MOSAIC_AGENT_MODEL:+--model $MOSAIC_AGENT_MODEL} → workers run on e.g. openai-codex/gpt-5.5:high. FIX 2 — socket default trap: an ABSENT roster socket silently became mosaic-factory in THREE places (parseRosterText fallback; the mosaic-agent@.service Environment= default + ExecStop :-mosaic-factory; start-agent-session :-mosaic-factory). The live PoC runs on the DEFAULT tmux socket (socket_name absent). Now absent ⇒ '' ⇒ the literal default socket (no -L) consistently across spawn, the systemd unit, fleet ps/watch observe, and the onboarding cheat-sheet: - socketArgs(name) → name ? ['-L', name] : []; replaces all ~15 -L sites in fleet.ts. parseRosterText fallback '' (was DEFAULT_SOCKET_NAME). - shellEnvValue('') now emits a BARE 'VAR=' (not ''), so a socket-less .env can never yield a literal socket named "''" under systemd EnvironmentFile. - start-agent-session.sh _tmux wrapper passes -L only when a socket is set; mosaic-agent@.service drops the socket default + uses a conditional ExecStop. CONTAINMENT: all 6 shipped presets set socket_name: mosaic-factory explicitly, so they are unaffected — only socket-less rosters (the PoC) get default-socket behavior. DEFAULT_SOCKET_NAME exported as a constant for explicit isolation. Verified: 158 fleet + 201 fleet-adjacent tests green (socketArgs none/named, model_hint→env, explicit-socket renders -L, socket-less bare env); shell bash -n + end-to-end sim (socket-less→no -L, model→--model); tsc/eslint/prettier/ sanitize clean. Refs #626 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83