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)"]; } subgraph cluster_l2 { label="L2 — Analyses (mini-agents)"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; compare [label="compare_periods\n(CoT)"]; drill [label="drill_down\n(ReAct)"]; outl [label="find_outliers\n(CoT)"]; corr [label="correlate\n(plan-and-execute)"]; } subgraph cluster_l1 { label="L1 — Tools (deterministic)"; color="#30363d"; fontcolor="#58a6ff"; fontsize=11; t2s [label="text_to_sql"]; exec [label="execute_sql"]; schema [label="retrieve_schema"]; py [label="python_sandbox"]; } warehouse [label="Postgres\nBIRD financial", fillcolor="#388bfd33"]; langfuse [label="Langfuse (lng, WG)", fillcolor="#bf4b8a33", fontcolor="#ffffff"]; synth [label="synthesize\nfindings → answer"]; user -> plan; plan -> compare; plan -> drill; plan -> outl; plan -> corr; compare -> t2s; drill -> t2s; outl -> t2s; corr -> t2s; drill -> schema [style=dashed]; corr -> py [style=dashed]; t2s -> exec; exec -> warehouse; compare -> synth; drill -> synth; outl -> synth; corr -> synth; plan -> langfuse [style=dotted, label="spans"]; compare -> langfuse [style=dotted]; exec -> langfuse [style=dotted]; }