diff --git a/docs/reports/greenfield/fomo-lin.md b/docs/reports/greenfield/fomo-lin.md index 43f8436c..b718d0ae 100644 --- a/docs/reports/greenfield/fomo-lin.md +++ b/docs/reports/greenfield/fomo-lin.md @@ -291,3 +291,38 @@ prevent-memory-write blocked an operator write), and the F9 probe shim sits in Not executed yet — current install (next lane + prototype) is the substrate Fred's W-F1 fixtures target. First full cycle runs when the next testable artifact lands. + +## Session 6 (2026-08-08 night) — promotion-branch E2E (Fred-directed, first fomo-lin full E2E) + +Branch feat/lease-promotion-and-harness-isolation (rebased on next), built from source +(pnpm --filter '@mosaicstack/mosaic...' build), CLI packed + installed globally, branch +framework installed to ~/.config/mosaic. Transcript: +scratchpad/promote-e2e-transcript.md. Verdict: **BLOCKED at step 3, NOT VERIFIED (not faked).** + +Findings this session (all filed under scooby's own Gitea account): + +- **#1123** — TS activation capability probe hardcodes a 2000ms timeout; `node cli.js + __lease-capability` cold-start on fomo-lin is 5.1–5.5s, so `leaseEnforcementActivatable()` + returns false and the gate REFUSES to wire via the sanctioned path. The Python-side + F9/#1118 override does NOT apply to this TS probe. Worked around by bumping only the + installed dist timeout (reversible; can't mask a bad capability). +- **LIVE WEDGE (F4 reproduced, un-recoverable):** hand-wiring the gated template into a live + BARE session's own runtime home hot-reloads the gate and bricks the session with + GATE_UNAVAILABLE (no lease). Every self-recovery path is closed (Bash/Read gated; + Write/Edit blocked by stale-guard needing a gated Read). Required an EXTERNAL shell to + restore settings. Exactly HARNESS-HOMES' "a live unpromoted session that gains the gate + cannot self-recover." Lesson applied: gated seats must be a SEPARATE mosaic claude process + in its own CLAUDE_CONFIG_DIR (~/.config/mosaic/.claude), never the operator's ~/.claude. +- **#1124 — the critical link, proven to fail:** `mosaic promote` transport reads the lease + session id from `pane_pid`'s /proc/environ, but `execRuntime()` (launch.js:883) uses + `spawnSync` (NOT the exec-replace its own comment claims), so pane_pid = node(mosaic) + [no lease env] and the lease env is on the claude CHILD. resolve() never walks to the + child → 'no readable lease session' → UNVERIFIED exit 1, before injection. Fails for every + real `mosaic claude` seat; unit tests pass only via a mocked environmentReader. This is + the exact link terra couldn't test (detached pane). + +E2E scorecard: Step 1 (build/install) PASS. Step 2 (gated seat, real lease, mutator DENIED +MUTATOR_UNVERIFIED, file not created) PASS. Step 3 (promote → VERIFIED) BLOCKED (#1124). +Steps 4–5 not reached; failure-path sub-case (unresolvable seat → UNVERIFIED exit 1, no +hang) incidentally confirmed. The branch does NOT pass E2E on a real host as-is; #1124 gates +its merge.