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

nordisk/dwarves

.nornir/funnel-live-graph.md

Funnel — the live, growing plan-DAG graph

While a user funnels ideas, a graph must render and grow in real time: each idea insert adds a few nodes to the plan-DAG and the user watches it build. From the original ask — "draw a graph in the funnel pane so one can see the DAG growing."

Current state

Surface Graph? Grows on insert? Layout
nornir funnel tab (src/viz/funnel_tab.rs) ✅ egui-snarl 2D DAG (+ funnel3d.rs) ✅ yes, live CentralPanel = the DAG canvas · SidePanel::right("funnel_history") = intake history
dwarves funnel pane (nornir-funnel-embed) ✅ facett-plandag DAG ✅ live auto-poll (~1.5 s) + submit strip submit strip (idea|error) atop the DAG; ⟳ Refresh + ●live/⏸ toggle; growth-history trail (history · N samples · peak M · +K grown + node-count → trail) under the frame

How nornir grows it live (the real path — reuse this)

Submit button → submit_intake() → invalidate() (loaded=false, view=None, built_for=None). Next frame: load_view() re-reads the funnel from the warehouse, runs promote_ready() (derives the Pending→Ready frontier), rebuilds the graph via build_snarl(&plan) when the plan changed. Net: every submit / generate_plan re-derives and re-renders the DAG — the mother idea node appears on submit, the child task nodes appear on generate_plan, and readiness lights up. That is the "grows as you funnel" behaviour, already working in nornir.

Target layout (both surfaces)

┌───────────────────────────────┬───────────────────────────┐
│  intake strip                 │   LIVE plan-DAG            │
│  ( 💡 idea / 🐞 error + Submit)│   (grows per insert;       │
│  history list (newest first)  │    new nodes light up)     │
│                               │   ⤷ mini-graph inset when   │
│                               │      space is tight         │
└───────────────────────────────┴───────────────────────────┘

Grow-on-insert

The plan-DAG points INTO the system-DAG (the super-graph = the warehouse)

A plan node is work to do on something that exists. So each plan node should anchor into the system-DAG — the SCIP/deps graph (symbol_facts/call_edges) — with a badge or edge to the anchored symbol (funnel/decompose.rs::CodeIndexRetriever already produces those Anchors for the model-free planner; the --llm planner's anchors are still empty — the "LLM proposes → RAG anchors" merge, tracked in the-two-dags.md).

The super-graph that spans binary/function → module → system → infrastructure is the warehouse itself (working name Yggdrasil — the world-tree spanning realms, cosmos to root). plan-DAG (what to build) sits on top of system-DAG (what exists), both in the one historized warehouse. If a layer of that span is missing from the warehouse, it must be added — see the-two-dags.md and the nornir warehouse schema. *(Naming

EXISTS vs GAP

Two more interactions

1. Click-to-Yggdrasil linking

Clicking a plan-DAG node draws connective lines from that node down into the super-graph (Yggdrasil = the system-DAG) and highlights the node's anchored symbols — its RAG Anchors (funnel/decompose.rs::Anchor → symbol_facts/call_edges files & functions). Effect: "this task touches THESE functions/files." Reuse the anchor data already carried on plan nodes; light the anchored symbols in the DepGraph/CallGraph/Metro view and draw plan-node → symbol edges.

2. Idle auto-rotate (screensaver)

After N seconds of no interaction, the graph slowly auto-rotates to show the DAG off; any input stops it immediately. funnel3d.rs already has an auto-rotate toggle ("Auto-rotate (drag the cloud to grab the yaw)") — extend it to be idle-triggered (reset an idle timer on any pointer/key event; start rotating past the threshold, halt on the next event). Applies to the 3D cloud; the 2D snarl can gently pan/orbit its layout as the mini equivalent.