← worldenergydata · open data outputs
Deterministic core No API key Public BSEE data

FDAS Revision Comparison — V30 → V50 → wed

Three-way comparison of the Lower-Tertiary economics pipeline: scripts, inputs, BSEE-data months, result tables, script differences, missed files, and a bug review — the basis for adopting wed as canonical.

Provenance. Comparison drawn from the V30/V50 source archives (/mnt/ace/.../fdas_revisions) and the wed reproduction reports; the cost-assumptions diff was recomputed cell-by-cell. Revision dates confirmed against Gmail and file vintages.

Data limits & honest caveats

V50 shipped scripts + inputs only (no result workbook), so wed's V50 figures are validated against V30 reproduction, not a V50 golden workbook. Bugs listed are latent under the current dataset unless noted.

#FDAS Lower-Tertiary pipeline — revision comparison (V30 → V50 → wed)

Purpose. Establish the worldenergydata ("wed") toolset as the canonical, go-forward truth for the Frontier-Deepwater Lower-Tertiary economics, by (1) laying the three revisions side by side, (2) tracing every result to the script that produces it, and (3) surfacing every script difference, missed file, and latent bug — so the FDAS authoring group (Roy, Chuck, et al.) and wed converge on one definition of the model.

Revisions and dates

Revision Date Provenance
V302025-09-29Roy Shilling's V30 scripts + results (Gmail "V30 Financial Analysis / V30 of code", Sept 2025); the frozen "golden baseline".
V502026-06-26Roy's refreshed scripts + inputs (file vintage 2026-06-26; coincides with World Oil Part 3). Scripts + inputs only — no result workbooks shipped.
wed2026-07-06This repository — the canonical target. Reproduces V30 and carries the extended V50 window on one code path.

Both source archives are backed up at /mnt/ace/worldenergydata/reference/fdas_revisions/{v30,v50}/ (zips + extracted).


#0. Executive summary

