Skip to content
Dark MatterDark Matter
EnergyConcepts

CapacityContract

Bidirectional PPA and Tolling primitive. Captures contract capacity, heat rate, dispatch authority, delivery points, fuel supply chain dependencies, capacity payment formula, availability adjustment, force majeure regime, and resource adequacy pledge.

PPA vs. Tolling

A Power Purchase Agreement (PPA) and a Tolling Agreement allocate fuel risk and dispatch control differently. Both are commonly referred to as "PPAs"; the schema distinguishes them via contract_type.

PPATolling
Who supplies fuel?SellerBuyer
Who pays for fuel?Bundled into the energy priceBuyer (separately)
Who controls dispatch?Seller (with buyer curtailment rights)Buyer
Who commits to a high-CF purchase?Buyer (typically 8,000+ hr/yr)Buyer makes no CF commitment
Who is indifferent to capacity factor?Neither — seller wants to dispatchSeller (compensated via capacity payment)

Tolling is the natural structure for stranded-energy compute: the buyer procures fuel directly, the seller is compensated through a capacity payment and variable O&M reimbursement, and dispatch follows the workload rather than the grid. The Pampa JV Phase 1 contract in Patient Energy Zero uses a tolling structure.

Fields

Field names follow standard market usage; counsel reviewing the schema against a conforming PPA or tolling agreement will find a one-to-one mapping.

PropertyTypeRequiredDescriptionExample
contract_capacity_mwnumberYesMW the seller commits to make available. Established at the Initial Commercial Operation Test and re-confirmed by periodic Contract Capacity & Ancillary Services Tests.—
heat_rate_btu_per_kwhnumberNoPlant heat rate. For tolling, drives the variable payment formula and the heat-rate adjustment factor on the capacity payment.—
dispatch_authorityenumYesbuyer | seller_with_buyer_curtailment | iso_only | shared. Determines who issues Dispatch Notices and who absorbs the start/stop economics.—
delivery_pointsarrayYesEnergy and gas delivery points kept separate. Voltage (kV) captured for each energy point; pressure (psig) for each gas point.—
fuel_supply_chainarrayNoPGA / MSA / gas transportation dependencies with cure periods. A chain link with failure_treats_unit_unavailable=true treats the unit as unavailable for the duration of the upstream failure.—
capacity_paymentobjectYesMonthly payment, payment-per-MW-month, availability_threshold_pct (industry default 0.75 — drives Adverse Capacity Event detection), heat-rate target and sensitivity.—
variable_paymentobjectNoPer-MWh price, fuel-cost passthrough toggle, non-fuel variable O&M.—
outage_regimeobjectYesForced-outage notice window, planned-outage advance notice, independent-engineer engagement threshold.—
force_majeureobjectYesDay-for-day extension toggle, termination threshold (cumulative FM days), excused unavailability cap per year.—
resource_adequacy_pledgeobjectNoPledged-to participant id, encumbrance id, jurisdiction program (e.g. MAT_THERMAL, PLAN_GAS_AR, CAISO-RA, NONE for off-grid bilateral structures). Recorded on the underlying Position as a core Encumbrance of type `pledge`, with the RA program name carried in the encumbrance metadata.—
settlement_pathenumNobilateral_private | cammesa_settled | iso_settled | hybrid | merchant_only. Behind-the-meter / off-grid structures default to bilateral_private; in-front-of-meter generators dispatched by the system operator default to iso_settled or cammesa_settled.—
tolling_currencyenumNoUSD_offshore_settlement | USD_onshore_via_RIGI_carve_out | ARS_official_band | ARS_indexed_to_USD | BRL | CLP | UYU | PYG | EUR | GBP | other. AR-specific values reflect the BCRA / RIGI interaction.—
cfe_obligationenumNonone | annual | monthly | hourly_grid | hourly_site. Drives whether the seller can pair the contract with time-stamped EACs (T-EACs) or relies on annual REC / GO retirement. Hyperscalers under 24/7 commitments require hourly_grid minimum.—
regulatory_corpus_idstringNoPinned regulatory corpus snapshot, e.g. AR@2026-05-06.1. See /docs/energy/regulatory/corpus-versioning.—

Capacity payment calculation

The @dmtr/energy/settlement module computes the monthly capacity payment as an availability-adjusted contract value with optional heat-rate sensitivity:

import { computeAvailability, computeMonthlyCapacityPayment } from "@dmtr/energy/settlement";

const availability = computeAvailability({
  contract_capacity_mw: 200,
  available_mw_by_hour: hourlyAvailability,  // 720 entries for a 30-day month
}, contract.capacity_payment.availability_threshold_pct);

const payment = computeMonthlyCapacityPayment(contract, availability, "2027-04", actualHeatRate);
// → reduced_monthly_capacity_payment_usd: scaled by availability + heat-rate adjustment

The capacity price adjustment factor equals min(1, availability_pct) above the threshold; below the threshold, the penalty applies linearly. Heat-rate deviation scales by heat_rate_adjustment_per_pct.

Force majeure

When the seller declares force majeure, applyForceMajeureExtension extends the delivery period day-for-day if the contract permits. Cumulative FM days within a rolling period are tracked against the contract's termination_threshold_days; the function flags termination_eligible when the threshold is reached.

Adverse Capacity Events

detectAdverseCapacityEvent implements the standard Adverse Capacity Event test: if Available Capacity sits at or below 75% of the GU Contract Capacity for 45 or more consecutive days, the Event is triggered and the buyer's termination right opens. Threshold (%) and consecutive-day window are configurable.

API endpoints

  • POST /v1/energy/contracts — create a contract
  • POST /v1/energy/contracts/{id}/dispatch-notice — issue a dispatch notice
  • Settlement math runs offline against OutageReport[] and hourly availability data
Edit this page on GitHub

Last reviewed: May 5, 2026

Was this page helpful?