Produktionsaktivierung und Consumer-Abnahme: Altlastenportal-WFS

  • Datum: 26. August 2026
  • Issue: #351
  • Infrastruktur-PRs: #523, #524
  • Consumer-PRs: #525, #526
  • Produktionscommits: 5e2767c03f77330d08f7a8e4045ce4b2ecc75424, 092543b9ac3b4d0fba94ef5d70748bc7bb01939e
  • Quelle / Kanal: altlasten / public
  • Distribution / Capability: altlastenportal-wfs-kontaminierte-flaechen / report_lookup
  • Release: 8ed8d136-f3f8-5a78-946b-4b419a050269
  • Release-Key: 0d0a6bf2-11f7-54af-be08-77a9d8369f63
  • Pointer-Version: 1
  • Status: Quellenrelease und Consumer produktiv aktiviert; API-Hit und No-Hit, Web, PDF, Headless-Ausgabe, Provenienz und öffentliche Dokumentation getrennt rückgelesen.

Aussage dieses Nachweises

Der Altlastenportal-WFS wurde als unveränderlicher, rechte- und qualitätsgebundener Snapshot aktiviert. Der neue Report-Consumer liest ausschließlich den aktiven Release und dessen exakten erfolgreichen Ingest-Lauf aus source_snapshot_runs_current und altlasten_current. Die historische Tabelle altlasten bleibt unverändert und ist kein Fallback.

Quellenaktivierung, Consumer-Deployment und öffentliche Produktabnahme sind getrennte Beweise. Dieser Nachweis verbindet sie, ohne sie gleichzusetzen: Publisher-/PostGIS-Tests belegen den Datenvertrag, CI und Deployment den ausgerollten Build, und die unten dokumentierten öffentlichen Antworten den tatsächlich sichtbaren Produktionszustand.

Reproduzierbarer WFS- und Scope-Vertrag

Der schreibfreie Dry-run 32924190845 las den WFS dreimal vollständig und erhielt drei identische Resultate:

StufeAnzahl
WFS-Features gesamt1.794
Veröffentlichte Altlastengeometrien im Produktscope372
STATUS=Altlast vorgeschlagen ausgeschlossen19
Andere FL_TYP außerhalb des Produktscopes1.403

Die unveränderlichen Manifeste lauten:

BindungSHA-256
Composite05026d1639b247240303fa9fa5e703df447e57e05867e80e0f2a7d143ebb7fdb
Sourcefb0cf929c3f1f4b54e791caf6da42dea1d3e7019b2831ce7b0517afa54c4ee50
Published515e51e5bb1dcc55ea055433cd3b280d5cb95c192cd3347688d4d5792efaa605
Excludedd8e20b751b274d55a5ab5d9c6144bada7eddc1580a0607ab96a56f27a2a78e9b
Scopebf94beba8963123b7a7dd4801e76aafb4040faa79074fcadb0fe57f966628af6

Die Geometrie bleibt vom Abruf bis zur versionierten Speicherung im nativen EPSG:31287. Der Consumer transformiert nur den WGS-84-Adresspunkt und verwendet ST_Covers sowie metrische Entfernung bis 1.000 Meter. UBAID ist die stabile Identität; doppelte ALTNR sind ausdrücklich zulässig.

Candidate, Recovery und Aktivierung

Der erste produktive Candidate-Versuch 32924306822 brach während Migration Statement 4 ab. Statements 1 bis 3 waren bereits additiv angewandt; Candidate, Geometriezeilen und Active Pointer existierten zu diesem Zeitpunkt noch nicht. Die korrigierte idempotente Migration bewahrte diesen Zwischenstand und mutierte den Legacy-Spiegel nicht.

Der erfolgreiche Candidate-Lauf 32925774398 und der explizite Resume-Readback 32925898356 banden dieselbe Release-ID und denselben Release-Key. Der technische Abruf war 2026-08-26T03:16:54.083Z, das Frischefenster lief bis 2026-08-28T03:16:54.083Z. source_vintage ist absichtlich NULL, weil der WFS keinen fachlichen Datenstand nennt.

