Airport Investment Intelligence Agent

Live system map · source of truth: docs/architecture.md, ADR-001/002/003/004, services/agent/graph.py

Tiers

Dashed + faded = planned, no code yet. A badge names anything not yet deployed. Everything else runs today.

—

What it does

Technical

Decision record

Status

Drag to orbit · scroll to zoom · right-drag to pan
Click any node for detail · zoom in for more labels

3D view unavailable

Your browser could not start WebGL. The architecture in text:

User (browser)
 |
 +-- Next.js chat UI, apps/web            [built; Vercel deploy planned]
 |     +-- Clerk sign-in + Cloudflare Turnstile
 |     +-- airport.guydvorkin.com -> Vercel CNAME                [planned]
 |
 +-- Cloud Run (europe-west3) - FastAPI + LangGraph agent    [LIVE]
 |     |  POST /chat (SSE stream)
 |     |
 |     |  START -> agent -> route() -> tools -> agent -> ... -> END
 |     |    agent node : one LLM call per turn, tool-bound
 |     |    tools node : runs tools concurrently, lifts assumptions into state
 |     |    checkpointer: AsyncPostgresSaver -> Neon
 |     |
 |     +-- tools: rank_airports, compare_airports, airport_metrics,
 |     |          unmet_demand_estimate, resolve_airport,
 |     |          investment_context, faa_live_status
 |     +-- Langfuse traces
 |
 +-- Neon Postgres
 |     tables: airports, regions, bts_t100, bts_ontime, airport_financials
 |     views : v_airport_metrics, v_congestion, v_opportunity_score,
 |             v_unmet_demand_est, v_carrier_concentration, v_roi_proxy
 |     state : LangGraph checkpoints  |  queries log table
 |
 +-- OpenRouter - AGENT_MODEL=anthropic/claude-sonnet-4.5
                  fallback default openai/gpt-4o-mini

Ingestion (snapshot-first): BTS T-100 + BTS on-time + OurAirports/FAA -> Neon
Live (not snapshotted): FAA NAS status feed - faa_live_status only, 5-min cache