greenfield(fomo-lin): session 2 — init + first bare seat; findings F6-F10
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 <[email protected]>
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user