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).
|
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`).
|
- 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
|
## 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).
|
- First gated-seat probe deliberately deferred until PR #1109 lands (known deny-only state).
|
||||||
|
|||||||
Reference in New Issue
Block a user