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

nordisk/dwarves

.nornir/the-two-dags.md

The two DAGs — the System-DAG (what IS) and the Plan-DAG (what to DO)

nordisk carries two graphs in one Iceberg warehouse, both historized (time-travel): the System-DAG (code intelligence over all sources + deps, from SCIP) and the Plan-DAG (the funnel: idea → plan → task nodes). The planner grounds the Plan-DAG on top of the System-DAG via RAG.

Plan-DAG (funnel)     idea → plan → task-node → task-node        ← what to DO
                          │ RAG grounds each node on ↓
System-DAG (SCIP)     symbol_facts ──call_edges──▶ symbols · dep_graph_edges   ← what IS

1. System-DAG — the code-intelligence graph (EXISTS)

Built by ingesting SCIP (rust-analyzer) over every member's sources + deps, on each monitored HEAD move.

Aspect Real names
Ingest src/knowledge/scip.rs (ingest_index, ingest_via_rust_analyzer, ScipScan, ScipRow, scip_call_edges) · src/knowledge/ra_ingest.rs (ingest_in_process, feature ra-ingest) · driven from src/monitor.rs::resolve_member_scip (deep-scan on HEAD change)
Query view src/knowledge/query.rs → KnowledgeView (symbols + calls)
Warehouse tables (Iceberg) symbol_facts · call_edges · knowledge_scans · architecture_wiring · clone_events (TABLE_CLONE_EVENTS) · dep_graph_edges (TABLE_DEP_GRAPH_EDGES) · build_provenance · coverage/surface_coverage · release_changes/release_events
Viz tabs DepGraph · CallGraph · Architecture · Metro (+ Helix · Bloodstream) · Knowledge · Warehouse · WarehouseDeck
Historized? ✅ Iceberg. Rows carry *_snapshot_id / dep_graph_snapshot_id / scanned_at_micros → versioned per scan; browsed via the TimeTravel tab.

2. Plan-DAG — the funnel (event-sourced)

Aspect Real names
Model funnel-core (state::Funnel, plan_dag::PlanDag, promote_ready)
Events IdeaSubmitted · IdeaTriaged · PlanCreated · NodeAdded · EdgeAdded · NodeStatusChanged · RunRecorded · PlanStatusChanged · IdeaModeSet · CardAssigned · CardStateChanged
Table funnel_events (src/warehouse/iceberg_schema.rs::funnel_events, wide/typed; only params_json is JSON) — one row per mutation
Store src/funnel/store.rs (loads/replays funnel_events)
Viz tabs Funnel (+ Funnel3D)
Historized? ✅ Event-sourced — each append is its own Iceberg snapshot (src/warehouse/funnel.rs), so the DAG's whole history replays / time-travels natively.

3. The bridge — RAG grounding (Plan-DAG ⟂ System-DAG)

The planner decomposition anchors plan subtasks in the System-DAG: src/funnel/decompose.rs::CodeIndexRetriever reads the KnowledgeView (symbol_facts + call_edges) and returns Anchors (file/fn/score) → each Subtask is grounded on the concrete symbol it touches. This is the model-free leg; the --llm planner (llm_decompose_prompt/decomposition_from_llm_reply) proposes the structure and the same anchors ground it.

Executor use of the System-DAG (future): an executor Claude working a node can query the System-DAG for impacted symbols + callers (call_edges) to scope the edit and to verify blast-radius after — the compiler-oracle (CodegenJudge) plus the call-graph give accept/reject grounded in what actually exists.

Bottom line

Both DAGs are Iceberg-historized / time-travelled: the System-DAG by per-scan snapshots, the Plan-DAG by event-sourcing (append = snapshot). The funnel planner sits on top of the System-DAG through the CodeIndexRetriever RAG bridge.