Read independence off the picture. On a causal graph, three shapes carry all the news: a chain A→B→C and a fork A←B→C both pass dependence — until you condition on the middle. A collider A→B←C does the opposite: it blocks — until you condition on it (or a descendant), which opens it. d-separation turns the arrows into testable claims: block every path and the two ends are provably independent in every distribution the graph can generate.
source Judea Pearl, Probabilistic Reasoning in Intelligent Systems: Networks of Plausible Inference, Morgan Kaufmann (1988), ch. 3 — archive.org/details/probabilisticrea00pear. Rendered, not quoted.
Every path is built from triples. A triple a—m—b is read by the arrows meeting at its middle m:
| junction | shape | open when… |
|---|---|---|
| chain | a→m→b | m ∉ Z |
| fork | a←m→b | m ∉ Z |
| collider | a→m←b | m or a descendant ∈ Z |
A path is active only if every junction on it is open. X and Y are d-separated given Z iff no active path survives. That is the whole criterion — and each verdict is provable against the joint.
the-causal-graph hangs the arrows: who listens to whom. But arrows alone are a picture. d-separation is the syntax that reads that picture as a list of testable independence claims — the exact set of correlations the data must and must not show.
It is the hinge from drawing to falsification: a claim the arrows make about the world, checkable in any dataset. Each sphere is the next one's premise.
The blue team's live check: re-run d-separation over all 80 triples and confirm each verdict against the numeric partial correlation of the fixed linear-Gaussian joint. If red tampers with the collider rule, this badge is where it shows.
A fixed DAG on five variables, with a fork at A, a collider at D, a chain D→E, and E a descendant of the collider:
Each node is a real structural equation, noise ~ N(0,1): B=0.7A+ε, C=0.5A+ε, D=0.6B+0.8C+ε, E=0.9D+ε. Those coefficients fix a joint distribution — the ground truth every d-separation claim below is checked against.
Z is the set you condition on. Toggle any nodes (never X or Y). The verdict is computed live from the three-junction rule on every path — never looked up.
What the machine proves: for every one of the 80 triples (X,Y,Z), d-separation's verdict matches the joint exactly — partial correlation zero to 1e-9 when d-separated, clearly nonzero when d-connected. And the graph identifies cause: the back-door set {A} recovers the true effect of B on D, 0.600, where the naive slope is confounded to 0.788.
The blue team's witness (left) re-derives these live; the red team (right) tries to make them lie.
It also assumes the Markov condition: no hidden common cause outside the drawn nodes. Add a latent confounder and the honest tool is not d-separation but its bidirected cousin, the ancestral graph. d-separation is exact for the graph you drew — not for the one you forgot.
"Conditioning always removes dependence." Cut. Conditioning on a collider (or its descendant) creates it — B and C are independent until you condition on D or E. Selection bias, mechanized.
"Correlation zero means the arrow is absent." Cut. A cancelling path can zero a correlation with the arrow fully present (unfaithfulness). Absence of dependence is weaker than absence of edge.
"d-separation gives you the causal effect." Kept, corrected. It gives independence claims. To get an effect you still need a back-door/adjustment set — shown live in DATA OUT.
The red team's move: invert the collider rule — treat a collider as open when unconditioned and blocked when conditioned. Now the graph's verdicts contradict the actual independencies. The witness (window 7) is watching.
Flip it and B⟂C reads backwards: d-separation now disagrees with the joint on real triples. The witness recomputes all 80, finds the mismatch, and turns red. Nothing is faked; the attack is real and it is caught.