Three numbers
Between pads (the naive regression): more neighbouring withdrawal correlates with more production. Operators drill good rock tightly — any spacing study that ignores this inherits the confound and gets the wrong sign.
Within pads (rock held fixed): the same relationship measured across 4,858 wells on 1,416 multi-well pads flips to negative [95% CI −11.4 to −0.5]. The natural experiment recovers the physics.
Counterfactual penalty: the model’s median within-pad crowding cost, in points of peer-median pace [p25/p75 +7.3/+31.4]. Economically material, directionally right — and not precise enough to prescribe spacing. The report says so plainly.
reports/within_pad_contrast.md.
The geometry underneath
Everything rests on a deterministic 3-D reconstruction of every horizontal well in Alberta from public directional surveys: 105,724 legs across 65,082 wells, with closest-approach, vertical offset, overlap, and orientation computed between wells and between a well’s own branches — multilateral self-interference, a setting public analyses almost never touch. Every lateral is drawn below.
Each line is one leg, heel to toe (straightened for display). Zoom into the Montney or Clearwater fairways and the pad architecture — parallel fans of sibling laterals — is the between-pad vs within-pad distinction made visible. Two-finger scroll passes through; use ⌘+scroll to zoom.
What survived the gate
The model — two permutation-invariant set encoders (a well’s own legs; its neighbours) predicting calibrated P10/P50/P90 first-year pace — had to beat plain baselines on a temporal holdout opened exactly once, or nothing downstream ships. It passed: P50 MAE 71.6 vs 78.1 for the best gradient-boosting baseline, with test calibration of 12/53/88 against nominal 10/50/90. And the depletion counterfactual behaves like physics, not noise: erase the neighbourhood’s withdrawal history and the predicted penalty grows monotonically with crowding.
reports/counterfactual_summary.md. Monotone in
crowding, ~zero for isolated wells (a hard physics gate).
And what failed is printed, not hidden: the
bare-proximity probe — walk a neighbour from 1,500 m
to 100 m with no withdrawal history — moved the
median prediction barely at all. The model learned
interference through depletion, the channel the data
actually identifies, and not through distance alone. The
evaluation gate records approach FAIL in the
same table as its passes.
The playbook, as it was actually built
The repo is organized as the sequence it was developed in — each phase a runnable stage with its own artifact, so a team with proprietary data can replay it with their inputs:
- 0–2 · Cohort & geometry. Assemble the well cohort from Petrinex production; rebuild every leg in 3-D from AER ST37 surveys.
- 3–5 · Pairing & context. Candidate neighbour pairs, pairwise and intra-well geometry, then time-aware context: who was withdrawing what, when.
- 6–7 · Dataset & baselines first. Leakage-proof design (pad-aware splits, temporal holdout), and plain baselines before any deep model exists.
- 8–9 · Model & the gate. Set encoders, quantile loss; the one-shot test-set opening with physics probes that can veto shipping.
- 10–11 · Counterfactuals & the report. Edit a neighbour set, re-predict, difference; write down everything — including the flattering single-seed numbers that shrank under multi-seed averaging.
Where public data ends
The finish line is drawn honestly: an optimal-spacing
prescription is not deliverable from public data,
because the three inputs that decide it are censored —
pre-window depletion history, frac intensity, and within-pad
geology. WITH_PROPRIETARY_DATA.md maps each gap to the
data category that closes it. If you hold that data, the
machinery above is built for you to drop it in.