{ "card": "TARIFF-08, extended by TARIFF-09", "what": "UNMODIFIED response bodies from the public EPEX BE day-ahead feed, captured so the SHIPPED parser can be replayed against what the source really publishes", "why": "every price fixture in the suite was built from a `{\"data\": [{\"start\": ..., \"price_eur_mwh\": ...}]}` document that this feed has never published. The suite therefore graded `_points_from_json` against its own assumption - a closed loop that could not notice the assumption was wrong - and ยง11.4 turned the resulting failure into a silent fall back to the static profile. A captured real body is what breaks that loop, so these files are bytes, not a reconstruction: nothing here is pretty-printed, re-keyed or trimmed. TARIFF-09 adds a body from a request that names a DATE RANGE, for the same reason one layer out: the shipped plugin took `since`/`until` and asked for the bare default URL, so the feed answered ONE Brussels day and every hour past today was carried forward and dropped from the trade set as provisional. A two-day body captured from the range request is what makes \"asking for the range gets the range\" checkable against something the plugin did not shape.", "source": "Energy-Charts API (Fraunhofer ISE), api.energy-charts.info", "upstream": "Bundesnetzagentur | SMARD.de", "licence": "CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)", "licence_note": "the BE bidding zone is in the API's CC BY 4.0 list, so redistribution is permitted with attribution. DATA-02 established this against the API's own OpenAPI document before committing `epex-be-dayahead-2025-09-01_2026-09-01.json`; both bodies below carry the same `license_info` string, recorded per file and asserted by the replay test.", "attribution": "Data licensed CC BY 4.0 by Bundesnetzagentur | SMARD.de, retrieved via the Energy-Charts API (Fraunhofer ISE), https://energy-charts.info. Published without changes.", "retrieved_utc": "2026-09-10T06:35:00+00:00 (TARIFF-08's two), 2026-09-10T07:45:49+00:00 (TARIFF-09's)", "retrieved_with": "curl, by hand; no code in `app/` fetches these", "shape": "COLUMNAR: parallel `unix_seconds` (UTC epoch seconds) and `price` arrays, plus `unit`, `license_info` and `deprecated`. There is no `data` key and no per-point object.", "replayed_by": "test_price.py sections 2b (TARIFF-08) and 2c (TARIFF-09)", "files": { "energy-charts-be-price-2026-09-10-quarterhourly.json": { "url": "https://api.energy-charts.info/price?bzn=BE", "note": "the SHIPPED default URL of `generic_dayahead`, verbatim and with no parameters, so the replay drives the bytes the add-on's own request produces", "covers_local_day": "2026-09-10 (Europe/Brussels)", "granularity_s": 900, "intervals": 96, "bytes": 1877, "sha256": "176309d0020ad208320797385ef68b6a98ac248218539416cddf6579dd060487", "unit_as_returned": "EUR / MWh", "licence_as_returned": "CC BY 4.0 (creativecommons.org/licenses/by/4.0) from Bundesnetzagentur | SMARD.de", "deprecated_as_returned": false, "top_level_keys": [ "deprecated", "license_info", "price", "unit", "unix_seconds" ], "also_returned_verbatim_by": { "url": "https://api.energy-charts.info/price?bzn=BE&start=2026-09-10&end=2026-09-11", "retrieved_utc": "2026-09-10T07:46:55+00:00", "note": "TARIFF-09's PRE-PUBLICATION case, and it needed no second file because the answer was BYTE-IDENTICAL to the bare-URL capture above - the same 1877 bytes and the same sha256. Asked for two days at 09:46 CEST, before the ~13:00-14:00 CET auction publishes 2026-09-11, the feed returned the ONE day that exists. That is the short answer this card requires to stay a `series` of what exists rather than becoming `no_data`, and the replay re-derives the identity from the bytes rather than restating it." } }, "energy-charts-be-price-2025-09-10-hourly.json": { "url": "https://api.energy-charts.info/price?bzn=BE&start=2025-09-10&end=2025-09-10", "note": "a day BEFORE Belgium's 15-minute MTU (2025-10-01), so the same endpoint answers HOURLY. Kept because the parser must not assume either spacing, and a fixture at only one granularity cannot grade that", "covers_local_day": "2025-09-10 (Europe/Brussels)", "granularity_s": 3600, "intervals": 24, "bytes": 572, "sha256": "03fe41690810df224611f4016899f856457f67a3c12c7654da17b1331ff2eff4", "unit_as_returned": "EUR / MWh", "licence_as_returned": "CC BY 4.0 (creativecommons.org/licenses/by/4.0) from Bundesnetzagentur | SMARD.de", "deprecated_as_returned": false, "top_level_keys": [ "deprecated", "license_info", "price", "unit", "unix_seconds" ] }, "energy-charts-be-price-2026-09-09_2026-09-10-twoday.json": { "url": "https://api.energy-charts.info/price?bzn=BE&start=2026-09-09&end=2026-09-10", "retrieved_utc": "2026-09-10T07:45:49+00:00", "note": "TARIFF-09. A RANGE request, and the counterfactual the ticket is built on: `start`/`end` are INCLUSIVE Brussels calendar dates and this one answers 192 quarter-hours across TWO local days, where the bare `?bzn=BE` of the same endpoint answers 96 across one. The shipped `generic_dayahead` now derives these two dates from the `since`/`until` it is handed.", "covers_local_days": [ "2026-09-09", "2026-09-10" ], "granularity_s": 900, "intervals": 192, "bytes": 3579, "sha256": "4d83f5efb4294a4a682562eac619bf35e45c95edde957bfa94c402e1777cc9b3", "unit_as_returned": "EUR / MWh", "licence_as_returned": "CC BY 4.0 (creativecommons.org/licenses/by/4.0) from Bundesnetzagentur | SMARD.de", "deprecated_as_returned": false, "top_level_keys": [ "deprecated", "license_info", "price", "unit", "unix_seconds" ] } } }