1. D&C days are provably version-independent. extract_drilling_completion_days.py is byte-identical across V30, V50 and wed (md5 1b89c23e) and reads only WAR data — never production. So the drilling+completion day counts carry across revisions unchanged; only the OGOR-A production layer moves. 2. The V30→V50 economic delta is (in wed's reproduction) purely +11 months of production. V30 window ends 2025-05; wed's V50 window ends 2026-04. Holding methodology and costs fixed, that adds +14.1 % oil, +15.2 % revenue, +$432.5 MM aggregate NPV — with no field crossing into positive NPV. 3. **But Roy's shipped V50 script is a *different* model than the published V50 numbers. generate_financial_summary_V50.py adds an after-tax block (severance + ad-valorem + corporate 21 % with NOL carryforward) and its lease_assumptions.xlsx silently changes 13 cost cells (§3.4). The published V50 figures were produced by wed's own reproducer** (pre-tax, window-only), *not* by that script. This is the one thing to align on before adoption (§4.3). 4. wed reproduces V30 to ±0.1 % oil / ±1 % NPV (a passed gate) — the basis for adopting wed as canonical (§4.1). 5. ~30 latent bugs were found by adversarial review of the four wed scripts (§6). Almost all are *masked by the current Lower-Tertiary dataset* (so they do not change any published number today), but they must be fixed before wed is trusted as a general tool. Two are structural and worth immediate attention. 6. Several files were never migrated V50→wed (the V50 generator scripts, the updated cost assumptions, and any V50 result workbook — which was never generated anywhere) (§5). 7. Roy's V50 script has now been run and reconciled field-by-field against wed (§4.4–§4.6). D&C days match to the day (Δ = 0, every field). Economics match closely — seven producers within −$103 M…+$197 M NPV (the 13 cost cells), three exploration-only fields exactly. His after-tax block is a small, real effect (severance & ad-valorem rates are 0; the 21 % corporate tax hits the three fields with positive *lifetime* cash flow — Jack St Malo −$103.4 M NPV, Julia −$4.4 M, Buckskin −$3.9 M). The one material discrepancy is Jack St Malo (−$3.1 B): ≈ $3.0 B of it is the NPV discount-reference convention (Roy "from Day 1" vs wed from first cashflow) plus ~$103 M corporate tax — not a cost or data difference. Roy's own script also corrects the article's Table-2 errata wed flagged (§4.6).


#1. The pipeline and its results lineage

Four stages turn raw public BSEE data into the article's tables. This is the chain to defend end-to-end:

 BSEE OGOR-A (monthly production)          BSEE WAR (daily drilling/completion)
        │                                          │
        ▼                                          ▼
 [1] ogora_to_chronological.py            [2] extract_drilling_completion_days.py
        │  chronological_lease_analysis.xlsx        │  drilling_and_completion_days.xlsx
        │  (per lease/well/month oil)               │  (per-well D&C days — VERSION-INDEPENDENT)
        └───────────────┬───────────────────────────┘
                        ▼
             [3] build_multi_year_lease_matrix1.py   (per-lease monthly matrix)
                        │
                        ▼
             [4] generate_financial_summary_*.py  +  lease_assumptions.xlsx  +  wti_monthly.xlsx
                        │
                        ▼
              financial_project_summary.xlsx
                        │
        ┌───────────────┴───────────────┐
        ▼                               ▼
  Article Table 1                 Article Table 2
  (producing fields:              (exploration-only fields:
   NPV, recovered oil,             Kaskida, North Platte, Tiber —
   revenue)                        D&C spend only, no production)

What moves V30→V50 and what does not: stages [2] (D&C) is byte-identical; the exploration-only Table-2 fields (no production) are identical V30==V50. All movement is in stage [1]'s window feeding stage [4]. That is why the reconciliation is clean.


#2. Three-revision comparison (master table)

Blank cells are shown as "-" where a revision does not carry that item.

Dimension V30 (2025-09-29) V50 (2026-06-26) wed (2026-07-06, canonical)
SourceRoy — scripts + inputs + results + golden-baseline .docxRoy — scripts + inputs onlyworldenergydata repo
Files shipped116repo (scripts in docs/…/FDAS_V30/ + package ports + reports)
extract_drilling_completion_days.py✓ (md5 1b89c23e)✓ (identical)✓ (identical)
ogora_to_chronological.py✓ (V23_001)renamed …_V50.py (Version 008, rewrite)old V23_001 (V50 rewrite not ported)
generate_financial_summary_*.py…_V30.py (pre-tax)…_V50.py (adds after-tax)…_V30.py (pre-tax; V50 script not committed)
build_multi_year_lease_matrix1.py- (not in V50)✓ + ported to packages/…/fdas/data/production.py
Inputs — leases.xlsx20 leases / 10 devs26 leases / 11 devs (+Buckskin)20 leases / 10 devs (V30-vintage copy)
Inputs — lease_assumptions.xlsxbaseline13 cost cells changed (§3.4)V30 values (V50 changes not propagated)
Price deck — WTI1986-01→2025-07 (last $68.39)identical to V30 (byte-identical, thru 2025-07)refreshed 1986-01→2026-05 (last $102.13) + provenance doc
Price deck — Henry Hub (gas)--henry_hub_monthly.xlsx (1997-01→2026-05) — present but unused (revenue is oil-only)
BSEE production window2000-09 → 2025-052000-09 → 2026-04 (+11 months)reproduces both; V50 window auto-detected = 2026-04
Months of BSEE production~297 (137 in the shipped workbook, 2014-01→2025-05)~308 (+11)reads latest OGOR-A .bin incl. 2026 partial-year
NPV / discount rateNPV @ 10 %/yrNPV @ 10 %/yr (unchanged)NPV @ 10 %/yr
Tax treatmentpre-taxafter-tax (severance + ad-valorem + corporate 21 % + NOL)pre-tax (V30 methodology)
Result workbookfinancial_project_summary.xlsx (+ per-field sheets)none shippedYAML golden_baseline_v50.yml + field_economics_*_v50.md (no .xlsx)
Golden-baseline docV30_Golden_Baseline…docx-reports + v30_repeatability_report.md
Key output tablesTable 1 (7 producers), Table 2 (3 exploration)(numbers exist only in wed reports)same tables, reproduced + extended

#3. Script-level differences (V30 → V50), in pipeline order

#3.1 extract_drilling_completion_days.pyidentical

Byte-for-byte identical across all three revisions (md5 1b89c23e). Reads WAR (mv_war_main, mv_war_boreholes_view, mv_war_main_prop_remark) + leases.xlsx; emits per-well DRILLING_DAYS and COMPLETION_DAYS. Confirms the D&C-days-are-version-independent premise. The golden workbook holds 219 well-rows over 20 leases / 12 developments.

#3.2 ogora_to_chronological.py…_V50.pyrewrite (the core change)

Aspect V30 / wed (V23_001) V50 (Version 008)
File discoveryglob('ogora20??delimit.zip') — ZIP only, 2-digit-yearregex accepts zip/txt/csv, de-dupes by year (newest mtime)
Zip members readonly the first member (inner[0])all .txt/.csv members, concatenated
Column parsingnamed 19-col schema, lease assumed in col 0positional indices, auto-detects the G-lease column
De-dupper-file group-sumglobal drop_duplicates() + additive month aggregate
Output columns14 (adds D&C-day allocation + WTI + revenue)5 (raw oil spine only; revenue moved downstream)
Window cutoffnone hardcoded — set entirely by which OGOR-A files are presentnone hardcoded

The window is *not* pinned in code — it is whatever OGOR-A files sit in the working directory. V50's "+11 months" came from newer BSEE downloads, not a code constant. wed still ships the old V23_001 reader.

#3.3 generate_financial_summary_V30.py…_V50.py

#3.4 lease_assumptions.xlsx13 cost cells changed V30→V50 (verified cell-by-cell)

Parameter System V30 → V50
Host_CAPEX_MMsubsea151200 → 900
Host_CAPEX_MMsubsea201500 → 800
Host_CAPEX_MMdry2000 → 1500
Host_CAPEX_MMtieback150 → 80
Host_CAPEX_MMtieback200 → 100
Water_Injection_Facility_Cost_MMsubsea20200 → 100
Water_Injection_Facility_Cost_MMtieback15100 → 200
Water_Injection_Facility_Cost_MMtieback20200 → 250
Variable_OPEX_$/bblsubsea154 → 6
Variable_OPEX_$/bblsubsea206 → 8
Variable_OPEX_$/bbltieback206 → 8
Booster_Pump_15K_MMsubsea15275 → 250
Booster_Pump_15K_MMtieback15275 → 250

Discount rate, royalty, WTI base and tax rates are unchanged. These cost changes were never propagated into wed, and they contradict the "cost assumptions unchanged from V30" statement in the published V50 reports — see §4.3.

#3.5 build_multi_year_lease_matrix1.pyV30-only

Present in V30 and wed (also ported to packages/…/fdas/data/production.py); absent from the V50 archive. Carries the most severe latent bug (§6, matrix-1).


#4. Results connection — how the numbers reconcile (the persuasion core)

#4.1 wed reproduces V30 (the gate)

v30_repeatability_report.md: production matches golden_baseline_v30 within ±0.1 % for all 7 producers (Jack St Malo +0.03 %, others 0.00 %); NPV within ±1 %. The V30 financial_project_summary.xlsx NPV USD column ties 1:1 to the V30 column of v30_vs_v50_comparison.md. So the shipped V30 workbook is the source of record, and wed regenerates it.

#4.2 V50 = V30 + 11 months (window-only, in wed's reproduction)

Metric V30 V50 (wed) Δ
Recovered oil (7 producers)669.3 MMbbl763.3 MMbbl+14.1 %
Revenue$43,487.3 MM$50,093.5 MM+15.2 %
Portfolio NPV @10 %−$8,327.8 MM−$7,895.3 MM+$432.5 MM (still negative)

Per-field NPV @10 % ($MM), V30 → V50:

Field V30 V50 Δ Note
Anchor−1,732.8−1,586.9+145.9late starter, +168 % oil
Shenandoah−1,166.4−991.3+175.1near-zero in V30
Big Foot−1,063.4−989.0+74.4
Julia−530.6−482.8+47.8
Jack St Malo−881.1−804.5+76.6~7.3 % reproducer offset flagged
Stones−1,479.5−1,460.8+18.7
Cascade Chinook−1,474.1−1,580.0−106.0worsens — V50 also applies a first-oil correction (2014-01 → 2012-09) that front-loads capital
Exploration-only (Kaskida −625.0, North Platte −783.5, Tiber −228.0)0.0no production → version-independent

#4.3 The reconciliation ask — one definition of "V50"

There are currently two V50s:

Update (2026-07-07): Roy's V50 script has now been run (§4.4–§4.6). It was executed exactly as shipped — his ogora_to_chronological_V50.py + extract_drilling_completion_days.py + generate_financial_summary_V50.py, his 26-lease leases.xlsx, his 13-changed-cost lease_assumptions.xlsx, after-tax on — against BSEE OGOR-A through 2026-04 and WAR through 2026-02. Two surprises fall straight out: (a) his after-tax block is small but real — the severance and ad-valorem rates are 0, but the 21 % corporate tax (with NOL carryforward) is levied on the three developments whose *lifetime* cash flow is positive (positive cumulative taxable income even though NPV is negative): Jack St Malo (corporate tax $1,030.6 M → −$103.4 M NPV), Julia (−$4.4 M) and Buckskin (−$3.9 M); the other eight fields have negative cumulative cash flow and pay none; and (b) his own V50 script already corrects the article's Table-2 errata we flagged (Stones ≠ Tiber, Cascade NCF sign, zero-OPEX) — §4.6. So the V50-vs-wed gaps are the 13 cost cells, the production window, the NPV discount-reference convention (dominant), and a modest corporate-tax effect (up to ~$103 M on JSM). *(Common mistake avoided: NPV-negative does not imply zero corporate tax — a field with front-loaded capital can post a negative NPV yet a positive lifetime taxable income.)*

*Faithfulness of the run:* OGOR-A came from wed's pickled .bin (Roy's original zips are gone) exported to his delimited format; WAR .bin.txt; run in both his own WTI deck (flat-fills the last 9 months at $75) and wed's extended deck (thru 2026-05) as a sensitivity. His JSM facilities ($7,850 M) reconcile with wed's golden ($7,400 M), confirming the run is his model, not an artifact.

