Forge Platform

Lenses API and Studio — Self-Host Alpha handoff

GET /api/project//forge-runs?run_id= — returns the run bundle: forge_run, approval files, evidence_packet, follow_on_sparks, local-runner result when present, and events tail.

Acceptance (S2, M2-lite overlap)

  1. Workspace-scoped read API under forge-lenses/lenses/serve.py:
  2. GET /api/project/<name>/forge-runs — lists run IDs discovered under <workspace_root>/.forge/runs/.
  3. GET /api/project/<name>/forge-runs?run_id=<frun_*> — returns the run bundle: forge_run, approval files, evidence_packet, follow_on_sparks, local-runner result when present, and events tail.

  4. Decision / control (loopback-safe)

  5. POST /api/project/<name>/forge-run-decision — same host-only guards as other mutating Lenses routes; updates forge_run.json decision block for file-backed runs when allowed.

  6. Studio (lenses-enterprise/)

  7. Route and nav entry for the project Forge run page (run id in URL or query).
  8. Uses shared Forge primitives from src/forgesdlc-kitchensink/ (header, status, timeline, decision bar, diagnostic/review panels).
  9. Copy distinguishes local runner output from Fleet placeholder fields on the EvidencePacket.

  10. Docs

  11. HTTP API reference: lenses/website/http-api-and-routes.md (forge-runs endpoints).

Out of scope for this slice

  • Hermes or chat-driven approval at runtime.
  • Remote Fleet execution; Fleet rows remain placeholders on static packets.

Verification

  • Point Lenses at a workspace that contains forge-platform/.forge/runs/<frun_*>/ (or symlink); open Studio → project → Forge run; confirm panels hydrate from JSON files.