Stage gates
The nine-gate development ladder for compute-ready energy projects: LAND → ENERGY → PERMITS → SUBSTATION → TURBINES → FINANCE → BUILD → ENERGIZE → TENANT. Each transition is gated by prerequisites and recorded with a Verdict.
Overview
Every compute-ready energy project advances through the same sequence of de-risking milestones. Which gates a project has cleared is the first question any underwriter, lender, or tenant asks. DMTR Energy formalizes this as a state machine: transitions are validated against prerequisites, history is recorded per gate, and forward contracts can settle against a specific milestone.
The nine gates
| Gate | What it represents | Prerequisites |
|---|---|---|
land | Surface and access rights secured | (none) |
energy | Fuel committed (gas contract, hydro offtake, wind/solar PPA) | land |
permits | Environmental, land-use, water, indigenous consultation, generation license stack | land, energy |
substation | Substation capacity confirmed; interconnection concept approved | land |
turbines | Turbine slots committed (or PV/wind equipment ordered) | energy |
finance | Project finance closed (debt + equity stack) | land, energy, permits |
build | Construction underway | finance, substation, turbines |
energize | Initial commercial operation test passed | build |
tenant | Tenant assignment active under a CapacityContract | energize |
Transitions strictly forward (no regression), and each gate validates its prerequisites. The applyTransition helper throws on disallowed transitions; canAdvanceTo returns a StageGateTransitionResult for non-throwing inspection.
Programmatic use
import { canAdvanceTo, applyTransition } from "@dmtr/energy/stage-gates";
const decision = canAdvanceTo(slot.stage_gate, "finance");
// { allowed: false, reason: "...prerequisite gates not complete: [permits]." }
const advanced = applyTransition(slot.stage_gate, "permits", "complete", "2026-09-01T00:00:00Z");
// returns a new StageGateState with current_gate='permits', status='complete', history updatedForward contracts and stage gates
A forward contract on pre-energization capacity (e.g. "200 MW at El Chocón, Q3 2027") settles when the underlying slot reaches the energize gate. The state machine makes the settlement trigger unambiguous — a forward holder can verify that the slot has cleared build → energize without relying on any single party's attestation.
Verdict capture per gate
Each StageGateRecord in the slot's history can reference a verdict_id from the rights engine. For example, transitioning into tenant should record the Verdict confirming that the tenant assignment passed all compliance checks. This produces an auditable record per gate.
Related concepts
- ComputeSlot — which holds the StageGateState
- CapacityPool — pool effective stage gate is constrained by weakest component gate
- Lifecycle — how DMTR tracks Position lifecycle generally
- Provenance — the related concept for ownership history
DemandSpec
Structured capacity request. A buyer specifies requirements — capacity, jurisdiction, latency, chip class, compliance — and the rights engine matches against ComputeSlot inventory.
Jurisdiction codes
Per-country regulatory body and tax-stability regime enums. ISO-2 country codes, ENRE/CAMMESA/FERC/CAISO/ERCOT/etc. for regulators, AR_RIGI/US_IRA/US_OZ/BR_REIDI/etc. for tax stability.