Executive Summary
As of 2026-05-08. Reference scenario: 60 MW BTM PV + 60 MWh BESS @ a hypothetical 100 MW JB data center anchor.
⚠ Risk-adjusted finding (added post-hoc)
Section titled “⚠ Risk-adjusted finding (added post-hoc)”Monte Carlo over the risk register below — with risks scoped to the structures they actually affect (PV-alone is not exposed to hyperscaler-carbon-attribute price risks, since it doesn’t book carbon revenue) — shows PV-alone has P(NPV<0) = 13%, much lower than the previously published 26% which spuriously applied carbon-attribute risks to a structure that doesn’t carry them. Carbon-stacked structure has P(NPV<0) = 0.2%. Both are bankable at conservative project-finance bars, but carbon-stacked is decisively so.
Mitigation-value attribution (2026-05-08): zeroing each risk’s probability one at a time reveals the highest-leverage PPA clauses:
| Risk mitigated (PV-alone) | P(NPV<0) baseline | After mitigation | ΔP |
|---|---|---|---|
| ICPT subsidy reform (tariff-floor PPA clause) | 12.6% | 0.0% | −12.6pp |
| DC commissioning slips ≥ 2 years (phased PV PPA) | 12.6% | 8.4% | −4.1pp |
| ENEGEM upside lost (negative — losing the upside) | 12.6% | 17.7% | +5.1pp |
| BESS capex stays high (zero impact at PV-alone) | 12.6% | 12.6% | 0.0pp |
Headline action: a single tariff-floor clause in the BTM PPA — protecting against ICPT subsidy reform — is the highest-value commercial-negotiation item, eliminating the entire P(NPV<0) tail for PV-alone.
Top-priority clause changes by commercial structure:
| Structure | Top single-clause priority | ΔP(<0) |
|---|---|---|
| PV alone (vanilla PPA) | ICPT tariff-floor clause | −12.6pp |
| PV + carbon (bundled, no CFE) | Carbon-attribute price floor (vs hyperscaler-internal-carbon collapse) | −0.23pp |
| PV + carbon + 24/7 CFE | ICPT tariff-floor clause | −0.08pp |
For vanilla PPAs, ICPT-floor is decisively #1. For bundled-carbon PPAs, the carbon-attribute floor matters more because the carbon-NPV layer (+211 M) is the source of robustness — protecting its downside is the biggest tail defender. For 24/7 CFE structures, the analytical scenario tree shows zero negative patterns at midpoint impacts (Monte Carlo’s residual 0.08% comes from impact-range sampling within fired risks); ICPT-floor still tops the ranking primarily through E[NPV] uplift.
Correlated-risk overlay: latent-Gaussian copula with positive within-cluster correlations (energy-policy stress, tech pullback, decarb push) shifts P(NPV<0) modestly: PV-alone 12.6% → 13.8%, PV+carbon 0.23% → 0.66%. Carbon-stacked stays decisively below 1% even under correlated stress — the structural-robustness claim holds.
Top 5 most-probable joint scenarios (PV-alone, analytical enumeration of all 16 risk-trigger patterns at midpoint impacts):
| P | NPV (M RM) | Triggered risks |
|---|---|---|
| 25.5% | +83 | NONE — base case |
| 13.7% | +53 | DC commissioning slip |
| 10.9% | +138 | ENEGEM upside |
| 10.9% | +5 | ICPT reform |
| 6.4% | +83 | BESS capex stays high (zero-impact risk) |
Top 5 cover 67% of probability mass; top 10 cover 90%. The single most
probable outcome (25.5%) is “no risks fire” → +83 M. The first NPV-negative
pattern is rank 7 (“ICPT + DC slip” at 5.9% → −25 M). See
risk_scenario_tree.json for the full 16-pattern enumeration.
Worst-credible-case enumeration across all structures:
| Structure | Worst NPV (midpoint impacts) | Patterns NPV<0 / Total | Worst-case P |
|---|---|---|---|
| PV alone (60 MW) | −25 M | 2 / 16 | 5.9% |
| PV + carbon (USD 100/tCO2) | −22 M | 2 / 128 | 0.13% |
| PV + carbon + 24/7 CFE premium | +8 M | 0 / 128 | n/a |
Headline structural finding: PV+carbon+CFE produces zero NPV-negative outcomes across all 128 enumerated risk-trigger patterns when the 24/7 CFE premium materialises. PV+carbon (without CFE) has only 2 negative patterns, both requiring ≥4 of 7 risks to fire simultaneously, with cumulative probability ~0.2%. PV-alone has 2 negative patterns at cumulative probability ~7%. The carbon-stacked structure is not just “low P(NPV<0)” — it is deterministically positive across the entire enumerated joint scenario space when CFE applies.
Bottom line
Section titled “Bottom line”On-site BTM PV is bankable today at 13.0% IRR / 8-year payback / +83 M RM NPV under current ICPT (16 sen/kWh). BESS is structurally NPV-negative at current capex (5 M RM/MWh) and remains so under multi-site aggregation. Carbon attributes priced at hyperscaler internal rates (USD 100/tCO2) deliver +211 M RM NPV — 2.5× the BTM-only NPV — and reframe the commercial case from “energy avoided cost” to “RE100 fulfilment with on-site auditability.” The recommended structure is a 24/7 CFE Premium PPA at RM 450–550/MWh with the BESS commitment trigger-locked to 2027–2028 (capex < 3 M RM/MWh).
Stacked NPV (60 MW PV scenario)
Section titled “Stacked NPV (60 MW PV scenario)”| Layer | NPV (RM mn) | Notes |
|---|---|---|
| BTM avoided cost (LP dispatch + cooling CDH, full-year corrected) | +83 | bankable as standalone PV PPA |
| BESS at 5 M RM/MWh capex | −287 | structurally negative; defer until ≤ 2.0 M RM/MWh |
| Carbon attributes @ USD 100/tCO2 | +211 | hyperscaler internal pricing |
| 24/7 CFE premium ~+30 | conditional | only credible if PV ≥ 200 MW (cfe_247_analysis.md); at 60 MW PV the on-site 24/7 share is only 8% so no real “premium” basis |
| TOTAL (PV + carbon, no BESS) | +293 | recommended commercial structure today |
Methodology correction (2026-05-08): prior versions used
avg_annual_savingsover a 6-row series that included a partial-year tail (1 MWh × 7 hours of MYT 2025), biasing every NPV downward by ~52 M RM uniformly. Filtering to full years only (≥ 4000 hours of weather per year) gives the corrected numbers above. Qualitative conclusions (PV bankable, BESS negative, carbon dominant) are unchanged; quantitative magnitudes are larger.
PPA tariff bargaining range (third-party developer, kWh-only and bundled)
Section titled “PPA tariff bargaining range (third-party developer, kWh-only and bundled)”| RM/MWh | Source | |
|---|---|---|
| Developer floor @ 8% IRR (kWh-only) | 299 | ppa_pricing.md |
| Tenant ceiling — LP avoided cost (energy + ICPT 16 sen + MD reduction) | 406 | ppa_pricing.md (auto-derived from BTM JSON) |
| kWh-only surplus | +107 (~26% of ceiling) | healthy under current ICPT; collapses to ~0 if ICPT reformed (ceiling falls to ~245) |
| Bundled ceiling — kWh + hyperscaler carbon @ USD 100/tCO2 | 696 | ppa_pricing.md |
| Practical bundled tariff target (mid-spread) | 450–550 | dev margin 150–250 RM/MWh, tenant margin 150–250 RM/MWh under bundled ceiling |
Headline: vanilla PPA has a healthy 26% bargaining range under current ICPT, but it collapses entirely under ICPT subsidy reform (ceiling 245 < floor 299). Bundled PPA captures the hyperscaler’s idiosyncratic valuation of the renewable attribute (~290 RM/MWh above market REC price), opening a 4–7× wider bargaining range that survives any ICPT regime. The deal economics are dominated by carbon-attribute pricing, not kWh price — same conclusion as the stacked-NPV table, framed as a tariff.
Target-IRR sensitivity — does the PPA still clear at higher equity returns?
| Target IRR | Floor RM/MWh | Vanilla surplus | Bundled surplus | Feasibility |
|---|---|---|---|---|
| 8% | 299 | +107 | +397 | both comfortable |
| 10% | 340 | +65 | +356 | vanilla thin, bundled comfortable |
| 12% | 384 | +22 | +312 | vanilla thin, bundled comfortable |
| 15% | 454 | −48 | +243 | vanilla INFEASIBLE; carbon-stacked still works |
| 18% | 526 | −120 | +170 | vanilla infeasible; bundled workable |
Equity-heavy financing structures (≥12% IRR) make the vanilla PPA infeasible — only the carbon-stacked structure clears. This adds a structural reason to bundle: not just “more attractive” but required for any non-debt-heavy capital stack.
Top 5 actionable recommendations
Section titled “Top 5 actionable recommendations”- Sign 60 MW BTM PV PPA today — IRR 13.0%, 8-year payback, +83 M RM NPV. Independent of BESS, ENEGEM, or VPP service.
[btm_economics_dc100.md] - Negotiate tariff-floor clause in the PPA — single highest-value contract item; protects up to RM 105 M NPV against ICPT subsidy reform.
[sensitivity_tornado.md] - Lead the commercial pitch with carbon, not avoided cost — for hyperscaler tenants, carbon NPV is 2.5× the BTM-only NPV. Vanilla PPA bargaining surplus is 107 RM/MWh (developer floor 299, tenant ceiling 406, ~26% room) but ICPT reform collapses it (ceiling 245 < floor 299); bundled PPA at hyperscaler internal carbon (USD 100/tCO2) opens a bundled ceiling of 696 RM/MWh that survives ICPT regime risk.
[ppa_pricing.md][carbon_re100_analysis.md] - Defer BESS commitment with a trigger condition —
bess_trigger_curve.mdshows BESS only flips NPV-positive with VPP service revenue (BTM-only never triggers, even at BNEF 2035 floor capex). Trigger years: 2025 if premium hyperscaler PPA at ≥ 180k RM/MW/mo signs; 2027 with strong VPP stack at 120k; 2031 if 24/7 CFE premium at 60k. Pre-negotiate the framework agreement; the trigger is “VPP contract signed”, not “capex below threshold”.[bess_trigger_curve.md][vpp_service_revenue_required.md] - Structure as BTM Additionality PPA with anchor hyperscaler — target tariff RM 450–550/MWh (developer captures ~150–250 RM/MWh margin over the 299 vanilla floor; tenant captures ~150–250 RM/MWh below the 696 bundled ceiling at internal carbon pricing). Note: at 60 MW PV the on-site 24/7 hourly matching is only ~8% (
cfe_247_analysis.md); true 24/7 CFE requires off-site PPA layer (CRESS/CGPP/ENEGEM) on top. BESS is a trigger-conditional option for tenants wanting verified 24/7 share above 25%, which requires PV ≥ 200 MW (land-adjacent, beyond rooftop).[ppa_pricing.md][carbon_re100_analysis.md][cfe_247_analysis.md]
What we proved with the data
Section titled “What we proved with the data”| Finding | Evidence | Source |
|---|---|---|
| JB centroid solar resource: 1,661 kWh/m²/yr, CF ~14.8% | 5y NASA POWER 9-pt grid | cross_comparison.md |
| POWER vs METAR T-bias: +0.10 °C over 5y | 43,818 aligned hours | cross_comparison.md |
| Peninsular consumption +6% YoY in H1 2024 | DOSM monthly data | cross_comparison.md |
| 77% fossil grid (44% coal, 33% gas) → high carbon intensity | Ember 2024 monthly | carbon_re100_analysis.md |
| MY grid CO2 intensity: 631 gCO2/kWh (2024 measured) | Ember | carbon_re100_analysis.md |
| ICPT 2022-H2 step from 3.7 → 20 sen/kWh; current 16 sen | TNB / ST static reference | tnb_icpt.yaml |
| ETOU peak window CDH ratio 1.72× off-peak | 5y POWER analysis | load_synthesizer.md |
| LP dispatch lifts BESS savings 14% over heuristic — but does not flip NPV | LP cross-validation | btm_economics_dc100.md |
| Aggregation does NOT change per-MW BESS economics | 10-site portfolio sweep | aggregator_portfolio.md |
| Required VPP service revenue: 209 kRM/MW/month | inverse NPV at current capex | vpp_service_revenue_required.md |
What we proved with the modelling
Section titled “What we proved with the modelling”- NPV monthly reconciliation against DOSM is exact (algebraic by construction, residual 7.9e-15). Not a fitted result.
- Weather-year noise is small relative to other risks — across 2020-2024, per-year PV-only savings range 31.27 → 32.78 M RM (CoV 2.1%, std 0.68 M/yr). Translates to ~6.7 M RM std on NPV (8% of base) — a small fraction of any single risk-register lever (ICPT alone is 60+ M).
- LP dispatch (CBC solver) shows the heuristic was leaving 14% on the table — full cross-validation against analytical tornado at 8 corner cases shows < 1% nonlinearity at extremes. Tornado rankings are robust.
- Top 3 sensitivity levers: BESS CapEx (370 M range) >> ICPT (106 M) > PV CapEx (84 M). Bottom 5 levers (RTE, cycles, MD ±20%, peak share, PV in peak fraction) collectively < 70 M.
- Cooling CDH refinement (PUE 0.008/°C above 25°C) adds +6.6 to +8.1 M NPV uplift — modest but meaningful, especially aligns model with what hyperscaler tenant runs.
- BESS breakeven is invariant of portfolio size (linear per-MW economics). Aggregation buys market access, not financial wedge.
- Vanilla PPA bargaining surplus is healthy today (107 RM/MWh, ~26%) but fragile under ICPT regime risk — the tornado puts ICPT removal at −60 M NPV per 8 sen, dropping the tenant ceiling from 406 → 245 RM/MWh, BELOW the 299 developer floor. Bundled PPA with hyperscaler is the only structure where the bargaining range survives ICPT reform.
- ICPT tariff-floor PPA clause is the single highest-leverage mitigation — zeroing ICPT subsidy reform from the risk register drops PV-alone P(NPV<0) from 12.6% to 0.0% (entire negative tail collapses). DC commissioning phasing is #2 at 4.1pp reduction. Mitigation-value attribution via per-risk zero-out (
risk_mitigation_value.json). - PV+carbon+24/7 CFE produces zero NPV-negative outcomes across all 128 enumerated risk-trigger patterns at midpoint impacts. PV+carbon (no CFE): 2/128 negative, both requiring ≥4 of 7 risks to fire simultaneously, cumulative probability ~0.2%. PV-alone: 2/16 negative at cumulative probability ~7%. Analytical scenario-tree enumeration in
risk_scenario_tree.json. - Correlation amplifies “energy-policy stress” joint patterns 1.6–2.3× over independent expectations — empirical scenario tree under latent-Gaussian copula shows ICPT + BESS-stays-high firing together 1.62× more frequently than independent product, ICPT + BESS + DC-slip 2.30× — exactly the “everything goes wrong at once” patterns risk managers care most about. Net P(NPV<0) tail thickens from 7.35% (independent, midpoint) to 8.74% (correlated, empirical).
- Vanilla PPA is structurally infeasible at IRR ≥ 15% — at 15% target IRR the developer floor (454 RM/MWh) exceeds the tenant ceiling (406 RM/MWh). Equity-heavy financing structures cannot close on a vanilla PPA; carbon-stacked is the only viable structure. This gives a third structural reason to bundle (alongside +211 M carbon NPV and ICPT-reform robustness): non-debt-heavy capital stacks have no other option.
What is NOT yet proven (open questions)
Section titled “What is NOT yet proven (open questions)”| Open item | Why it matters | Resolution path |
|---|---|---|
| Real Johor electricity series | Replaces modelled GDP-share proxy (±5 pp uncertainty) | TNB internal data — commercial outreach |
| Single real customer profile | Calibrates synthesizer α coefficients (currently rule-based) | Outreach to one Johor industrial customer |
| TNB current tariff E1/E2/E3 rate values | Affects absolute NPV by ±20% | Read latest TNB tariff PDF |
| EMC USEP price feed | Quantifies ENEGEM cross-border revenue | EMC subscription / scraping with credentials |
| MY 24/7 CFE PPA market clearing | Confirms RM 100/MWh premium estimate | Track Microsoft/Google JS-SEZ contract precedents |
| ICPT trajectory beyond 2025-H1 | Each 6-month review changes margin by ~5-10% | ST gazette monitoring (every 6 months) |
| IRDA industrial park breakdown | County-level load allocation accuracy | IRDA data request |
| dc_tracker phasing accuracy | Cashflow timing in portfolio NPV | Quarterly track of public commissioning announcements |
| PV-degradation extrapolation past year 5 | Current model holds 5y-mean savings flat across 20y horizon; proper 0.5%/yr continuing degradation would reduce PV-only NPV by ~8 M (~9%) | Refactor btm_economics to apply degradation factor in cashflow loop, not just within sim window. Documented in btm_economics_dc100.md “Known modeling simplifications”. |
Risk register (top 5)
Section titled “Risk register (top 5)”| Rank | Risk | Magnitude | Mitigation |
|---|---|---|---|
| 1 | ICPT subsidy reform (industrial included in domestic-style cap) | −60 M NPV per 8 sen ICPT removed | Tariff-floor clause in PPA |
| 2 | BESS capex stays high through 2030 | locks BESS in NPV-negative; PV alone still works | Trigger-conditional BESS contract |
| 3 | Hyperscaler internal carbon price falls to ≤ USD 25/tCO2 | Carbon NPV drops from +211M to +52M | Diversify carbon revenue (RECs + voluntary + regulated) |
| 4 | DC commissioning slips 2+ years | Cashflow delay; potential RE100 deadline miss for tenant | Phased PV PPA aligned to commissioning |
| 5 | MY decarbonisation accelerates beyond NETR | Carbon NPV halves over 20y | Front-load carbon-attribute monetisation in early years of PPA |
Methodology in 5 bullets
Section titled “Methodology in 5 bullets”- Data foundation: 5y hourly NASA POWER (9-pt JB grid, 394k rows) + Senai METAR (45k rows) + DOSM monthly electricity/GDP + Ember monthly mix + ST MESH 2023 PDF + manual TNB ETOU/ICPT static refs. All UTC bronze, MYT-derived silver. Cross-validation: POWER vs METAR T-bias 0.10 °C; DOSM vs Ember demand ratio 1.014.
- Load synthesis (Stage 3): rule-based hourly basis Sₜ = (α₀ + α₁·CDHₜ) × w_etou × w_dow, calibrated so monthly sum = peninsular × Johor share (modelled 11.5–11.7%). Output: 39,424 hourly Johor load rows. Algebraically exact monthly reconciliation.
- BTM economics (Stage 4): hourly LP dispatch via pulp + CBC solver, monthly horizon, SoC continuity, MD-aware. Cooling-CDH PUE temperature dependence. Capex/OPEX from EPC quote ranges; ICPT period-aligned from static ref.
- Sensitivity infrastructure: analytical tornado recalibrated to LP-w-cooling-CDH base (residual drift ±4 M RM zero-mean, validated at 8 corner perturbations). 15 ranked levers; top 3 (BESS CapEx, ICPT, PV CapEx) carry 80% of total sensitivity.
- Carbon layer: Ember-measured grid intensity × annual PV yield; monetised at 5 carbon price benchmarks (BCX → EU CBAM range). RE100 decomposition assumes BTM PV + REC gap. Outputs are stackable with BTM NPV, not double-counted.
File map (where the numbers live)
Section titled “File map (where the numbers live)”reports/ EXECUTIVE_SUMMARY.md this file cross_comparison.md data corroboration findings btm_economics_dc100.md single-site PV+BESS NPV (v0/v1/v2) vpp_service_revenue_required.md BESS breakeven floor aggregator_portfolio.md multi-site portfolio analysis sensitivity_tornado.md assumption ranking + LP cross-validation carbon_re100_analysis.md CO2 + RE100 economic layer ppa_pricing.md developer floor, tenant ceiling, bundled PPA load_synth_diagnostics.json synthesizer reconciliation metrics tornado_lp_crossvalidation.json raw cross-validation datadocs/ architecture.md full pipeline diagram IMPLEMENTATION_PLAN.md stage status methodology/load_synthesizer.md Stage-3 math sources.md data source catalogCLAUDE.md project context for Claude / new team membersNext moves (post-handoff)
Section titled “Next moves (post-handoff)”- Commercial outreach — anchor hyperscaler tenant for 24/7 CFE Premium PPA structure (#5 above).
- Read current TNB tariff PDF — replace placeholder rate values with audited numbers.
- Track ICPT every 6 months — each Suruhanjaya Tenaga revision changes the case by 5-10%.
- Track BESS capex curve — when LFP 4-h installed quote drops below 2.5 M RM/MWh, run the LP again and re-evaluate the trigger.
- Engage one real industrial customer — even a single 15-min profile would close the synthesizer’s largest open methodology question.