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.
| Field | Default | Source |
|---|---|---|
| lifetime_years | 25 | Standard German onshore design life; WindGuard Kostensituation studies assume 20–25y, modern permits 25y+ |
| availability | 0,97 | Author field experience (Suzlon O&M, 10+ plants); consistent with full-service contract guarantees of 95–97% |
| electrical_losses | 0,02 | Typical park-internal + grid-connection electrical losses, DNV/WindGuard energy-assessment practice |
| wake_losses | 0,06 | Typical German onshore park wake deficit for mid-size parks; applied only when CF is single-turbine based |
| curtailment_redispatch | 0,02 | BNetzA Monitoringbericht redispatch/EinsMan volumes for onshore wind, order-of-magnitude national average |
| degradation_pa | 0,002 | Staffell & Green (2014), UK fleet performance degradation ~0.2%/yr aged-fleet estimate |
| capex_eur_per_mw | 1.650.000 € | FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv (WindGuard/Fraunhofer ISE/IRENA) |
| opex_fixed_eur_per_mw_yr | 55.000 € | FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv (WindGuard Betriebskosten) |
| opex_variable_eur_per_mwh | 0,0 | Variable O&M folded into fixed full-service rate by default (§8.4) |
| land_lease_pct_revenue | 0,06 | German onshore land-lease benchmarks, 4–8% of revenue; WindGuard Kostensituation 2019 range midpoint |
| municipal_participation_ct_kwh | 0,2 ct/kWh | EEG 2023 §6: up to 0.2 ct/kWh to hosting municipalities; market practice treats as standard for new builds |
| municipal_participation_enabled | true | EEG §6 participation is voluntary but near-universal in post-2021 projects |
| inflation_pa | 0,02 | ECB medium-term inflation target |
| revenue_mode | eeg_premium | Default German route-to-market: EEG Marktprämienmodell (§8.3.2) |
| anzulegender_wert_ct_kwh | null | None → engine solves break-even bid (§8.6); real farms use awarded AW when known |
| ppa_price_eur_mwh | null | PPA mode only |
| eeg_support_years | 20 | EEG §25: 20-year support period from commissioning |
| neg_price_rule_hours | 4 | EEG §51 (2021): premium = 0 in negative-price streaks ≥ 4h; per-vintage mapping in MODEL_CARD.md |
| merchant_tail | true | Years beyond support earn wind-weighted capture price (§8.3) |
| target_dscr | 1,30× | German onshore project-finance market convention for EEG-backed revenue (1.20–1.35 range) |
| max_gearing | 0,75 | Typical senior gearing cap for onshore wind with EEG revenue |
| debt_tenor_years | 18 | Market convention: support period (20y) minus 1–2y tail |
| interest_rate | 0,045 | FALLBACK ONLY — per-vintage values from data/manual/cost_vintages.csv |
| dsra_months | 6 | 6-month DSRA is standard senior-debt security package |
| wacc | 0,058 | Fraunhofer ISE LCOE study WACC range for German onshore wind (nominal) |
| equity_target_irr | 0,08 | Infrastructure-fund hurdle for German onshore wind equity, market commentary range 7–9% |
| tax_rate | 0,30 | German corporate tax ≈ 15% KSt + Soli + ~14–17% GewSt → ~30% combined (§8.7 simplification) |
| depreciation_years | 16 | AfA 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
| Source | Used for | License |
|---|---|---|
| Marktstammdatenregister (MaStR), Bundesnetzagentur | The fleet — every registered onshore wind unit | DL-DE/BY-2.0 Attribution required (Datenlizenz Deutschland – Namensnennung). |
| SMARD.de, Bundesnetzagentur | Day-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.ninja | Hourly 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 results | Award prices 2017–2025 (backtest validation target) | Public sector information |
| CARTO "Dark Matter" basemap | Map tiles / style | CARTO 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 / Marktstammdatenregister | Federal 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ämie | EEG market premium = max(0, AW − Marktwert) |
| §51 / negative-price rule | Hours in negative-price streaks lose the premium |
| Zuschlagswert / Höchstwert | Auction award price / price cap |
| CFADS | Cash flow available for debt service |
| DSCR / LLCR / PLCR | Period / loan-life / project-life coverage ratios |
| DSRA | Debt-service reserve account |
| Sculpting | Shaping principal so DSCR is constant at target |
| Repowering | Replacing old turbines with fewer, larger ones |
| Nabenhöhe / Inbetriebnahme | Hub height / commissioning |