Coverage note · Corporate Finance · Upstream Energy · Honest ML · Agentic AI
ERDA — Upstream Capital-Allocation Intelligence
Can public data alone tell you whether an offshore block is worth drilling? Three layers — market terminal, exploration record, agent committee — and a pre-registered falsification gate that the ML model honestly failed.
Key metrics
1. Deterministic core (economics engine + raster math) is pure Python — no network, no unseeded randomness, no LLM; the golden-case DCF/EMV tests were written before the engine. Every persisted number carries {source_id, retrieved_at, source_url, transform_version}. The model faced a pre-registered bar (beat the distance-to-discovery baseline under LOPO spatial CV with a 50 km leakage buffer, on both label sets) and the bar never moved: attempt 2 was a pre-stated calibrated-pooling refinement, applied identically to model and baseline. It lifted the model and flipped the clean subset to a win — and still failed on primary, so the stop stands.
The problem
An oil major's "where do we drill?" decision fuses three things that rarely live in one system: what a barrel is worth (market), where exploration has historically worked (the well record), and whether a specific block pencils economically (the memo). ERDA rebuilds that chain from free public data only — EIA, OPEC, futures strips, five governments' well registries, global geophysical grids.
The trap in "AI for exploration" is confident cartography: a neural net colors the ocean and calls it prospectivity. Under spatial cross-validation most such maps have no skill beyond "drill next to old wells" — they memorize geography. ERDA makes that test the architecture: a pre-registered falsification gate sits between the model and the map, and losing it means no map ships.
Architecture
- 01
Market terminal (Layer 1)
15 public sources reconciled through pandera contracts; futures curve → DCF price deck; inventories, OPEC+ compliance, a Discovery Monitor. Every panel number renders a provenance chip {source_id, retrieved_at, source_url, transform_version}.
- 02
Exploration record (Layer 2)
32,595 wildcat outcomes harmonized from 5 regulators (BOEM/BSEE, SODIR, NSTA, NLOG, NOPIMS) with an excluded-class policy and per-source label maps, joined to a 14-channel 0.05° geophysical raster stack (gravity, magnetics, sediment, heat flow) in Zarr.
- 03
Falsification gate (§9.8)
LightGBM under leave-one-province-out spatial CV with a 50 km leakage buffer, judged against a distance-to-discovery logit baseline on pooled PR-AUC — a bar stated in code before the run. Failed twice (0.618 vs 0.635 on attempt 2); the negative result renders as a first-class table on /validation and the map ships wells + 7,673 GEM global fields instead of a fake heatmap.
- 04
Deterministic economics engine
Test-first DCF/EMV/fiscal engine with seeded 10k-run Monte Carlo — pure Python, import-pure, golden-case fixture written before the implementation; property tests enforce monotonicity (price↑→NPV↑, Pg↑→EMV↑).
- 05
Nine-agent committee (Layer 3)
LangGraph: six parallel section agents (geoscience, engineering, fiscal, governance…) → economist → red team → chair. Agents call typed tools; tools return numbers; the memo template interpolates them. Streams node-by-node over SSE from a map click.
- 06
Demo that cannot break
The public app boots from a frozen, content-hashed snapshot (SNAPSHOT badge tells the truth); web on one HF Space proxying server-side to the API Space — no client keys, no CORS, LLM key server-side only.
Key tradeoffs
LLM narrates, code calculates — no model call ever performs arithmetic.
WhyThe memo's quant-hash is identical whether prose comes from an LLM or a labelled template: proof the numbers cannot be touched by the narrator.
Ship the failed gate as a feature, not a footnote.
WhyA prospectivity map with no demonstrated skill is a liability in front of energy-finance professionals. The two-attempt negative result — with the bar never moving — is the credibility story.
Pg is user-supplied and every memo says so.
WhyThe model never earned the right to supply it. Honest inputs beat manufactured confidence in a screening tool.
Frozen snapshot mode for the public demo.
WhyFree public APIs flake; a demo that dies mid-scroll costs more than stale-but-honest data. A LIVE/SNAPSHOT badge states which mode is running.
Eval results
Pooled PR-AUC, GBM vs distance-logit baseline, 14 LOPO folds, 50 km buffer, within-fold rank-calibrated pooling (pre-stated refinement, applied identically to both). Baseline wins → gate failed.
Same protocol on true per-well outcomes only: the model wins the clean subset — but the gate requires both sets, so the stop stands. Moving the bar post-hoc would be the exact dishonesty the gate exists to prevent.
All five showcase memos (3 GO / 1 CONDITIONAL / 1 NO_GO) at full citation coverage; deterministic re-runs reproduce the quant-hash bit-for-bit across different narrators.
Golden-case engine fixtures, property tests, spatial-CV harness, label harmonization, map endpoints, memo determinism — plus 8 Playwright E2E specs including map-interactive-under-2s.
Production proof
The artifact that keeps the numbers honest: the eval harness and monitoring gates that run in CI, not a one-off notebook result.
The gate is real — it was allowed to fail
CI · PASSINGThe pre-registered bar never moved: attempt 2 was a pre-stated metric refinement that lifted the model and still lost. ERDA ships the wells, the fields, the economics, and the committee — and publishes the map it refused to draw.
Compresses an upstream screening decision — market context, drilling history, block economics — into one auditable surface, and demonstrates the discipline that regulated capital allocation actually requires: provenance on every number, determinism under the prose, and a model that must earn its place on the map.
Request coverage
I am focused on finance AI: credit risk, RegTech, AML, and agentic investment research. Open to roles, mentorship, and collaborators in fintech, quant, and bank AI.