Three numbers
The high-grading trap. Compare wells across an asset and more neighbouring withdrawal correlates with more production. That isn’t physics — it’s development behaviour. Operators high-grade: the best rock gets the tightest spacing, so crowding becomes a proxy for rock quality. Any spacing study built on cross-asset comparison inherits this and reports interference with the wrong sign.
Same-pad siblings tell the truth. Wells on one pad share rock, vintage, and completion era — so comparing only pad-mates removes geology from the question. Across 4,858 wells on 1,416 multi-well pads, the slope flips negative [95% CI −11.4 to −0.5, cluster-bootstrapped by pad]. That is interference, isolated the way a field trial would isolate it.
The what-if price. Ask the trained model “what would this well have done without its pad-mates?” and the median answer is a 16.7-point crowding penalty on first-year pace, relative to peers [p25/p75 +7.3/+31.4]. Material money, right sign — and, on public data alone, too uncertain to set spacing with. The report says so in as many words.
reports/within_pad_contrast.md.
The geometry underneath
Everything rests on the same kind of 3-D wellbore reconstruction a drilling team runs for anti-collision — except province-wide, from the public record. Alberta publishes the directional surveys operators file (AER ST37), and from them this pipeline rebuilds 105,724 laterals across 65,082 horizontal wells deterministically: true closest approach in 3-D, TVD offset, lateral overlap length, and relative azimuth, computed well-to-well and leg-to-leg within multilaterals. That second part matters: in the Clearwater and other heavy-oil fairways, multi-leg fishbone wells drain against their own branches, and almost no public analysis quantifies it. 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.
The model, in reservoir terms
Forget the architecture diagram for a moment and think about how an experienced engineer forecasts a new well: look at the offsets. Which wells are nearby, how close do they run, how much have they already withdrawn, how long have they been on. Then weigh them — a parallel lateral 150 m away that has produced hard for three years counts for a lot; a distant toe-to-toe neighbour counts for little. The model does exactly this, except the weighting is learned from 65,000 wells instead of hand-built.
The machinery that does the weighing is a set encoder — and the name is less exotic than it sounds. An offset list has no natural order and no fixed length: one well has two neighbours, another has thirty. A set encoder is a network built to accept exactly that kind of input — each offset described by its geometry (closest approach, TVD offset, overlap, azimuth), timing, and withdrawal history — and compress the list into a summary, learning which offsets deserve attention. Think of it as a drainage-weighted offset summary where the weights came from data rather than judgment. There are two of them: one over the well’s neighbours, one over its own legs, so a fishbone’s self-interference is priced by the same mechanism.
The output is deliberately in the industry’s native uncertainty language: P10/P50/P90 of first-year production pace, expressed relative to peer wells in the same play and vintage. Not a single-number type-curve multiplier — a band. And a band is only useful if it’s honest: on wells the model never saw, actuals fell below its P10 12% of the time, below its P50 53%, below its P90 88% — against the nominal 10/50/90. That’s the property reserves bands are supposed to have and often don’t.
What survived the gate
Before any of its output counts, the model had to pass a blind lookback — the ML term is a temporal holdout. The newest wells were sealed off during all development and opened exactly once, the way you’d grade last year’s forecast against this year’s actuals: no peeking, no second attempt, and a pre-registered rule that if the model lost to simpler methods, nothing downstream ships. It won — median forecast error of 71.6 points vs 78.1 for gradient boosting, the strongest of the conventional tabular-ML baselines — with the calibration above.
It also had to behave like a reservoir, not a curve-fit. The counterfactual machinery works like a what-if run: re-forecast the same well with its offsets’ withdrawal history erased, and the difference is the interference price. That price is near zero for isolated wells and grows monotonically with crowding — a hard physics gate the model passed.
reports/counterfactual_summary.md. Monotone in
crowding, near zero for isolated wells: the model behaves
like drainage, not like a curve-fit.
And what failed is printed, not hidden. One probe
walks a hypothetical offset in from 1,500 m to
100 m with no production history — an
undrilled permit next door, in effect — and the
forecast barely moves. Reservoir intuition says it
shouldn’t move much (an undrained neighbour
hasn’t taken your oil yet), but it also flags what the
model can’t see: frac-hit risk from a future
completion nearby, because public Alberta data carries no
completion design at all. The model learned interference
through depletion — the channel the data
actually identifies — not through bare distance, and
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 producing-well cohort from Petrinex volumetrics; rebuild every lateral in 3-D from the AER ST37 directional surveys.
- 3–5 · Offsets & timing. Candidate offset pairs, pairwise and leg-to-leg geometry, then the timeline that matters for interference: who was withdrawing what, when, relative to each well’s first production.
- 6–7 · Dataset & baselines first. The anti-fooling design: pad-mates never split across train and test (they’d leak shared geology), the newest wells sealed for the blind lookback, and simple benchmark models fitted before any neural network exists, so there’s something honest to lose to.
- 8–9 · Model & the gate. The set encoders and P10/P50/P90 forecast; then the one-shot opening of the sealed wells, with physics probes empowered to veto shipping.
- 10–11 · What-ifs & the report. Edit an offset list, re-forecast, difference — and write down everything, including the flattering first-run numbers that shrank when the training was repeated from different random starts and averaged.
From playbook to well planner
The finish line is drawn honestly: an optimal-spacing prescription is not deliverable from public data alone. Three inputs that decide the answer are censored from the public record, and each maps to a specific failure you can see in the results above:
- Full production histories. Petrinex’s free window is a rolling ~5 years, so a 2015 parent’s early drawdown — the depletion that actually hits a 2023 child — is invisible. The model prices depletion it can see; it can’t price what the window censors.
- Completion design. Tonnage, stages,
fluid, intensity — none of it is in the public
Alberta record. This is precisely why the model reads
crowding through depletion rather than geometry: without
frac data it cannot distinguish a tightly-spaced pad from
a frac-hit waiting to happen. The
approach FAILabove is this gap, measured. - Within-pad geology. Tops, logs, mapped reservoir properties. The within-pad trick removes geology by holding it fixed; with actual geological data the model could use it instead of controlling for it.
Here is the part worth saying plainly: none of these
are exotic. They are standard tables in commercial
well-data subscriptions — the kind of catalog a vendor
like geoLOGIC has
maintained for Western Canada for decades: complete
production back to first oil, completion and frac detail,
interpreted tops. This playbook’s gap list reads like
a page from that catalog, and that is not a coincidence.
Load those three inputs into the pipeline exactly as built
— they slot into the same offset descriptions the set
encoders already consume — retrain, and the cautionary
tale becomes a working ML well planner:
calibrated P10/P50/P90 for a proposed location, the
parent–child penalty priced before permitting,
spacing sensitivity run as a batch of what-ifs instead of a
multi-well science experiment. WITH_PROPRIETARY_DATA.md is the drop-in
spec, gap by gap. The machinery is finished; it is waiting
on the data.