THE COUNTERFACTUAL

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

Blue Team · builds & defends
3 The Model

A structural causal model with known coefficients

Z := u_z X := a·Z + u_x Y := b·X + c·Z + d·X·Z + u_y a=0.5 b=2.0 c=1.5 d=0.8

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.

5 The Lineage

Rung 3 of Pearl's Ladder

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.

7 The Witness

Live re-check

Re-runs the full selfcheck against the pure engine on every tamper. Green = all identities hold. Flips red the instant abduction is skipped.

The Machine
4 in ↓

Data In · the factual evidence

unit A observed  
Z = 1.0   X = 1.0   Y = 4.6

A complete observation of one unit. We do not yet know its noise — that is what abduction is for.

↓ ABDUCT ↓
0 LIT  the engine

Abduction → Action → Prediction

u_z = Z = … u_x = X − aZ = … u_y = Y − bX − cZ − dXZ = …
do(X = x') 3.0
had X been 3.0, with THIS unit's fixed noise…
Yx'(u) = …
closed form   Yx'(u) = y + (x'−x)(b + d·z)  ·  consistency (x'=x)→y:
↓ PREDICT ↓
8 out ↓

Data Out · the proven verdict

The individual counterfactual carries this unit's own noise — it is not the population answer E[Y|do(x')], shown live in window 1.

Red Team · attacks & breaks
1 The Adversary

“Just use the interventional average.”

WALL The population answer is a different question. By Monte-Carlo (fixed seed, N=200k) the interventional mean is E[Y|do(X=3)] ≈ …. The individual counterfactual for unit A is — a real gap the average cannot recover, because it has averaged this unit's noise away.
2 The Graveyard

Claims that died here

“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.

6 The Tamper

The disclosed planted void

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.

state: abduction ON