Der manuell bestätigte Aktivierungslauf 32926014904 setzte den Expected-Current-CAS von keinem Pointer auf Release 8ed8d136-f3f8-5a78-946b-4b419a050269, Pointer-Version 1. Der anschließende Renewal-Lauf 32926111534 las denselben Pointer zurück und blieb wegen ausreichender Frischereserve schreibfrei.

Rechte- und Ausgabevertrag

Der Release ist an den Review-Digest 98369790d461e11c011db19b6fdc5106f52cf9093674fcdc4a7f6c9181beb0a4 und den semantischen Rights-State-Digest 1c4add9f2d3fc0405d71d719729124045b5717551c6d11f852f871c14a57132f gebunden. Freigegeben ist ausschließlich public_display/report_lookup für Österreich.

Jede neue sichtbare Ausgabe trägt:

  • „Datenquelle: Umweltbundesamt“ mit amtlichem Quelllink;
  • die bedingte Weiterverwendung gemäß UBA-Bestätigung vom 11. August 2026;
  • den technischen WFS-Abruf als solchen, nicht als fachlichen Stand;
  • den Änderungs- und Scope-Hinweis;
  • „Nicht-Listung garantiert keine Schadstofffreiheit“.

Rohgeometrieexport, Weiterverteilung, Derivate, ML-/AI-Nutzung und eine allgemeine kommerzielle Lizenzbehauptung sind nicht geöffnet.

Lokale Consumer-Gegenprobe

Die fokussierte Abnahme umfasst Unit-, Contract-, OpenAPI-, Web-, PDF- und Legacy-Kompatibilitätstests. Zusätzlich führt tests/integration/altlasten-publisher-postgres.e2e.mjs den tatsächlichen Consumer-SQL-Pfad gegen PostgreSQL 16 / PostGIS aus und belegt:

  • vor Aktivierung keine sichtbare Consumerzeile;
  • Innen- und exakten Randtreffer über ST_Covers;
  • metrisch nächsten Treffer innerhalb 1 km;
  • getrennte UBAID trotz doppelter ALTNR;
  • echten No-Hit als aktive Provenienzzeile ohne räumlichen Kandidaten;
  • sofortiges fail-closed bei Rights-Drift;
  • unveränderten Legacy-Spiegel.

Fehlender, abgelaufener oder rechtegedrifteter Active Release wird im Report als degraded ausgegeben und niemals als grüner Nullbefund. Technische Fehlerlogs enthalten weder SQL-Parameter noch Koordinaten.

Der für PR #525 gepushte Ausgangscommit 377bd94 bestand lokal die vollständige Vitest-Suite mit 259 grünen Testdateien und 3.328 bestandenen Tests bei 25 bewusst übersprungenen Fällen. Zusätzlich waren ESLint, TypeScript, Content-/SEO-Audit, der Next.js-Produktionsbuild, die Österreich-Adapter-QA mit 19/19 ausführbaren Regionen sowie der echte PostGIS-E2E grün.

Der live gefundene Darstellungsrandfall eines reinen Nähetreffers wurde in PR #526 geschlossen. Der grüne CI-Lauf 32930236281 bestand in 11:42 Minuten unter anderem 259 Testdateien mit 3.332 bestandenen und 25 bewusst übersprungenen Tests, TypeScript, ESLint sowie die vorhandenen FND-, Export- und PostGIS-Verträge. Die neuen Gegenproben zeigen zugleich, dass eine historische Near-Referenz ohne amtliche UBAID nicht zur UBAID aufgewertet wird.

Öffentlicher Consumer-Readback

