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.