Skip to content

v3.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Aug 10:51
· 83 commits to main since this release
177b3be

Geändert / Changed — Breaking

  • bakom_aktuell liefert keine Highlights mehr, sondern Datensätze. Der
    Antwortschlüssel highlights ist durch datensaetze ersetzt (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_suche nennt opendata.swiss als Quelle. Bisher trug jede
    Antwort "datenquelle": "BAKOM RTV-Datenbank", obwohl die Daten aus dem
    CKAN-Katalog kamen. Der Schlüssel rtv_datenbank heisst jetzt
    hinweis_senderdaten, und suchanfrage.filterung sagt, dass kanton und
    media_type die Volltextsuche gewichten statt exakt zu filtern.

  • Entfernte Modul-Konstanten: RTV_DB_API, GEO_ADMIN_IDENTIFY und
    GEO_ADMIN_FIND. Alle drei waren definiert und wurden nirgends gelesen.

  • Egress-Allowlist: rtvdb.ofcomnet.ch entfernt, lindas.admin.ch
    aufgenommen.

Hinzugefügt / Added

  • bakom_medien_statistik — Marktanteile, Reichweiten, Programm- und
    Ertragsstruktur aus den BAKOM-Cubes auf LINDAS (SPARQL, Architektur A).
    Ohne thema listet 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 Label live-test-failure.

  • .pre-commit-config.yaml mit derselben gepinnten ruff-Version wie die
    CI, und scripts/check_version_sync.py erzwingt jetzt, dass alle vier
    ruff-Stellen übereinstimmen.

  • CLAUDE.md mit 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 zu tests/test_live.py konsolidiert, prüft Antworten auf
    Fehlertexte und erreicht die Quellen wieder.

  • bakom_aktuell verschluckte 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 mit mcp.streamable_http_app() ohne host gebaut. Unter mcp 2.x
    ist das kein neutraler Default: das SDK leitet daraus seine Host-Allow-List ab
    und aktiviert bei loopback-artigem Wert automatisch 127.0.0.1:*. Da das
    Argument selbst auf 127.0.0.1 defaultet, traf das jeden Start mit
    BAKOM_MCP_HOST=0.0.0.0. Vor der Migration auf 2.x ging host an 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_HOSTS gebaut. 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
    fehlende host-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 den host-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