Skip to content

Commit ea8739f

Browse files
committed
docs: align market spec activation contracts
1 parent 83115e0 commit ea8739f

5 files changed

Lines changed: 37 additions & 34 deletions

docs/plan/planning/open/note-market-and-colocation-followups.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,9 @@ sowie Forecast-Serien.
173173
- [ ] F-MKT-01-Abnahmebedingungen sind als Slice-Startkriterien dokumentiert und
174174
für mindestens diese drei produktiven Betriebsformen (`StandaloneBess`,
175175
`ClassicalCoLocation`, `HybridWithGridImport`) definiert.
176-
- [ ] `GreenStorageRestricted` ist als separater Sondermodus für einen späteren
177-
Validierungsslice dokumentiert.
176+
- [ ] `GreenStorageRestricted` läuft im ersten Slice als Validierungsmodus mit
177+
harten Constraints; produktive Förderautomatik bleibt einem späteren Slice
178+
vorbehalten.
178179
- [ ] F-MKT-02-Abnahmebedingungen sind als Slice-Startkriterien dokumentiert
179180
(Preis: 1 Primär + 1 Fallback; Forecast: je 2 Adapter für `load` und
180181
`weather-temp`; jeweils Fallback-/Degradation-Modell, Aktualisierung +

docs/plan/planning/open/plan-domain-migration-optimization-run-can-execute.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Nicht vorhanden:
7373
- Sammelbeiträge wie `source_ok` sind all-or-nothing: mehrere Slices oder
7474
mehrere Serien dürfen denselben Slot bedienen, und jeder einzelne
7575
`source_ok=false`-Beitrag zieht das aggregierte `source_ok` auf `false`;
76+
- nicht aktivierte Beiträge gelten im jeweiligen Lauf als neutral `true`;
7677
- der Combiner berechnet monoton `CanExecute = HasUsableSolution && all(_ok)`.
7778

7879
### Gemeinsame Run-Mapping-Matrix
@@ -134,7 +135,8 @@ duplizieren diese Matrix nicht.
134135
Domain-Wireform `TerminationCode:TerminationDetail` am ersten `:` trennt.
135136
Werte mit natürlichem Doppelpunkt (z. B. ISO-Zeitstempel oder URLs) müssen
136137
vor Persistierung percent-encoded werden; neue Parser dekodieren nur
137-
innerhalb von `format=kv1`.
138+
innerhalb von `format=kv1`. Das gilt auch für `series_version`-Werte aus
139+
Forecast-/Preisreihen, falls sie in `TerminationDetail` aufgenommen werden.
138140

139141
3. Persistenz und Wire
140142
- `can_execute` in allen produktiven Stores hinzufügen:

docs/plan/planning/open/plan-ler-fcr-reserve-robustness.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Baltputnis et al. (2024), Journal of Energy Storage 102, 114082
1010
[`../../../../spec/architecture.md`](../../../../spec/architecture.md),
1111
[`../done/plan-RM-M4.md`](../done/plan-RM-M4.md),
1212
[`../done/plan-RM-M5.md`](../done/plan-RM-M5.md),
13-
[`../open/plan-price-forecast-adapters.md`](../open/plan-price-forecast-adapters.md)
13+
[`plan-price-forecast-adapters.md`](plan-price-forecast-adapters.md)
1414

1515
---
1616

@@ -318,7 +318,10 @@ Deterministische Berechnung (verbindlich):
318318
symmetrisch abgedeckt.
319319
- Diese Kopplung ist bewusst konservativ und vollständig deterministisch.
320320
- Wenn simultanes Gegensignal laut Produktdefinition aktiv ist, aber `simultaneous_reserve_direction_allowed=false`,
321-
gilt hart `ROBUST_POLICY_UNSUPPORTED` mit `POLICY_MISMATCH`.
321+
gilt hart `ROBUST_POLICY_UNSUPPORTED` mit `POLICY_MISMATCH`. Diese Sperre
322+
gilt nur für separat gebuchte Up-/Down-Produkte (aFRR/mFRR); FCR wird als
323+
symmetrisches Produkt unabhängig vom Flag mit getrennten Up-/Down-Hüllen
324+
ausgewertet.
322325
- FCR-Worst-Case-Konsistenz bei Mindestzeit:
323326
- Für FCR wird die Mindestaktivierungszeit mit zwei getrennten Zustandsgrößen geführt:
324327
- `fcr_remaining_envelope_t` ist die konservative Worst-Case-Hülle in Minuten.
@@ -585,12 +588,10 @@ Order-Routing oder Börsenanbindung bleibt außerhalb.
585588

586589
### Phase 3: Optimierungsintegration
587590

588-
- Dieser Abschnitt ist der gemeinsame Referenzvertrag für Ausführungs- und
589-
Guard-Verhalten (`OptimizationSolverStatus`, `TerminationCode`, `CanExecute`,
590-
`CanExecute=false`-Interpretation).
591-
Das Gegenstück im Co-Location-Slice ist
592-
[`plan-market-colocation-model.md`](plan-market-colocation-model.md);
593-
beide Abschnitte müssen semantisch identisch bleiben.
591+
- Die gemeinsame Run-Mapping-Matrix lebt im Pre-Slice
592+
[`Domain-Migration OptimizationRun.CanExecute`](plan-domain-migration-optimization-run-can-execute.md).
593+
Dieser Abschnitt liefert nur robustheitsbezogene Guard-Beiträge und Codes; er
594+
muss mit der Pre-Slice-Matrix konsistent bleiben.
594595

595596
- Precheck für Schedule-Optimierung:
596597
- Reserveband darf nicht nur leistungsmässig passen, sondern muss
@@ -708,7 +709,7 @@ Order-Routing oder Börsenanbindung bleibt außerhalb.
708709
- Kein Ersatz für BMS-/PCS-Schutzfunktionen.
709710
- Keine Änderung der bestehenden Vorzeichenkonvention.
710711
- Kein Forecast-Adapter; Quellenbeschaffung bleibt
711-
[`plan-price-forecast-adapters.md`](../open/plan-price-forecast-adapters.md).
712+
[`plan-price-forecast-adapters.md`](plan-price-forecast-adapters.md).
712713

713714
---
714715

docs/plan/planning/open/plan-market-colocation-model.md

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,11 @@ Mögliche Domain-/Application-Erweiterungen:
199199
- Weitere Pflichtfelder:
200200
- `value_kw`
201201
- `value_type` (`forecast` | `actual`)
202-
- `source`
203-
- `product`
202+
- `source_metadata.provider_id`
203+
- `series_product`
204204
- `unit` (z. B. `kW`)
205-
- `updated_at_utc`
206-
- `value_version`
205+
- `source_metadata.retrieved_at_utc`
206+
- `series_version`
207207
- Validierung:
208208
- gleiche Zeitachse wie `PriceSeries` (UTC, step-genau, gleiche Horizon-Länge) bei produktiver Nutzung.
209209
Abweichende Quellauflösungen sind im produktiven Co-Location-Pfad nur
@@ -212,21 +212,10 @@ Mögliche Domain-/Application-Erweiterungen:
212212
`alignment_mode=resample`-Pfad mit deterministischer Aggregations-/
213213
Interpolationsregel freigibt. Dieser Plan definiert noch keinen
214214
produktiven Resampling-Pfad.
215-
- Ist `alignment_mode=reject` (Default im produktiven ADR): die Zeitachse muss hart identisch sein (gleiches Horizon, gleiche Schrittweite, gleiche Startzeit).
216-
- Ist `alignment_mode=trim-to-common` gesetzt:
217-
- `alignment_prepared` darf nur zusammen mit `alignment_mode=trim-to-common` verwendet werden;
218-
`alignment_prepared=true` bei anderem `alignment_mode` ist `SCHEMA_INCONSISTENT`.
219-
- produktive Optimierung darf `trim-to-common` nur mit explizit abgeschlossenem Vorverarbeitungs-Pfad und nachweislicher Versionierung in den zugehörigen Vorverarbeitungsfeldern starten; ohne diese Voraussetzungen führt der Lauf zu `SCHEMA_INCONSISTENT`.
220-
- Schnittmenge auf den gemeinsamen Zeithorizont.
221-
- `alignment_prepared_by` und die vorbereiteten Horizon-Grenzen (`alignment_prepared_horizon_start_utc`, `alignment_prepared_horizon_end_utc`) müssen gesetzt sein.
222-
- deterministische Konvention bei Zeitachsen-Verschiebung.
223-
- lückenbehaftete Schritte müssen im Anschluss vollständig abgearbeitet werden.
224-
- nur im Forecast-/Preprocessing-Pfad, danach muss der Standardpfad (`reject`) mit lückenloser Zeitachse erhalten bleiben.
225-
- keine offenen Zeitlücken; zulässig: kontrollierte Backfill-Regel
226-
(max. 2 aufeinanderfolgende Intervalle pro Lücke).
227-
- Backfill ist nur in diesem vorbereiteten `trim-to-common`-Vorverarbeitungspfad
228-
zulässig. Bei `alignment_mode=reject` gibt es kein Backfill; jede
229-
Zeitachsenabweichung bleibt `SCHEMA_INCONSISTENT`.
215+
- Für Alignment gilt ausschließlich der Vertrag aus
216+
[`plan-price-forecast-adapters.md`](plan-price-forecast-adapters.md):
217+
produktiver Default ist `alignment_mode=reject`; `trim-to-common` ist nur
218+
über den dort spezifizierten versionierten Vorverarbeitungspfad zulässig.
230219
- Wenn die Vorverarbeitung Werte auffüllt oder schätzt, muss das
231220
resultierende `SeriesEnvelope` das Flag `SOURCE_BACKFILL` behalten. Solche
232221
Serien sind im produktiven `quality_mode=strict` nicht zulässig und dürfen
@@ -237,7 +226,8 @@ Mögliche Domain-/Application-Erweiterungen:
237226
- Negative Werte sind nur über einen separaten signierten Netzausgangs-Datensatz zulässig.
238227
- Last-Forecasts sind keine `LocalGenerationSeries`; sie laufen als
239228
`ForecastSeries` mit `series_product=load` über den Forecast-Adaptervertrag.
240-
- Metadatenpflicht für `source`, `product`, `updated_at_utc`, `value_version`.
229+
- Metadatenpflicht gemäß `SeriesEnvelope`: `source_metadata.provider_id`,
230+
`series_product`, `source_metadata.retrieved_at_utc`, `series_version`.
241231

242232
- `LocalOriginState`
243233
- virtuelle Zwischenbilanz für herkunftsgebundene Energie (kWh)
@@ -530,10 +520,15 @@ Bestandsrouten nicht brechen:
530520
- `site_grid_power_sign=import_pos`: Vorzeichen-/Grenzlogik bleibt konsistent
531521
zur Export-Variante bei identischem physischem Leistungsfluss.
532522
- Netzexportlimit begrenzt Batterieentladung plus lokale Erzeugung.
533-
- `GreenStorageRestricted`: `e_local_0`-Randfall (`0` und >0) und `local_origin_capacity_kwh`-Randfall (`0`, Minimalreserve) werden explizit geprüft.
523+
- `GreenStorageRestricted`: `e_local_0`-Randfall (`0` und >0) und
524+
`local_origin_capacity_kwh`-Randfall (`0`, Minimalreserve) werden explizit geprüft;
525+
`local_origin_capacity_kwh=0` blockiert mit `CONFIG_INCONSISTENT` und
526+
`format=kv1;reason=GREEN_STORAGE_ORIGIN_CAPACITY_ZERO`.
534527
- `GreenStorageRestricted`: Lauf wird mit `CONFIG_INCONSISTENT` und
535528
`GREEN_STORAGE_GRID_CHARGE_BLOCKED` geblockt, wenn eine Netzladung
536529
(`p_grid_import_t > 0`) versucht wird.
530+
- Co-Location-Konfigurations- und Schemafehler setzen `CanExecute=false`
531+
gemäß Pre-Slice-Matrix.
537532
- Reservebänder reduzieren weiterhin verfügbare Lade-/Entladeleistung.
538533
- `migration_strict=false` erlaubt nicht-aktive `can_dispatch=false`-Sites mit
539534
`unclear`/`incompatible` im Migrationsfenster, blockiert aber aktive Sites

docs/plan/planning/open/plan-price-forecast-adapters.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ Hinweis zur Semantik:
200200
- `status_detail` (optional): strukturierte Zusatzinfo (z. B. `{ "source_code": "SOURCE_STALE", "backfill_intervals_closed": 2, "effective_source_id": "opsd-..." }`)
201201
- `value_hash`: optional für reine Einmalimporte ohne Idempotenz-/Cutover-Vertrag;
202202
verpflichtend, sobald Versions-Idempotenz, Re-Load-Vergleich, Family-Cutover oder
203-
Rollback aktiviert ist. Der Hash stabilisiert den Payload-Vergleich.
203+
Rollback aktiviert ist. In der Erstaktivierung von Phase 1/2 ist `value_hash`
204+
Pflicht, außer der Adapter ist explizit als Einmalimport ohne Re-Load-Vertrag
205+
deklariert. Der Hash stabilisiert den Payload-Vergleich.
204206
- Validierungspflicht:
205207
- strikte UTC-Zeitachse
206208
- Schrittweite exakt `resolution_minutes`
@@ -686,6 +688,8 @@ arbeitet mit deterministischen Preiswerten.
686688
- `SOURCE_EMPTY` ohne expliziten degraded-Zulassungsweg bleibt hart abweisend.
687689
- [ ] Versions- und Idempotenzregeln umgesetzt:
688690
- eindeutiger Revisionsvergleich pro `(series_id, series_version, source.provider_id)`,
691+
- `value_hash` ist für produktive Phase-1/2-Adapter vorhanden, außer bei
692+
explizit deklarierten Einmalimporten ohne Re-Load-Vertrag,
689693
- payload-identisches Re-Load ist idempotent,
690694
- Provider-Kontexte trennscharf unabhängig von identischem `series_id`/`series_version`.
691695
- kontrollierter Cutover/Rollback für `series_version_family` ist dokumentiert und mit den obigen Family-Tests verifiziert.

0 commit comments

Comments
 (0)