Handbook
Self-Host Gap Assay
Recommendation vocabulary (current state): Manual self-hosting available now · Lenses-visible self-hosting was blocked by M1/M2 gaps until this slice ships · Automated self-hosting (agent loop without human Composer)…
Assay questions
-
Can a ForgeRun be created from a static sample?
Yes.samples/forge_run.sample.jsonand the correlated bundle undersprints/selfhost-alpha/samples/provide copy/paste and validation targets (scripts/validate_selfhost_chain.py). -
Can a ForgeRun represent intent, approval, workcell activity, LCDL/Fleet placeholders, EvidencePacket, and decision state?
Yes in static JSON. The selfhost sample chain includesApprovalRequest,AgentRun(local_runner),WorkcellResult,LCDLTraceSummary(skipped placeholder),FleetJobSummary(unknown placeholder),EvidencePacket, decision on the ForgeRun, andfollow_on_sparks.json. -
Can Lenses currently render or ingest that sample? If not, what was missing?
Before this change: only React presentational primitives existed; there was no file-backed import of.forge/runs/*.
After this change:GET /api/project/<slug>/forge-runslists and loads run bundles from the workspace child repo. -
Can a safe local run be represented without Fleet?
Yes.scripts/selfhost_runner.pydispatches allowlisted actions only; no Fleet job IDs are required for alpha (Fleet remains placeholder evidence). -
Can a whitelisted local script produce EvidencePacket output?
Yes. Runner writeslocal-runner/result.json;scripts/selfhost_import_evidence.pymerges summaries intoevidence/evidence_packet.jsonand updatesforge_run.jsonevidence status. -
Can human approval be represented before execution?
Yes.approvals/<approval_id>.jsonmust bestate: approvedand theactionfield must gate the requestedaction_id. -
Can follow-on Sparks be produced from evidence?
Partially. Static sparks ship infollow_on_sparks.json/evidence_packet.follow_on; importer appends aSPARK-IMPORTED-FROM-RUNentry for automation smoke. Native Studio Spark editor is still out of scope. -
What must stay out of scope for alpha?
Raw shell from Studio, Hermes/Factory/OpenClaw orchestration, full Fleet execution, live LCDL traces, arbitrary auto-patches, chat-only approvals.
Current state
- Schemas through v1 including LocalRunnerAction/Result.
- Static chain validates;
scripts/check_foundation.pyenforces samples + chain. - Local runner + importer implemented; run store documented.
Blocking gaps (residual)
- Policy / RBAC: Lenses forge-run writes (decision transitions) remain minimal; production hardening needs review.
- CI wiring: Optional follow-up to run
check_foundation+validate_selfhost_chainin forge-platform CI explicitly. - Fleet parity: Template mapping from LocalRunner actions is documentation-only until R4.
Fastest path
- Keep
.forge/runs/seeded fromsprints/selfhost-alpha/fixtures/for demos. - Run
python3 scripts/selfhost_runner.py … check_foundationthenpython3 scripts/selfhost_import_evidence.py. - Open Lenses Studio on the workspace that lists forge-platform as a child → Forge Platform run nav.
Required files (inventory)
| Area | Path |
|---|---|
| Schemas | schemas/local_runner_action.v1.schema.json, schemas/local_runner_result.v1.schema.json |
| Samples | samples/approval_request.sample.json, samples/local_runner_*.sample.json |
| Chain | sprints/selfhost-alpha/samples/* |
| Runner | scripts/selfhost_runner.py, scripts/selfhost_import_evidence.py, scripts/generate_contract_gap_register.py, scripts/validate_selfhost_chain.py |
| Docs | docs/selfhost-run-store.md, roadmap updates, sprint charge.md |
| Lenses | lenses/platform_selfhost_runs.py, API + Studio route |
Suggested next prompt
Run Composer 21-selfhost-alpha-architecture.md (from the bundled pack) for Architecture Versona review of Fleet migration and ID correlation, then 24-m2-lenses-selfhost-control-plane.md for UX copy on decision transitions.
Current state (summary)
Ready for local demos; Hermes not required.
Blocking gaps (summary)
Hardening RBAC writes and CI automation.
Fastest path (summary)
Fixture → runner → importer → Lenses.
Required files (summary)
See table above.
Suggested next prompt (summary)
Composer 21 then 24 as above.