DCF Test Battery v1.0 — Cycle-1.5 Results (v1.0.38)
Reconciliation results following the v1.0.38 platform DCF structural fix. Three changes shipped: production ramp-up profile, sustaining capex deduction, depreciation tax shield. Two cycle-1 findings materially closed; one new test pass; one improvement-but-still-failing; full reference convergence not yet achieved.
CYCLE 1.5
v1.0.38 BUILD
9 MAY 2026
4 DAYS POST CYCLE-1
Velocity of correction. Cycle-1 results were published 9 May 2026 in the same build cycle as v1.0.45 case studies and Stripe pricing. The cycle-1 page identified three structural simplifications in the platform DCF (no production ramp-up, no sustaining capex, no depreciation tax shield) as causing material over-crediting against published Kakula DFS targets. Cycle-1.5 ships those three fixes and re-runs the 13-test battery against the corrected math. Time elapsed: same-day publication of fix following published-as-broken finding. The pattern is the discipline architecture closing its own gap within the same correction cycle as the publication itself.
The three structural fixes (v1.0.38)
The platform DCF tool now accepts three additional inputs on the calculation form, with sensible defaults that reproduce the cycle-1 reference DCF structure:
| Input | Default | What it does |
| Production Ramp-up Profile | 50% / 75% / 100% over years 1-3 | Years 1-2 cashflows scaled by ramp factor; year 3+ at full capacity. Removes the over-credit caused by front-loading 100% of LoM production into the highest-PV early years. |
| Sustaining CAPEX | $50M/yr | Deducted from cashflow each year of operation. Captures ongoing maintenance capex that the v1.0.37 NOPAT-only formula omitted. User-overridable per asset. |
| Depreciation Tax Shield | Straight-line over mine life | Tax computed on (EBITDA − depreciation), not on raw EBITDA. Reduces cash taxes early in mine life by the depreciation × tax-rate amount. Alternative methods supported (10-year and 7-year accelerated; "none" preserves v1.0.37 behaviour). |
The math anatomy is published in js/app.js at calcDCF() and reproduced in the Python port at dcf_platform_v1_0_38.py. Reference implementation already incorporated these three elements; the v1.0.38 fix brings the platform tool into alignment.
Cycle-1.5 reconciliation against Kakula DFS
Inputs held constant from cycle-1: Kakula DFS published values (price USD 3.10/lb real; capex USD 0.65bn; mine life 21 yrs; recovery 86%; discount rate 8%; tax 30%; royalty 3.5%; production 310 kt/yr contained Cu per Ivanhoe 2026 guidance midpoint).
| Test | v1.0.37 (cycle-1) | v1.0.38 (cycle-1.5) | Status |
| NPV @ 8% at literal $0.48/lb opex | $9.81bn (+78.3% vs $5.5bn target) | $8.59bn (+56.2%) | IMPROVED — gap closed 22 percentage points |
| IRR at literal $0.48/lb opex | 160.6% (implausible vs published 77%) | 102.5% | IMPROVED — no longer implausible; still above published |
| Reconciling cost (back-solved to $5.5bn target) | $1.51/lb-recovered | $1.28/lb-recovered | IMPROVED — gap to reference $1.06 narrowed from $0.45 to $0.22 |
| IRR at reconciling cost | not computed in cycle-1 | 72.5% | PASS — within 5pp of published 77% |
| C3.1 price elasticity (3.10→3.13) | 1.27 (vs 1.5–3.0 expected) | 1.34 | STILL FAIL — improved but at literal cost |
| C3.2 DR elasticity (8%→9%) | 7.7% (FAIL — below 8%) | 8.3% | NOW PASS — within 8–15% range |
Findings — five
Finding A — Platform IRR no longer implausible. At literal-spec inputs (cash cost USD 0.48/lb first-5-years used as LoM constant), the v1.0.37 platform computed 160.6% IRR — more than 2× published. v1.0.38 computes 102.5% — still above the published 77% but no longer in implausible territory. At the reconciling cost of $1.28/lb, the v1.0.38 platform computes 72.5% IRR, within 5 percentage points of the published 77%. The implausibility finding from cycle-1 is materially closed.
Finding B — Reconciliation gap improved but still material. C4.1 gap @ literal $0.48: +78.3% (v1.0.37) → +56.2% (v1.0.38). The 22-percentage-point gap closure is real; the remaining +56.2% is significant and reflects that the literal-spec first-5-years cash cost of $0.48/lb was never meant to be used as a LoM constant. The v1.0 spec amendment (drafted, awaiting editorial sign-off) adds LoM-average cost trajectory as a required reconciliation input — when that amendment ships, the literal-cost reconciliation test moves to the reconciling cost basis and the +56.2% framing dissolves.
Finding C — C3.2 discount-rate elasticity now passes. v1.0.37 platform computed 7.7% NPV drop on an 8%→9% discount-rate move, just below the 8–15% expected range. v1.0.38 computes 8.3% — within the expected range. The cycle-1 reference DCF passed this test at 8.4%; the platform now passes at 8.3%. C3.1 price elasticity remains a FAIL at literal cost (1.34 vs 1.5–3.0 expected) but improved from the 1.27 cycle-1 platform reading. C3.1 enters the expected range only as cost approaches reconciling level — same conditional pass shape as the reference DCF in cycle-1.
Finding D — Reconciling cost convergence partial, not complete. v1.0.38 platform reconciling cost is $1.28/lb-recovered. Reference DCF reconciling cost was $1.06/lb. Gap to reference narrowed from $0.45 (cycle-1) to $0.22 (cycle-1.5) — material convergence but not full. The remaining $0.22/lb gap reflects implementation differences between the platform's structural fixes and the reference Python's structural fixes that cycle-2 will diagnose (likely candidates: depreciation schedule edge-cases at year 21; sustaining capex treatment in negative-EBITDA scenarios; ramp-up handling of royalty vs revenue base). The platform is now closer to the reference than to its own cycle-1 position; cycle-2 closes the residual gap.
Finding E — Unit ambiguity not addressed by structural fixes (deferred to v1.0.39). The form-label disambiguation issue identified in cycle-1 (contained-metal vs recovered-metal user-input convention) is independent of the three structural fixes shipped in v1.0.38 and remains pending. Either explicit "$/t-contained" label clarification on the OPEX field, or restructuring the form to take ore tonnes + grade as separate inputs (the mining-engineer mental model). Deferred to v1.0.39 form-clarification patch.
What v1.0.38 does NOT close
Cycle-1.5 demonstrates the discipline architecture closes its own gaps within the same correction cycle as the publication. It does not yet deliver full reference convergence. Specifically:
- Residual platform-vs-reference reconciling cost gap of $0.22/lb-recovered. Cycle-2 work item.
- C4.2, C4.3, C4.4 reconciling costs at the platform level not yet computed. Same approach extends to the three additional NPV targets ($6.6bn / $11.1bn / $19.1bn) but the back-solve is per-target. Cycle-2.
- Form-label unit ambiguity (Finding E). v1.0.39 form-clarification patch.
- Cycle-2 is now the v1.0.39/v1.0.40 scope. Multi-asset reconciliation (Sukari S-K 1300; Loulo-Gounkoto AIF 2025; Kabanga FS 2025) using the published reconciling-cost approach as the primary input.
Recommendations updated
The five engineering recommendations published in cycle-1 are updated:
| Cycle-1 recommendation | Cycle-1.5 status |
| Add ramp-up profile input | SHIPPED — v1.0.38; default 50%/75%/100% |
| Add sustaining capex input | SHIPPED — v1.0.38; default $50M/yr |
| Add depreciation tax shield | SHIPPED — v1.0.38; default straight-line over mine life |
| Clarify input units in form labels | DEFERRED to v1.0.39 form-clarification patch |
| Document the structural omissions explicitly on tool page | DONE — published in cycle-1 + cycle-1.5 results |
Why this is published
Three reasons:
- Velocity of correction is the discipline. Cycle-1 published the three structural simplifications as the cause of over-crediting. Cycle-1.5 ships the fix in the same build cycle. The pattern of publishing-as-broken then publishing-as-fixed at correction-cycle speed is itself part of the institutional credibility architecture.
- Partial convergence is honest convergence. The platform did not fully match the reference. The remaining $0.22/lb gap is published, the cycle-2 work item is named, and the recommendation table is updated. A full-convergence claim that did not match the math would be the larger credibility cost.
- The Quality Standard requires it. Three-state model: every Sourced and Derived output must be auditable. The cycle-1.5 reconciliation is a Derived output; its inputs are Sourced; the methodology is published.
Cycle-2 will reduce the residual gap further. Cycle-3 extends to multi-asset reconciliation. Each cycle is published. Each cycle is dated. Each cycle is signed.
Update — cycle-2 published. Cycle-2 was completed within the same v1.0.45 build cycle on 9 May 2026 evening. The empirical diagnosis falsified the three named candidates and identified production volume methodology choice as the actual cause of the residual $0.22/lb gap. At vol-matched basis (273.43 kt/yr), reconciling costs converge to within $0.0001/lb across C4.1 and C4.2; C3.1 price elasticity converts from FAIL (1.34) to PASS (1.84). Read
cycle-2 results.
Cycle-1.5 reference run: 9 May 2026. Reference: dcf_reference.py. Sensitivity: dcf_sensitivity.py. Platform v1.0.38: dcf_platform_v1_0_38.py (verbatim port of js/app.js calcDCF() v1.0.38 lines). Editorial responsibility: Nikesh Patel. Publication date: 9 May 2026 (companion document to DCF Test Battery v1.0 and cycle-1 results).