Methodology

A deterministic engine, shown in full

Every number in RHEINGOLD comes from the pure-function finance engine below — no network, no randomness, no language model. Same inputs, identical outputs, always. These are the actual formulas (spec §8), the actual defaults, and the actual licenses.

The engine, formula by formula

P50 annual energy from the capacity factor, degraded per year; P90/P75 from independent uncertainty components combined in quadrature.

E_p50 = mw_total × 8760 × p50_cf × (1 − wake) × availability
        × (1 − elec_losses) × (1 − curtailment)

E_t = E_p50 × (1 − degradation)^(t − 1)

σ_total = sqrt(Σ σ²)        # independent σ's in quadrature:
                            #   wind-data/method σ  (Path A: 0.06, Path B: 0.09)
                            #   loss uncertainties   0.03
                            #   inter-annual var.    0.06 — NOT in long-term P90;
                            #                        reported separately as 1-yr P90

P90 = P50 × (1 − 1.2816 σ_total)
P75 = P50 × (1 − 0.6745 σ_total)

The uncertainty stack is published as a table in every dossier — each σ, and whether it enters the long-term P90.

Default assumptions

Mirrors packages/engine/rheingold_engine/defaults.yaml field-for-field — every value carries its source. Vintage-dependent values (capex, opex, interest) are overridden per farm from cost_vintages.csv by commissioning year.

FieldDefaultSource
lifetime_years25Standard German onshore design life; WindGuard Kostensituation studies assume 20–25y, modern permits 25y+
availability0,97Author field experience (Suzlon O&M, 10+ plants); consistent with full-service contract guarantees of 95–97%
electrical_losses0,02Typical park-internal + grid-connection electrical losses, DNV/WindGuard energy-assessment practice
wake_losses0,06Typical German onshore park wake deficit for mid-size parks; applied only when CF is single-turbine based
curtailment_redispatch0,02BNetzA Monitoringbericht redispatch/EinsMan volumes for onshore wind, order-of-magnitude national average
degradation_pa0,002Staffell & Green (2014), UK fleet performance degradation ~0.2%/yr aged-fleet estimate
capex_eur_per_mw1.650.000 €FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv (WindGuard/Fraunhofer ISE/IRENA)
opex_fixed_eur_per_mw_yr55.000 €FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv (WindGuard Betriebskosten)
opex_variable_eur_per_mwh0,0Variable O&M folded into fixed full-service rate by default (§8.4)
land_lease_pct_revenue0,06German onshore land-lease benchmarks, 4–8% of revenue; WindGuard Kostensituation 2019 range midpoint
municipal_participation_ct_kwh0,2 ct/kWhEEG 2023 §6: up to 0.2 ct/kWh to hosting municipalities; market practice treats as standard for new builds
municipal_participation_enabledtrueEEG §6 participation is voluntary but near-universal in post-2021 projects
inflation_pa0,02ECB medium-term inflation target
revenue_modeeeg_premiumDefault German route-to-market: EEG Marktprämienmodell (§8.3.2)
anzulegender_wert_ct_kwhnullNone → engine solves break-even bid (§8.6); real farms use awarded AW when known
ppa_price_eur_mwhnullPPA mode only
eeg_support_years20EEG §25: 20-year support period from commissioning
neg_price_rule_hours4EEG §51 (2021): premium = 0 in negative-price streaks ≥ 4h; per-vintage mapping in MODEL_CARD.md
merchant_tailtrueYears beyond support earn wind-weighted capture price (§8.3)
target_dscr1,30×German onshore project-finance market convention for EEG-backed revenue (1.20–1.35 range)
max_gearing0,75Typical senior gearing cap for onshore wind with EEG revenue
debt_tenor_years18Market convention: support period (20y) minus 1–2y tail
interest_rate0,045FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv
dsra_months66-month DSRA is standard senior-debt security package
wacc0,058Fraunhofer ISE LCOE study WACC range for German onshore wind (nominal)
equity_target_irr0,08Infrastructure-fund hurdle for German onshore wind equity, market commentary range 7–9%
tax_rate0,30German corporate tax ≈ 15% KSt + Soli + ~14–17% GewSt → ~30% combined (§8.7 simplification)
depreciation_years16AfA table for wind turbines: 16-year straight-line standard

Data vintages

Live from GET /api/health — the max date of each mart table baked into the running API.

querying /api/health…

Data lineage

The pipeline, as committed in docs/architecture.mmd (Mermaid source, rendered by GitHub in the README). Registry and market data flow left to right; the language models only ever see the frozen EvidenceStore.

flowchart LR
  A[MaStR] --> P[pipelines]
  B[SMARD] --> P
  C[Netztransparenz] --> P
  D[BNetzA auctions CSV] --> P
  E[Wind resource: ninja / GWA] --> P
  P --> M[(DuckDB mart)]
  M --> API[FastAPI]
  API --> ENG[Deterministic engine]
  ENG --> EV[(EvidenceStore)]
  EV --> GATE[Compliance gate - code]
  EV --> CR[3 critics - Claude]
  CR --> N[Narrator - Claude]
  GATE --> N
  N --> V{Citation validator}
  V -->|pass| UI[Next.js: map / dossier / memo]
  V -->|fail| CR
  UI --> H[Human veto]

Data sources & licenses

SourceUsed forLicense
Marktstammdatenregister (MaStR), BundesnetzagenturThe fleet — every registered onshore wind unitDL-DE/BY-2.0

Attribution required (Datenlizenz Deutschland – Namensnennung).

SMARD.de, BundesnetzagenturDay-ahead power prices (hourly)CC BY 4.0
Netztransparenz.de (ÜNB)Monthly market values (Marktwert Wind an Land)Terms of use — attribution

Used per the transmission operators' published terms, with attribution.

renewables.ninjaHourly wind capacity-factor profiles (resource Path A)CC BY-NC 4.0 — NON-COMMERCIAL

Non-commercial license. RHEINGOLD is a non-commercial portfolio/demo project; any commercial use would require replacing this source.

BNetzA onshore auction resultsAward prices 2017–2025 (backtest validation target)Public sector information
CARTO "Dark Matter" basemapMap tiles / styleCARTO basemap terms — attribution required

© CARTO, © OpenStreetMap contributors.

renewables.ninja profiles are CC BY-NC 4.0 — this project is strictly non-commercial. Full lineage and limitations: MODEL_CARD.md.

Glossary

The domain terms used across dossiers and memos (hover any dotted term anywhere in the app).

MaStR / MarktstammdatenregisterFederal register of all German generation units
Anzulegender Wert (AW)Award value from EEG auction, basis of the market premium
Marktwert (MW Wind an Land)Monthly reference market value of onshore wind energy
MarktprämieEEG market premium = max(0, AW − Marktwert)
§51 / negative-price ruleHours in negative-price streaks lose the premium
Zuschlagswert / HöchstwertAuction award price / price cap
CFADSCash flow available for debt service
DSCR / LLCR / PLCRPeriod / loan-life / project-life coverage ratios
DSRADebt-service reserve account
SculptingShaping principal so DSCR is constant at target
RepoweringReplacing old turbines with fewer, larger ones
Nabenhöhe / InbetriebnahmeHub height / commissioning