digraph nvi { rankdir=TB; bgcolor="#161b22"; fontname="JetBrains Mono"; fontcolor="#c9d1d9"; node [ shape=box, style="rounded,filled", fillcolor="#21262d", color="#30363d", fontname="JetBrains Mono", fontcolor="#c9d1d9", fontsize=11, ]; edge [color="#8b949e", fontname="JetBrains Mono", fontcolor="#8b949e", fontsize=10]; user [label="user question", fillcolor="#1f6feb", fontcolor="#ffffff"]; subgraph cluster_l3 { label="L3 — Plan"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; plan [label="planner\n(1 LLM call → ordered Analyses)"]; } subgraph cluster_l2 { label="L2 — Analyses (mini-agents)"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; direct [label="direct_answer\n(CoT, one shot)"]; compare [label="compare_periods\n(CoT, 2 periods)"]; drill [label="drill_down\n(ReAct loop)"]; planned [label="find_outliers · correlate\n(planned)", style="rounded,filled,dashed", fontcolor="#6e7681"]; } subgraph cluster_l1 { label="L1 — Atomic actions (deterministic, no LLM)"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; compose [label="compose(pick, recon)\n→ SQL"]; exec [label="execute_sql\n→ rows"]; } subgraph cluster_l0 { label="L0 — Recon + dataset setup (foundation)"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; recon [label="recon\nknowledge graph"]; setup [label="schema_docs.yaml · metrics.yaml\nencodings · DDL extract", fontcolor="#8b949e"]; } warehouse [label="Postgres\nBIRD financial", fillcolor="#388bfd33"]; langfuse [label="Langfuse (lng, WG)", fillcolor="#bf4b8a33", fontcolor="#ffffff"]; synth [label="synthesize\nfindings → answer"]; // General → specific flow. user -> plan; plan -> direct; plan -> compare; plan -> drill; direct -> compose [label="typed Pick"]; compare -> compose; drill -> compose [label="typed Pick"]; drill -> drill [label="iterate on results", color="#bf4b8a", fontcolor="#bf4b8a"]; compose -> exec; exec -> warehouse; direct -> synth; compare -> synth; drill -> synth; // L0 is consulted by every layer above (not a one-way cascade). setup -> recon [label="make recon"]; recon -> plan [style=dashed, label="brief names", constraint=false]; recon -> compose [style=dashed, label="columns · joins · metrics", constraint=false]; // Observability. plan -> langfuse [style=dotted, label="spans"]; compose -> langfuse [style=dotted]; exec -> langfuse [style=dotted]; }