Geändert / Changed — Breaking
-
bakom_aktuellliefert keine Highlights mehr, sondern Datensätze. Der
Antwortschlüsselhighlightsist durchdatensaetzeersetzt (titel,
aktualisiert,beschreibung,url). Der alte Name versprach eine
redaktionelle Auswahl, die es nie gab: die Einträge stammten aus einem im
Quellcode gepflegten Block, dessen jüngster Eintrag auf März 2026 datierte.
Geliefert werden jetzt BAKOM-Datensätze aus dem opendata.swiss-Katalog,
sortiert nach letzter Änderung. -
bakom_rtv_suchenennt opendata.swiss als Quelle. Bisher trug jede
Antwort"datenquelle": "BAKOM RTV-Datenbank", obwohl die Daten aus dem
CKAN-Katalog kamen. Der Schlüsselrtv_datenbankheisst jetzt
hinweis_senderdaten, undsuchanfrage.filterungsagt, dasskantonund
media_typedie Volltextsuche gewichten statt exakt zu filtern. -
Entfernte Modul-Konstanten:
RTV_DB_API,GEO_ADMIN_IDENTIFYund
GEO_ADMIN_FIND. Alle drei waren definiert und wurden nirgends gelesen. -
Egress-Allowlist:
rtvdb.ofcomnet.chentfernt,lindas.admin.ch
aufgenommen.
Hinzugefügt / Added
-
bakom_medien_statistik— Marktanteile, Reichweiten, Programm- und
Ertragsstruktur aus den BAKOM-Cubes auf LINDAS (SPARQL, Architektur A).
Ohnethemalistet das Tool die 73 veröffentlichten Auswertungen, bei
mehrdeutigem Thema die Kandidaten, bei exaktem Titel die Beobachtungen.
Die Abdeckungsgrenze steht in der Tool-Description: die Cubes decken die
untersuchten Programme ab, nicht den Bestand. -
Geplanter Live-Test-Workflow (
live-tests.yml, täglich 05:17 UTC).
Ein Fehlschlag wird einmal wiederholt; bleibt es rot, öffnet der Workflow
ein Issue mit Labellive-test-failure. -
.pre-commit-config.yamlmit derselben gepinnten ruff-Version wie die
CI, undscripts/check_version_sync.pyerzwingt jetzt, dass alle vier
ruff-Stellen übereinstimmen. -
CLAUDE.mdmit den portfolio-weiten Konventionen und den
repo-spezifischen Befunden.
Behoben / Fixed
-
Antennen-Distanzen waren immer
null. geo.admin.ch liefert
Punktgeometrien als{"points": [[east, north]]}; gelesen wurde die
Esri-Kurzform{"x": …, "y": …}. Damit hatte die Sortierung nach Distanz
nichts zu sortieren und die Markdown-Tabelle druckte für jede Anlage «–». -
Die Live-Test-Suite konnte nicht rot werden. Vier Module aus
Skript-Zeiten fingen jede Exception ab und buchten sie auf einen
modulweiten Akkumulator; 66 von 78 Aufrufen scheiterten seit dem
Lifespan-Refactor an der Tool-Signatur, ohne dass pytest etwas sah. Die
Suite ist zutests/test_live.pykonsolidiert, prüft Antworten auf
Fehlertexte und erreicht die Quellen wieder. -
bakom_aktuellverschluckte CKAN-Fehler (except Exception: pass) und
fiel bei unbekanntem Thema still auf die Medien-Einträge zurück — eine
Antwort zu «quantenverschluesselung» enthielt die SRG-Initiative. Beides
entfernt; Fehler laufen über_raise_api_error, ein unbekanntes Thema
ergibt eine leere Liste mit Hinweis. -
Streamable-HTTP wies unter jedem echten Hostnamen mit 421 ab (SEC-005).
Die App wurde mitmcp.streamable_http_app()ohnehostgebaut. Unter mcp 2.x
ist das kein neutraler Default: das SDK leitet daraus seine Host-Allow-List ab
und aktiviert bei loopback-artigem Wert automatisch127.0.0.1:*. Da das
Argument selbst auf127.0.0.1defaultet, traf das jeden Start mit
BAKOM_MCP_HOST=0.0.0.0. Vor der Migration auf 2.x ginghostan den
FastMCP-Konstruktor, wo dieselbe Logik den echten Bind sah und den Schutz
korrekt ausliess.Der Bind reist jetzt in die App, und eine echte Allow-List wird aus dem neuen
BAKOM_MCP_ALLOWED_HOSTSgebaut. Ohne diese Variable bleibt der Schutz auf
einem Nicht-Loopback-Bind bewusst aus und der Aufrufer warnt — eine geratene
Liste wäre genau der 421-Fall. -
App-Bau aus dem
__main__-Block herausgezogen. Er lag vollständig inline,
weshalb kein Test die Transport-Verdrahtung sehen konnte — genau so blieb der
fehlendehost-Kwarg unbemerkt.build_http_app()und
build_transport_security()sind jetzt normale Funktionen; die 13 neuen Tests
prüfen die gebaute App, nicht nur ihre Bauteile.Darunter der tragende Fall „richtiger Hostname, falscher Port" — nur er
unterscheidet eine portgenaue Allow-List von einer, die alles durchlässt.
Mutationsgetestet: nimmt man denhost-Kwarg wieder weg, reproduziert der
Test das 421.Geprüft mit allen vier CI-Gates: 76 passed / 78 deselected,
ruff check src/,
ruff format --check src/, Versions-Sync OK.
What's Changed
- fix(ci): Produkt-Token im Versions-Check normalisiert vergleichen by @malkreide in #41
- Lint-Schuld in tests/ tilgen, Formatgate ergänzen und ruff-Version pinnen by @malkreide in #42
- docs: CLAUDE.md — Konventionen + verifizierte Repo-Gates by @malkreide in #43
- build: pre-commit-Config mit gepinntem ruff 0.16.1 by @malkreide in #44
- ci: geplanter Live-Test-Workflow (DRIFT-005) + verschluckte Live-Fehler sichtbar machen by @malkreide in #45
- test: Live-Tests erreichen die Quellen wieder (ctx-Reparatur) by @malkreide in #46
- test: vier Live-Module zu tests/test_live.py konsolidieren (+ Produktivfehler in der Geometrie) by @malkreide in #47
- refactor: tote Konstanten GEO_ADMIN_IDENTIFY und GEO_ADMIN_FIND entfernen by @malkreide in #48
- fix: bakom_rtv_suche behauptet nicht mehr die RTV-Datenbank als Quelle by @malkreide in #49
- feat: bakom_medien_statistik — BAKOM-Medienstatistik über LINDAS by @malkreide in #50
- build: ruff auch im dev-Extra auf 0.16.1 pinnen by @malkreide in #51
- build: check_version_sync erzwingt den ruff-Pin über alle vier Stellen by @malkreide in #52
- fix: statischen Highlights-Block aus bakom_aktuell entfernen by @malkreide in #53
- chore: Release 3.0.0 vorbereiten by @malkreide in #54
Full Changelog: v2.0.4...v3.0.0