What would have happened — not on average, but for the very unit we already saw. The engine runs abduction → action → prediction: read this unit's hidden noise off its evidence, splice in do(X=x'), then push the same noise through the surgery. Rendered, not quoted.
source Pearl, Causality: Models, Reasoning, and Inference (Cambridge, 2000), ch.7 — structural counterfactuals · archive.org/details/causalitymodelsr0000pear
Every arrow is a deterministic function of its parents plus a private exogenous noise. The d·X·Z interaction is deliberate: it makes X's effect depend on Z, so the counterfactual is unit-specific, not one number for everyone.
seeing → doing → imagining
Above the-do-calculus (rung 2: intervening, P(Y|do(x))) sits this — the “what if it had been otherwise, for this one.” It is the rung that assigns blame, credit, and regret: quantities the interventional average cannot see because they are counterfactual to a fact that already occurred.
Re-runs the full selfcheck against the pure engine on every tamper. Green = all identities hold. Flips red the instant abduction is skipped.
A complete observation of one unit. We do not yet know its noise — that is what abduction is for.
The individual counterfactual carries this unit's own noise — it is not the population answer E[Y|do(x')], shown live in window 1.
“Counterfactuals aren't testable, so they aren't science.”
→ In an SCM they are point-identified functions of the model + evidence; every value below is exact to 1e−9.
“Two units with the same X and Y must have the same what-if.”
→ False under effect modification: A and B share (X=1,Y=4.6) yet differ in Z, so their abducted noise — and their counterfactuals — differ.
“do(X=x') with x'=x might change Y.”
→ No — consistency is a theorem: setting x' to the observed x reproduces the observed y exactly.
Skip the abduction step — draw fresh noise instead of inferring this unit's u_y. The counterfactual detaches from the unit; consistency (x'=x→y) breaks. The Witness in 7 catches it live.