PR #525 wurde als Commit 5e2767c03f77330d08f7a8e4045ce4b2ecc75424 produktiv ausgerollt. Der Main-CI-Lauf 32929693278 und der Vercel-Produktionsstatus 7edf6eYsDdFgHyGVUpaf8ERDeujV waren grün. Öffentliche Readbacks bestätigten:

  • GET /api/v1/data-sources/altlasten/provenance liefert Release, Release-Key, Pointer-Version 1, report_lookup, source_vintage=null, den technischen Abruf 2026-08-26T03:16:54.083Z und einen frischen Zustand;
  • Tanklager Lobau, 1220 Wien liefert einen gültigen Nähetreffer in 703 m mit UBAID 72113, exakter Release-Provenienz und ohne Altlasten-Degradation;
  • Rathausplatz 1, 2230 Gänserndorf liefert einen gültigen No-Hit mit derselben aktiven Provenienz und ebenfalls ohne Altlasten-Degradation;
  • beide nicht persistierenden API-Antworten waren 200 und Cache-Control: private, no-store; der API-Pfad trug den jeweiligen exakten X-Deploy-Commit;
  • die öffentliche Coverage-Matrix lieferte Version 2026-08-26.altlasten-report-exclusion-v1, 34 Lanes, 306 Zellen und die Verteilung 54/11/18/16/207. Altlasten blieb korrekt report-only und erzeugte keine site-check-Lane.

Für den Web-/PDF-Nachweis wurde genau ein nicht personenbezogener, industrieller Pilotreport im normalen anonymen 90-Tage-Lifecycle gespeichert: uTyjyJYlZbOh1GDPxLdB37. Sein gespeichertes JSON enthält den 703-m-Treffer, UBAID 72113, den exakten Release und die vollständige UBA-Attribution. Web und PDF zeigten zunächst Entfernung und Provenienz; dabei wurde entdeckt, dass die UBAID bei einem reinen Nähetreffer in diesen Präsentationspfaden fehlte.

PR #526 korrigierte Web, PDF-Risikotabelle, Steckbrief und Headless-Skill und wurde als Commit 092543b9ac3b4d0fba94ef5d70748bc7bb01939e ausgerollt. Das erfolgreiche GitHub-Produktionsdeployment 6097219763 verweist auf den Vercel-Status HDZTgos4ch7eVmGC9kRW3VpksoYd. Der anschließende öffentliche Gegencheck bestätigte:

  • ein frischer, nicht persistierender API-Hit mit X-Deploy-Commit: 092543b9ac3b4d0fba94ef5d70748bc7bb01939e, private, no-store, 703 m, UBAID 72113 und dem exakten Release;
  • Web: „Keine Altlast am Adresspunkt — nächste veröffentlichte Altlast ca. 703 m entfernt (UBAID 72113)“;
  • PDF: application/pdf, private, no-store, 225.209 Bytes, gültiger %PDF--Header sowie „Veröffentlichte Altlast ~703 m entfernt (UBAID 72113)“, UBA-Attribution und exakte Release-ID im extrahierten Text;
  • Headless-Skill: „Keine Altlast am Punkt; nächste ~703 m (UBAID 72113)“ zusammen mit technischem WFS-Abruf, Release und amtlichem Quelllink.

Gespeicherter Report und PDF senden bewusst keinen eigenen X-Deploy-Commit-Header; ihre Prüfung wird daher nicht fälschlich über diesen Header behauptet. Die Zuordnung zum ausgerollten Fix stützt sich auf das erfolgreiche Produktionsdeployment, den exakten Commit des frischen API-Hits und die erst durch #526 mögliche sichtbare Near-Hit-Zeichenfolge. Für den Nachzug wurde kein zweiter Report gespeichert.

Die öffentlichen Seiten /docs/feature-altlasten, /docs/altlasten-produktionsnachweis-2026-08-26, /methodik und /briefing lieferten 200 und die erwarteten Scope-, Release-, Quellen- und Matrixangaben. Damit sind Quellenrelease, Consumer, Ausgaben und Dokumentation produktiv abgenommen; die dokumentierten fachlichen und rechtlichen Grenzen bleiben unverändert.