#4.4 Days reconciliation — V50 vs wed is exact (Δ = 0)

Because extract_drilling_completion_days.py is byte-identical across V30/V50/wed and all read the same WAR feed, Roy's V50 D&C output equals wed's to the day — the discrepancy the article team asked us to isolate is zero for every field, so no well-level drill-down is required (the drill-down triggers only on a discrepancy; there is none). The V30 column is the frozen 20-lease golden (older WAR vintage, no Buckskin); it differs from V50/wed only by newer-WAR recency and the Buckskin addition — lineage, not an open gap.

Drilling days (D):

Field V30 V50 wed Δ (V50−wed)
Anchor8218218210
Big Foot1,2071,2351,2350
Buckskin1,0431,0430
Cascade Chinook1,2051,2051,2050
Jack St Malo2,9493,0653,0650
Julia8028028020
Kaskida5565565560
North Platte6756756750
Shenandoah1,2381,3631,3630
Stones1,4571,4571,4570
Tiber2142142140
Total12,43612,4360

Completion days (C):

Field V30 V50 wed Δ (V50−wed)
Anchor1,0041,0041,0040
Big Foot1,8262,0302,0300
Buckskin1,0131,0130
Cascade Chinook1,2621,2621,2620
Jack St Malo3,8643,9823,9820
Julia8858858850
Kaskida2852852850
North Platte2962962960
Shenandoah7511,0071,0070
Stones1,1451,1681,1680
Tiber3636360
Total12,96812,9680

