From 898e24472ac566b0ba868f63caf674190895851c Mon Sep 17 00:00:00 2001 From: scooby Date: Sat, 8 Aug 2026 14:29:34 -0500 Subject: [PATCH] =?UTF-8?q?greenfield(fomo-lin):=20session=202=20=E2=80=94?= =?UTF-8?q?=20init=20+=20first=20bare=20seat;=20findings=20F6-F10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit install → init → launch broken at four consecutive links on fresh main: F6 eval injection in mosaic-init (SECURITY), F7 init drops installer's mcpServers block, F8 missing fleet roster = raw stack trace, F9 activation probe 2.0s timeout < 2.6s CLI cold-start on modest hardware (flagship), F10 shipped lease-broker unit never installed. Seat launched after documented workarounds; runtime-contract injection verified in-seat. Co-Authored-By: Claude Fable 5 --- docs/reports/greenfield/fomo-lin.md | 68 ++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/docs/reports/greenfield/fomo-lin.md b/docs/reports/greenfield/fomo-lin.md index 66039ba7..0555c9d8 100644 --- a/docs/reports/greenfield/fomo-lin.md +++ b/docs/reports/greenfield/fomo-lin.md @@ -80,7 +80,73 @@ installer's bundle and the repo dir — have diverged. laptop has no ssh keys. ssh reach would need Jason (key provisioning + route/VPN). - Gitea write to the stack repo: verified by the push of this very branch (token `usc_mos`). +## Session 2 (2026-08-08 later) — `mosaic init` + first bare seat + +`mosaic init` completed (SOUL.md / USER.md / TOOLS.md generated; TOOLS.md was backed up +before overwrite — the contrast with F2 shows the codebase already knows how). Its +runtime-adapter step correctly REFUSED to wire mutator-gate/receipt-observer hooks +(activation half absent, #869) — loud, explained, fail-safe. Good. + +First bare seat: **launched** — `mosaic claude --model sonnet` → Claude Code v2.1.226, +runtime-contract injection verified from inside the seat. But it took findings F6–F10 to +get there; on an untouched fresh main install, install → init → launch is broken at +FOUR consecutive links. + +### F6 — SECURITY: `mosaic-init` eval-injects free-text answers + +`tools/_scripts/mosaic-init` line 142: `eval "$var_name=\"$value\""`. Any answer +containing `"` crashes init mid-flow (reproduced: exit 127, USER.md never written); +an answer containing `$( )` would EXECUTE arbitrary commands. Fix: `printf -v`. +Same bug in the NON_INTERACTIVE default branch. Related: init exits 1 even on success +when enforcement wiring is (correctly) refused — poisons any scripted chaining. + +### F7 — init silently drops the installer's `mcpServers` block → launcher refuses to run + +init's "Updating runtime adapters" rewrote `~/.claude/settings.json` and removed the +`mcpServers.sequential-thinking` block the installer had written 11 min earlier. +`mosaic claude` hard-requires that MCP → launch refused. The prescribed fix command +(`mosaic-ensure-sequential-thinking --runtime claude`) works. So the happy path is +install → init → BROKEN → hand-run a repair script. Merge-not-replace (F2) fixes this too. + +### F8 — no fleet roster on a fresh install; launcher dies with a raw stack trace + +`mosaic claude` throws an uncaught `Error: Fleet communications contract unavailable: no +fleet roster at ~/.config/mosaic/fleet/roster.{yaml,json}` (full Node stack trace to the +user). Nothing in install or init creates a roster (wizard untested here — `--no-auto-launch`; +if the wizard seeds one, the bare-flow gap still stands). Unblocked by hand-authoring a +minimal site roster from `fleet/examples/minimal.yaml`. + +### F9 — FLAGSHIP: activation-probe timeout loses to CLI cold-start on modest hardware + +`activation_version_gate.py` gives the `mosaic __lease-capability` probe +`PROBE_TIMEOUT_SECONDS = 2.0`. On fomo-lin the CLI answers CORRECTLY in **~2.55–2.61s +every run** (Node startup cost). Timeout → fail-closed → every bare `mosaic claude` +launch aborts (exit 65) with an error blaming "mosaic not on PATH … framework/CLI version +skew" — neither true. Invisible on fast dev boxes; fatal on laptops. Suggest: raise/make +configurable the timeout, warm-probe cache, and split the three failure causes into +distinct messages. Local workaround (documented, removable): +`MOSAIC_LEASE_VERSION_PROBE_COMMAND` pointed at a script emitting the verified payload +instantly (`~/.local/bin/mosaic-lease-probe-fast`). + +### F10 — shipped lease-broker unit is never installed → registration denied + +With F9 bypassed, launch dies with "Mosaic lease broker registration failed; runtime +launch denied": the broker daemon isn't running, and although the framework SHIPS +`systemd/user/mosaic-lease-broker.service`, nothing installs/enables it. +`systemctl --user link` + `enable --now` of the shipped unit → READY instantly, launch +proceeds. Installer/init/wizard should own this step. + +### Observations (not filed as findings) + +- Launcher settings audit demands `mutator-gate.py` while init refuses to wire it — + main's components disagree about the gated state (fold into #1113/F4). +- Seat context: runtime contract injected ✓; SOUL.md NOT injected (seat confirmed) — + matches AGENTS.md read-on-demand load order, but README says the launcher "checks for + SOUL.md". Question for lead, not a finding. +- `--ref next` install path verified available (flag exists, next archive HTTP 200) — not + exercised; fomo-lin stays main-as-shipped per lead ruling. + ## Next -- `mosaic init` (SOUL.md) + first seat launch via `mosaic claude` → milestone comms to fred. +- Milestone comms sent at: install complete ✓ / first seat launched ✓. - First gated-seat probe deliberately deferred until PR #1109 lands (known deny-only state).