fix(fleet): consume model_hint + fix socket-default trap (stand-up fixes) #627

Merged
jason.woltje merged 1 commits from feat/fleet-standup-fixes into main 2026-06-22 19:18:02 +00:00
Owner

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_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 (absent ⇒ literal default socket, no -L everywhere)

An absent roster socket silently became mosaic-factory in three places (the original 2-file scope was actually 4 files — flagging the extra one):

  1. parseRosterText fallback (fleet.ts) — was DEFAULT_SOCKET_NAME → now ''.
  2. mosaic-agent@.service (found during investigation): Environment=MOSAIC_TMUX_SOCKET=mosaic-factory and ExecStop …${…:-mosaic-factory} — both were spawn-path traps. Removed the default; conditional ExecStop.
  3. start-agent-session.sh:-mosaic-factory default → empty; _tmux wrapper passes -L only when a socket is set.

Plus:

  • socketArgs(name) helper → name ? ['-L', name] : []; replaces all ~15 -L render sites in fleet.ts (spawn-check, list-sessions/panes, watch/attach/kill, ps, agent-send).
  • shellEnvValue('') now emits a bare VAR= (not '') — a quoted '' in a systemd EnvironmentFile could 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-factory explicitly → unaffected. Only socket-less rosters (the PoC) get default-socket behavior. DEFAULT_SOCKET_NAME is exported as a named constant for explicit isolation (no longer the silent fallback).

Verification

  • 158 fleet + 201 fleet-adjacent tests green. New: socketArgs none/named; model_hint→env; explicit-socket renders -L; socket-less env is bare. Existing default-socket tests updated to the new no--L contract.
  • Shell bash -n + end-to-end sim: socket-less → tmux has-session (no -L); model → mosaic yolo pi --model ….
  • tsc/eslint/prettier/sanitize clean. Cheap under #619.

🤖 Generated with Claude Code

## 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_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 (absent ⇒ literal default socket, no `-L` everywhere) An absent roster socket silently became `mosaic-factory` in **three** places (the original 2-file scope was actually 4 files — flagging the extra one): 1. `parseRosterText` fallback (`fleet.ts`) — was `DEFAULT_SOCKET_NAME` → now `''`. 2. **`mosaic-agent@.service`** (found during investigation): `Environment=MOSAIC_TMUX_SOCKET=mosaic-factory` **and** `ExecStop …${…:-mosaic-factory}` — both were spawn-path traps. Removed the default; conditional ExecStop. 3. `start-agent-session.sh` — `:-mosaic-factory` default → empty; `_tmux` wrapper passes `-L` only when a socket is set. Plus: - **`socketArgs(name)`** helper → `name ? ['-L', name] : []`; replaces all ~15 `-L` render sites in `fleet.ts` (spawn-check, list-sessions/panes, watch/attach/kill, ps, agent-send). - **`shellEnvValue('')` now emits a bare `VAR=`** (not `''`) — a quoted `''` in a systemd `EnvironmentFile` could 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-factory` explicitly** → unaffected. Only socket-less rosters (the PoC) get default-socket behavior. `DEFAULT_SOCKET_NAME` is exported as a named constant for explicit isolation (no longer the silent fallback). ### Verification - **158 fleet + 201 fleet-adjacent** tests green. New: `socketArgs` none/named; `model_hint`→env; explicit-socket renders `-L`; socket-less env is bare. Existing default-socket tests updated to the new no-`-L` contract. - Shell `bash -n` + end-to-end sim: socket-less → `tmux has-session` (no `-L`); model → `mosaic yolo pi --model …`. - tsc/eslint/prettier/**sanitize** clean. Cheap under #619. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jason.woltje added 1 commit 2026-06-22 18:27:05 +00:00
fix(fleet): consume model_hint + fix socket-default trap (#626)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
fa2abd462d
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
jason.woltje merged commit 7342415a32 into main 2026-06-22 19:18:02 +00:00
jason.woltje deleted branch feat/fleet-standup-fixes 2026-06-22 19:18:02 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#627