Single sequential pass per query — geocode, then nine specialists
in dependency order (flood layers first because they're the cheap
spatial joins; live API calls grouped after; RAG last because it's
the slowest). State accumulates into a flat dict the reconciler
then turns into doc-role messages.
agent.py is the CLI entrypoint that runs the FSM end-to-end and
prints the reconciled paragraph + per-step trace, used as the
quickest end-to-end smoke test before bringing up the web layer.