Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/dwarves

.nornir/dwarves-embed-live-report-design.md

dwarves — GetRunReport RPC + the dwarves-embed live-forge tab

The last leg of the live-report arc (deferred in 7092669 / fb0e064): the demo Pipeline tab renders an in-process run because the dwarf.v1 wire only carried the parent RunRow summary — no per-step data crossed the network. This work puts the full per-step report on the wire (GetRunReport) and adds a thin embed client (dwarves-embed) that renders a LIVE dwarves-server run on the SAME reused viewer. Additive (the in-process demo path stays), no nornir crate dep (that edge is a cycle: nornir → dwarves already), and it reuses the existing ForgePipelineAdapter.

(1) RunReport on the wire — GetRunReport(run_id)

RunStatus(run_id) returns only the parent RunRow (status/counts/duration). To render a build DAG a client needs each step's status, duration, and — crucially — its needs edges. So dwarf.proto (package dwarf.v1) gains:

Server handler (DwarfSvc::get_run_report)

  1. Find the parent PipelineRunRow by id (store::read_runs) — absent ⇒ NotFound (parity with RunStatus).
  2. Read the run's step rows with the new store::read_steps(warehouse, run_id) (the per-step twin of read_runs; steps.jsonl was already persisted by append_history, only a reader was missing — no new persistence).
  3. Recover the needs edges by rebuilding the Dag from the still-registered pipeline (registry → Dag::build), mapping step → needs. If the pipeline is no longer registered (or the DAG won't build), needs default empty — the per-step rows still cross and the viewer tolerates missing edges (a clean degrade, never an error).
  4. Emit RunReport { run, steps }, each BuildRow carrying its needs.

Bearer-gated by the SAME shared nornir_service::auth_interceptor as every other RPC.

(2) dwarves-embed — the live-forge Panel (backend (2))

A NEW leaf crate, the reusable <guest>-embed shape (nornir-funnel-embed is the template):

dwarves-gui mounts it as an additional native tab — Forge (live) — beside the in-process Pipeline tab (additive; wasm keeps the single Forge panel).

Why this shape

Deferred