← Ledger


title: Phase 5 close — HEARTH (LocalDocker) shipped end-to-end date: 2026-07-02 status: Accepted predecessor: docs/decisions/2026-05-25-phase-5b-close.md spec: docs/specs/2026-05-04-rocky-phase-5.md plan: docs/plans/2026-07-02-console-hearth-wrapper-phase-5d.md phase: 5

Context

Phase 5 opened 2026-05-04 with the design spec landing (docs/specs/2026-05-04-rocky-phase-5.md). Five sub-phases were queued: 5a bootstrap → 5b contracts subpath + Go codegen → 5c LocalDocker driver + RPC binary → 5d console SS-08 wrapper → 5e superproject e2e + close-out. 5a/5b/5c closed sequentially through 2026-06-29. 5d and 5e closed today.

The OSS-parity invariant (spec §11) required that solo + LocalDocker + LocalAuth pass an e2e with no Polar.sh network calls and no devarno-cloud-tenant credentials. This decision records what shipped, what got trimmed, and what carries forward.

Decision

Phase 5 is closed. The SS-08 HEARTH subsystem row in CLAUDE.md and the Phase 5 row in MILESTONES.md flip to closed state.

Delivered:

Scope trims recorded here (deliberate)

Spec §12 described the e2e as spinning up hearth AND rocky serve AND submitting a run over ralph's FastAPI surface. In practice we run ralph's KAHN emitter (rocky.journal.Journal + vendored kahn_emit) directly rather than through rocky serve's HTTP layer:

Spec §11 further mandated the OSS-parity path pass on LocalDocker. The e2e supports LocalDocker via ROCKY_E2E_HEARTH_DRIVER=local-docker but skips when docker isn't reachable. The parent CI e2e.yml job runs the fake driver leg by default; the local-docker leg lands after CAIRNET/LORE image publishing (currently nginx:alpine stand-ins per Phase 5 spec §D6 would need to be swapped for real service images to make the LocalDocker leg meaningful). Filed for the Phase 5-post cleanup.

Consequences

References