Your AI Agent Graph Compiles. That Doesn't Mean It's Correct. A developer demonstrated that TypeScript's type system cannot catch structural bugs in multi-agent workflow graphs, using a LangGraph contract-processing example where a fast-track route reaches a publish node without ever producing the required compliance approval. Because the approval field is typed as optional and the publish node uses a non-null assertion, the code compiles cleanly but throws at runtime. The developer argues that guaranteeing required data exists on every execution path is a dataflow analysis problem that static graph analysis, not type checking, must solve. Why TypeScript can't catch certain bugs in multi-agent workflows — and what static graph analysis can do about them. TypeScript catches a remarkable number of mistakes before an application ever runs. Incompatible types, incorrect arguments, missing properties — the compiler handles these pretty well. But when building complex AI workflows, there's a problem that TypeScript alone can't solve: Every component in a graph can be correctly typed while the graph itself is structurally incorrect. I'm not talking about LLM hallucinations, unreliable prompts, or model nondeterminism. I'm talking about ordinary engineering bugs caused by how execution paths connect. Let's look at a concrete example. Imagine a contract-processing system. Before publication, each contract must pass a compliance review. The system also supports a fast-track route that skips part of the normal processing. The workflow looks like this: Start | Triage | +-------+-------+ | | Normal route Fast track | | Compliance Review | | | +-------+-------+ | PublishContract At first glance, this seems reasonable. Except there's a problem. PublishContract requires a compliance approval, but the fast-track route skips the component that produces it. In other words, there is a reachable execution path where required input data is never created. What does TypeScript think about this? Let's use a conventional LangGraph StateGraph . First, define the shared state: js import { Annotation, StateGraph, START, END, } from "@langchain/langgraph"; interface ContractDraft { contractId: string; summary: string; fastTrackRequested: boolean; } interface ComplianceApproval { reviewer: string; certificateId: string; } const State = Annotation.Root { draft: Annotation