Drilling + completion days (D&C):

Field V30 V50 wed Δ (V50−wed)
Anchor1,8251,8251,8250
Big Foot3,0333,2653,2650
Buckskin2,0562,0560
Cascade Chinook2,4672,4672,4670
Jack St Malo6,8137,0477,0470
Julia1,6871,6871,6870
Kaskida8418418410
North Platte9719719710
Shenandoah1,9892,3702,3700
Stones2,6022,6252,6250
Tiber2502502500
Total22,47825,40425,4040

V30→V50/wed grows +2,926 D&C days = Buckskin +2,056 (added via the KC ingest) + +870 on Big Foot/Jack St Malo/Shenandoah/Stones from the newer WAR vintage (2026-02 vs 2025-09; consistent with §3.1's post-cutoff activity). None of that is a V50-vs-wed discrepancy — those two are identical.

#4.5 Economics reconciliation — V50 vs wed, per column

Roy's V50 (his script, 2026-04, after-tax) beside wed canonical and the article. wed-latest = wed's committed latest-window component baseline at the same 2026-04 window (golden_baseline_v50.yml, plus the Buckskin V50-KC recompute because frozen V30 has no Buckskin row). wed-frozen is retained only in the NPV table as the audited V30 reference. Article = the published WO Table 2 (thru Nov-2025). "–" = no article value or no latest-window producing case.

Produced oil (MMbbl):

Field V50 (2026-04) wed (2026-04) Δ (V50−wed) Article (Nov-25)
Anchor18.618.60.015.0
Big Foot78.278.7−0.5
Buckskin72.972.90.069.6
Cascade Chinook39.739.70.038.8
Jack St Malo438.9438.7+0.2423.7
Julia77.577.50.074.6
Shenandoah21.221.20.08.7
Stones89.089.00.086.9

Oil is fully reconciled V50↔wed (both read the same OGOR-A to 2026-04); the article is lower because it stops at Nov-2025 (Shenandoah, still ramping, shows the biggest gap: 21.2 vs 8.7).

Revenue ($MM):

Field V50 (Roy, 2026-04) wed-latest (2026-04) Δ (V50−wed) Article (Nov-25)
Anchor1,3361,279+571,067
Big Foot5,5875,571+16
Buckskin5,2035,116+884,959
Cascade Chinook2,7902,778+122,725
Jack St Malo28,03527,891+14426,892
Julia5,1975,168+294,983
Shenandoah1,5881,460+128649
Stones5,9795,947+325,815

Revenue is now compared on the same 2026-04 window. The small residual differences are price-deck/rounding effects (and Big Foot's 0.5 MMbbl oil delta); Buckskin still uses the V50-KC recompute because there is no frozen V30 Buckskin row.

Royalty ($MM):

Field V50 (Roy, 2026-04) wed-latest (2026-04) Δ (V50−wed)
Anchor250240+11
Big Foot1,0481,045+3
Buckskin976959+16
Cascade Chinook523521+2
Jack St Malo5,2575,230+27
Julia974969+5
Shenandoah298274+24
Stones1,1211,115+6

OPEX ($MM):

Field V50 (Roy, 2026-04) wed-latest (2026-04) Δ (V50−wed)
Anchor411374+37
Big Foot1,2131,215−2
Buckskin9561,129−173
Cascade Chinook2,2752,196+79
Jack St Malo4,3833,467+916
Julia1,2271,227+0
Shenandoah307265+42
Stones1,9471,769+178

Net cash flow ($MM):

Field V50 (Roy, 2026-04) wed-latest (2026-04) Δ (V50−wed)
Anchor−3,037−3,496+459
Big Foot−895−1,206+311
Buckskin77−1,034+1,111
Cascade Chinook−3,582−3,813+230
Jack St Malo3,8776,344−2,467
Julia92247−156
Shenandoah−3,515−2,945−570
Stones−3,014−3,169+155

MIRR (annual):

Field V50 (Roy, 2026-04) wed-latest (2026-04) Δ (V50−wed)
Anchor−6.68%−7.69%+1.01 pp
Big Foot4.81%4.53%+0.28 pp
Buckskin6.66%4.47%+2.19 pp
Cascade Chinook−1.54%−1.47%−0.07 pp
Jack St Malo5.58%8.74%−3.16 pp
Julia6.55%6.91%−0.36 pp
Shenandoah−1.43%−1.06%−0.37 pp
Stones3.13%3.19%−0.05 pp

OPEX = variable + fixed. Net cash flow is undiscounted. The V50 columns are Roy's after-tax script output; wed-latest remains the pre-tax V30-methodology reproduction unless and until the V50 tax/cost assumptions are formally adopted.

NPV @ 10% ($MM) — the headline, with the reason for each V50↔wed gap:

Field V50 (Roy) wed-latest Δ (V50−wed) wed-frozen Article Reason for V50↔wed gap
Kaskida−625.00−625.0−784exact — exploration-only, D&C-only, version-independent
North Platte−783.50−783.5−1,200exact — exploration-only
Tiber−228.00−228.0−228exact — exploration-only (article agrees too)
Stones−1,383.3−1,460.8+77−1,479.5−228*cost cells (Var-OPEX subsea15 4→6)
Julia−558.4−482.8−76−530.6−625tieback host-CAPEX added (0→80)
Shenandoah−1,094.0−991.3−103−1,166.4−1,391Host-CAPEX subsea20 1500→800 vs added subsea15 var-opex
Cascade Chinook−1,474.6−1,580.0+105−1,474.1−1,122Host-CAPEX subsea15 1200→900
Big Foot−878.3−989.0+111−1,063.4dry Host-CAPEX 2000→1500
Anchor−1,389.7−1,586.9+197−1,732.8−1,421Host-CAPEX subsea20 1500→800 (biggest single cost cut)
Jack St Malo−3,912.8−804.5−3,108−881.1−577*NPV discount reference — Roy discounts "from Day 1" (first spud, 2000); wed from first cashflow. JSM's 14-yr spud→first-oil gap makes this swing enormous. Undiscounted NCF reconciles (Roy +3,877 vs wed-frozen +4,793), so ≈ $3,005 M of the gap is the discount convention and ≈ $103 M is corporate tax (JSM has positive lifetime taxable income). The discount convention is the one item to settle with the article team.
Buckskin−541.4−989.7+448−1,473*V50-KC recompute now present; WED uses the KC D&C extract + tieback20 cost basis (D&C $2,261.6M, facilities $1,800.0M), while Roy V50 carries lower Buckskin D&C/facilities and a small after-tax effect

\* Article value is one of the known Table-2 errata — see §4.6.

Reading it: for the seven small-gap producers the V50↔wed NPV difference is only −$103 M to +$197 M, entirely attributable to the 13 cost-cell changes (Roy's V50 generally lowers host CAPEX, making his NPVs less negative). The three exploration-only fields match exactly. Jack St Malo is the sole material discrepancy, and it is not a cost or data difference at all — it is the NPV discount-reference convention, amplified by JSM's uniquely long lead time.

#4.6 Roy's V50 script confirms wed's article-errata findings

Running Roy's *own* newer script resolves the D1–D5 discrepancies wed flagged against the published article — his V50 output disagrees with his article exactly where wed said the article was wrong:

Article (Table 2) Roy's V50 script wed's finding (confirmed)
Stones NPV = −$228 M (= Tiber row)Stones NPV = −$1,383 MD2: Stones/Tiber row-copy slip
Cascade Chinook NCF = +$3,656 MCascade NCF = −$3,582 MD3: NCF cannot be positive
Julia OPEX = $0, Stones OPEX = $0Julia OPEX $1,227 M, Stones $1,947 MD4: zero-OPEX placeholder

This is the strongest "same page" evidence in the pack: wed and Roy's latest script already agree that the published article carries these errors.


#5. Missed / non-migrated files (inventory)

File V30 V50 wed Action for canonical wed
extract_drilling_completion_days.pynone (identical)
ogora_to_chronological_V50.py (rewrite)-port the all-members/de-dup/positional improvements
generate_financial_summary_V50.py (after-tax)-decide + commit one generator (§4.3)
lease_assumptions.xlsx (V50 costs)-✓ (changed)decide + propagate or reject the 13 cost changes
financial_project_summary.xlsx (V50 result)-never generated anywheregenerate a V50 workbook in Roy's schema for byte-validation
chronological_lease_analysis.xlsx (V50)-regenerate under wed
build_multi_year_lease_matrix1.py-keep; fix critical bug (§6)
wti_monthly.xlsx refreshed to 2026-05--verify the 2026 values (§6, inputs-2)
henry_hub_monthly.xlsx (gas deck)--wire in gas revenue or label future-use (currently unused)
PRICE_DECKS_SOURCE.md, QUICKSTART.md, README_PRODUCTION_RETRIEVAL.md--wed-only provenance/docs — keep
V30_Golden_Baseline…docx-keep as V30 reference

Stale artifact: field_economics_cascade_chinook.md (un-suffixed) still uses first-oil 2014-01-01 / NPV −1,480.5 MM — it was not re-copied from its _v50 version after the first-oil correction. Regenerate.


#6. Bugs found (adversarial review of the four wed scripts)

Ranked by severity. "Affects current LT numbers?" answers the only question that matters for the published article: almost every finding is *latent* — masked by the current dataset — so no published figure changes today. They matter for making wed a general, canonical tool.

# Severity Script Issue Affects current LT numbers?
B1Criticalbuild_matrix1Parser keys on col 1 (WELL_COMPLETION_ID) as API instead of col 8 → WAR joins mis-key, lease attribution collapsesOnly if this script feeds published numbers — verify the package port
B2HighogoraReads only the first zip member; multi-member OGOR-A years silently lose rows (V50 fixed this)No (current years single-member)
B3HighogoraSums OIL_PROD (col 5) across all PRODUCT_CODE without filtering =='O' → gas/condensate rows with a col-5 value inflate oilNo (LT set's extra rows are zero-volume)
B4Highfinancial_V30MIRR uses the 10 % discount rate for both reinvest and finance legs, ignoring the MIRR_Reinvest_Rate/MIRR_Finance_Rate assumptionsMIRR only (NPV unaffected)
B5Highfinancial_V30The shipped "golden" workbook was not produced by this script (different columns/schema) → the canonicalized script ≠ what made the golden numbersSchema/validation gap
B6HighextractorCompletion days counted only from remark-joined WAR rows; post-TD WAR days with blank remarks are dropped → completion undercountPossible — worth a targeted check
B7Highfinancial_V30Host-CAPEX spread window can fall before the global index start → CAPEX undercount, NPV overstatedNo (latent; earliest FO 2014-01)
B8Medmatrix1Col 7 (condensate) mislabeled as water; __water sheets report condensateWater figures only
B9MedogoraMONTHLY_WATER_VOLUME is always 0 (no water column in the 19-col schema)Water figures only
B10Medogora / financialMissing-month WTI filled with $0 (ogora) vs $75 (financial) → the two disagree on out-of-range monthsNo (decks cover the window)
B11Medfinancial_V30Project universe is production-driven; a drilled-but-not-producing field is dropped with its CAPEXNo (all current devs produce or are in Table 2)
B12Med–lowseveralUn-guarded merges/dedup (war_map, lease_names, D&C allocation) can fan out and double-count if inputs gain duplicate keysNo (current keys unique)
B13LowextractorTD day double-counted (drilling exclusive + completion inclusive) → +1 day/well if summedCosmetic (~1 day)
B14Lowfinancial_V30A totals row with a real lease name would inject phantom D&C days (guarded today only by a blank lease name)No (guarded by luck)

Full per-finding failure scenarios are in the session record; the actionable set (B1–B7) should become tracked issues before wed is declared the general canonical tool.


#7. Recommendation — wed as canonical

1. Adopt wed as the single toolset. It reproduces V30 to ±0.1 % and carries the extended window on one code path. 2. Settle the V50 definition with Roy (§4.3): pre-tax vs after-tax, and accept/reject the 13 cost-cell changes. Commit exactly one generator + one assumptions file. 3. Port the V50 ogora improvements (all-members read, de-dup, positional parsing) — these fix real latent risks (B2/B3) with no effect on current numbers. 4. Generate a V50 result workbook in Roy's financial_project_summary.xlsx schema so wed's V50 can be byte-validated (today there is none). 5. Fix the critical/high bugs B1–B7 with regression tests; regenerate the stale Cascade-Chinook report. 6. Verify the refreshed 2026 WTI values before any economics rely on them; decide gas-deck usage.

The D&C layer needs nothing — it is already identical and version-independent, and is the cleanest part of the story to put in front of Roy.


#8. Provenance