PDF & teilbarer Link
PDF-Layout: Entscheidungsüberblick und Altlastenhinweis (#558)
Der öffentliche React-PDF-Renderer setzt Kennzahl und vollständige Erklärung in getrennte Textblöcke. Der Altlastenhinweis beginnt bei seiner Ergebniszeile; lange Hinweise dürfen vollständig weiterfließen. Acht synthetische Geometrie-/Paginierungsfälle ergänzen beide Poppler-Backends und die bisherigen Mehrseitenregressionen. Fachliche Ampeln und Reportdaten bleiben erhalten. Vertrag und Abnahmestand unterscheiden lokale Prüfung, finalen PR/Preview und den anschließenden Produktions-Readback. PDF/UA #333 und der mobile Slice #557 bleiben getrennt.
Status: Live · Report als PDF herunterladen oder per Link teilen.
Jeder erfolgreich gespeicherte Report kann als PDF heruntergeladen und über einen stabilen Permalink weitergegeben werden — an Gemeinde, Planer oder Bank.
Optionaler Quellenanhang
Neben „PDF herunterladen“ steht für gespeicherte Reports „Quellenanhang (PDF)“ bereit. Die Nummern der kurzen Quellenhinweise im Report führen zu den vollständigen Belegen im separaten Anhang. Beide Downloads gehören zur gleichen Report-ID und zum gleichen gespeicherten Datenstand; es wird dafür kein neuer Report erstellt. Quellen, Lizenzen, bekannte Abrufstände und ausführliche Herkunftsangaben bleiben nachvollziehbar. Wichtige Einschränkungen, Datenlücken und der Status unbestätigter Entwürfe stehen weiterhin direkt im Report.
Ohne erfolgreich gespeicherten Report sind beide Downloads nicht verfügbar. Für abgelaufene oder unbekannte Reports gibt es keinen Quellenanhang. Der Quellenanhang ist wie das Haupt-PDF noch nicht als PDF/UA-konform abgenommen.
Datenquellen
Datenbasis ist primär der bereits erzeugte, serverseitig persistierte Report. Das PDF enthält zusätzlich einen statischen Risiko-Zonen-Kartenausschnitt, der eine basemap.at-Graukarte (CC BY 4.0) und halbtransparente WMS-Overlays (Wildbach/Lawine, Schutzgebiete, Lärm) deckungsgleich stapelt — nur verifizierte Bild-Quellen landen im PDF (Timeout-Vorabprüfung); ohne Koordinate oder bei Quellen-Ausfall rendert das PDF unverändert ohne Karte.
- Persistierung in der Tabelle
reports. Scheitert das Speichern, bleibt das Report-Ergebnis verfügbar, aber ohne Permalink und PDF-Download. - PDF-Erzeugung serverseitig mit
@react-pdf/renderer(kein Headless-Browser).
Was hinter den Zahlen steht
Webreport und Haupt-PDF erklären die vier Lageindikatoren gemeinsam:
- Breitband: Ein Kartenfeld von 100 × 100 m beschreibt die gemeldete Festnetzversorgung der Umgebung. Die Downloadangabe belegt keinen Glasfaseranschluss am Haus. Förderhinweise bleiben davon getrennt; ihr Fehlen ist kein Beleg gegen Ausbaupläne.
- Nahversorgung: Bei der bekannten 900-m-Methode zählt jede der fünf Kategorien mit mindestens einem OSM-Eintrag 20 Punkte. Die vorhandenen Kategorien und die Gesamtzahl erfasster Einträge stehen dabei. Luftlinie ist keine berechnete Gehstrecke oder Gehzeit; fehlende Einträge können Erfassungslücken sein. Historische oder unbekannte Methoden behalten ihre gespeicherten Kategorien, Radiusangaben, Bewertungen und Hinweise.
- Pendeln: Gemeindestatistik ordnet das Verhältnis von Wohnen und Arbeiten ein. Arbeitsstätten und Beschäftigte am Arbeitsort sind keine offenen Stellen und kein Nachweis der Qualität des Arbeitsangebots.
- Umgebungsstruktur: LCZ (Local Climate Zones) beschreibt Bebauung und Bodenbedeckung anhand der häufigsten Klasse in 5 × 5 Rasterzellen (rund 500 m Nord-Süd × 335 m Ost-West). Anteil und Modell-Konfidenz bleiben sichtbar. Die Beschreibung ersetzt weder Flächenwidmungs- noch Bebauungsplan und enthält keine Baufreigabe.
Fehlende Indikatoren erhalten durch diese Erklärungen keine erfundenen Befunde. Datenstände, Warnungen, Quellenverweise und Quellenanhang bleiben maßgeblich; die Erklärungen ändern keine Reportdaten oder API-Felder.
Die ersten beiden Szenarienkarten stehen im Haupt-PDF untereinander in voller Breite. Ihre Inhalte können weiterfließen, damit geänderte Umbrüche keine leeren Folgeseiten oder abgeschnittenen Langtexte erzeugen. Die weiteren Szenarienkarten behalten die kompakte Spaltendarstellung.
PDF und Permalink basieren auf dem gespeicherten Report; sie starten keine neue Standortabfrage oder Szenarioberechnung. Die Ansicht kann jedoch vom historischen JSON-Snapshot abweichen: Alte PV-Gesamt- und Kostenhochrechnungen werden unterdrückt (PV-Vertrag); bekannte POI-Alttexte werden als Luftlinien-Näherung dargestellt, ohne Score, Kategorien oder Ampel zu verändern (POI-Vertrag). Beim Lesen werden außerdem historische Herkunftsbezeichnungen auf Rollenbezeichnungen normalisiert und die Breitbandklasse aus dem gespeicherten Downloadwert abgeleitet (auch in der gespeicherten Report-API). Diese Korrekturen schreiben den gespeicherten Snapshot nicht um. Das nicht persistierte Google-Solar-Overlay eines ursprünglichen Reports ist im Permalink und PDF nicht enthalten.
Sicherheits-/Aufbewahrungslogik:
- Permalink-ID: zufällig, ≥ 128 Bit (nicht erratbar/zählbar).
- Aufbewahrung: Anonyme Reports laufen nach 90 Tagen ab; in einem Konto gespeicherte Reports bleiben dauerhaft erhalten (abrufbar unter „Meine Reports“).
- Datensparsamkeit: statt IP wird nur ein pseudonymer Hash gespeichert.
Viewer-Kompatibilität
Mehrseitige Free- und Premium-PDFs werden im lokalen Job pdf_poppler von
npm run check:local vollständig mit beiden Poppler-Backends gerendert.
Dafür muss Poppler lokal installiert sein; fehlt es, meldet der Lauf den
Job als übersprungen. Die GitHub-CI ist seit 5. Oktober 2026 absichtlich
ausgeschaltet; datierte CI-Nachweise unten dokumentieren frühere Läufe.
Jede physische Seite muss einen weißen Hintergrund behalten; schwarze oder
unerwartet leere Seiten lassen die Prüfung scheitern. Dafür muss jede
erwartete Seite mehrere seitenspezifische Body-Marker
enthalten und im um Kopf, Fuß und Rand beschnittenen Seitenkörper sichtbar
bedruckt sein; wiederholte Kopf- und Fußzeilen oder unsichtbare Textobjekte
reichen nicht. Textauswahl, Links, Metadaten, Dokumentensprache und die Folge
„Seite X / Y“ werden gemeinsam geprüft.
Der produktive Stand ist zusätzlich über alle Seiten in Chromium/PDFium und Apple Vorschau verifiziert. Der Produktionsnachweis nennt Viewer-Versionen, Seitenzahlen, Hashes, CI- und Deployment-Bindung. Diese Viewer-Härtung ist noch keine vollständige PDF/UA-Zertifizierung; der semantische Barrierefreiheitsausbau bleibt in #333 getrennt offen.
Barrierefreiheit: aktueller Stand
Die Textschicht ist auswählbar, das Dokument trägt de-AT, Metadaten und eine
Outline, und Links bleiben als Linkobjekte erhalten. Das verbessert Zugang und
Navigation, ist aber keine PDF/UA-Zusage: Der aktuelle React-PDF-Output besitzt
noch keinen nachgewiesenen vollständigen Tag-Baum für Überschriften, Absätze,
Listen und Tabellen. Karten-Alternativtexte, Artefaktmarkierung des
wiederkehrenden Seiten-Chrome und die Lesereihenfolge mit Screenreader sind
ebenfalls noch nicht vollständig abgenommen.
ADR-0059 bereitet deshalb zunächst einen
synthetischen PDF/UA-1-Machbarkeitstest mit unabhängiger Validatorprüfung und
einer negativen React-PDF-Gegenprobe vor. Dieser Slice verwendet nur erfundene
Daten und verändert den Produktionsrenderer nicht. Der lokale Validatorlauf
ist auf Commit dbd46f3c3a94 bestanden; Linux-CI-Lauf 32951907614 bestätigte
den Vertrag mit 106/106 Regeln und 4.645/4.645 Checks, trennscharfer
React-PDF-Gegenprobe und ohne veröffentlichte PDF-Datei. Slice A ist damit
abgeschlossen. Der Evidenzstand ist im
Machbarkeitsnachweis
dokumentiert.
ADR-0060 setzt Slice B als ausschließlich
internen Vercel-Preview-Shadow um. Er verwendet pdfkit@0.20.1 in reinem
Node.js; Stock @sparticuz/chromium wurde wegen des fehlenden belastbaren
Tagged-PDF-Buildpfads verworfen. POST /api/internal/pdf-ua-shadow/[tier]
akzeptiert nur free, standard, premium und planer, nur bei
VERCEL_ENV=preview und ohne Query oder Body. Produktion, Development, die
unterstützten Nicht-POST-Methoden und ungültige Tiers erhalten absichtlich
404; andere framework- oder proxyseitig behandelte Methoden können schon
vor dem Handler einen abweichenden 4xx liefern. Vercel Deployment Protection
bildet die äußere Schranke; ein neuer Shadow-Token ist nicht vorgesehen.
Die Route liegt außerhalb der Auth.js-Hülle, liest keine App-Sitzung und setzt
auf den PDFs keine Auth.js-CSRF-/Callback-Cookies.
Alle Inhalte sind fest und erfunden. Der Pfad liest weder Reportdaten noch
Datenbank, Session oder Provider, verarbeitet keine PII und führt keinen
Netzwerkaufruf aus. Jeder Tier-Output besitzt exakt fünf Seiten, zwei
informative Figuren mit Alternativtext und zwei Links. Standard/Premium
enthalten feste Szenario-Narrative, Premium/Planer einen festen synthetischen
Google-Solar-Block. Der veraPDF-/Poppler-Lauf ist für alle vier Tiers lokal,
in CI und im geschützten Preview grün. Commit, CI- und Preview-IDs sind im
Slice-B-Nachweis gebunden; der
absichtliche Produktions-404 ist für alle vier Tier-POSTs und einen GET auf
dem exakten Merge-SHA belegt. Der öffentliche React-PDF-Pfad blieb auf
demselben Stand unverändert und ist weiterhin nicht als PDF/UA getaggt.
ADR-0061 führt darauf aufbauend Slice C ein.
Der Preview-Shadow erhält jetzt vier repository-fixierte, erfundene Objekte
des tatsächlich deployten Report-Typs. Ein fail-closed Mapper übernimmt nur
die freigegebenen Tier-, Zeit-, Flächen-, Risiko-, Szenario-, Förder- und
Solarfelder. Adresse, Koordinate, Kataster-, Quellen-, Disclaimer- und
Provider-Rohfelder erscheinen nicht in der PDF-View. Der
Slice-C-Nachweis besteht für
alle vier Tiers lokal und im geschützten Preview mit veraPDF und beiden
Poppler-Backends; Commit, Deployment, Header, Request-IDs und negative Pfade
sind gebunden. Route und Produktionstrennung bleiben unverändert; die
Preview-Antwort ist als slice-c-1 gekennzeichnet.
PR #537 wurde als 59036df7aca8a70025efcbf8f0d8dd467700cb9c
gemergt. Produktionsdeployment dpl_FbKhtfArLz6wnDTAaRn3aq1bVJh9 bestätigte
für alle vier Tier-POSTs und einen GET leere private 404-Antworten; der
Shadow ist damit weiterhin keine öffentliche Produktfunktion.
Auch dieser bestandene Shadow ist erst die Grundlage für die weiterhin offene vollständige Realreport-, Viewer-, Rollout-, Live- und Screenreader-Abnahme, nicht deren Ersatz. Der öffentliche React-PDF-Pfad bleibt unverändert und Issue #333 bleibt offen.
ADR-0062 führt Slice D als repräsentativ vollständigen synthetischen Reportvertrag ein. Exakt 31 geordnete Sektionen decken Lage, Umwelt, Restriktionen und Governance ab. Drei informative Figures beziehen ihre Alternativtexte aus Fixture-ID und Fläche, vier gemappten Risikobereichen sowie allen sechs Szenariokosten. Der achtseitige Vertrag mit zwei Links und 16 Pagination-Artefakten besteht lokal für alle vier Tiers mit veraPDF und beiden Poppler-Backends.
Der Slice-D-Nachweis bindet
die lokale Prüfung, den geschützten Preview
dpl_Ew4nDGJZYUX9fRyiNSuqSz8FFutU, CI, Merge-Commit
056eafb0eddd0ec6369f71db65862f37b788b152 und Produktionsdeployment
dpl_2bsKrqhys1CuRFQV6QUV6HiSJghg. Die Route bleibt Preview-only und ohne
DB-, Session-, Provider-, Adress-, Koordinaten- oder Netzwerkzugriff;
erfolgreiche Preview-Antworten sind als slice-d-1 gekennzeichnet, während
alle vier Tier-POSTs und ein GET in Produktion leer 404 antworten.
Der öffentliche React-PDF-Pfad bleibt unverändert. Echte gespeicherte Reports,
Viewerregression, kontrollierter Produktrollout, Live-Readback und manuelle
Screenreader-Abnahme bleiben offen.
ADR-0063 bindet Slice E an den
tatsächlichen Store-Vertrag: Alle vier synthetischen Tiers werden mit den
exakten saveReport()- und getReport()-SQL-Abfragen als PostgreSQL-jsonb
gespeichert, wieder gelesen und erst danach gerendert. Das isolierte Testschema
wird nach dem Lauf entfernt. Die Prüfung belegt zugleich, dass Google-Solar-
Rohdaten nicht persistiert werden und Report-ID, Adresse, Eigentümer-ID sowie
exakter Opt-in-Zeitpunkt die Renderer-View nicht erreichen.
Der Slice-E-Nachweis bindet
lokale Tests, PostgreSQL-Roundtrip, veraPDF, Poppler und den visuellen
Achtseiten-Readback. Der Preview-Shadow selbst liest keine Datenbank, sondern
eine repository-fixierte persistenznormalisierte Kopie; erfolgreiche
Antworten tragen slice-e-1. Der öffentliche React-PDF-Pfad bleibt
unverändert. Karten-/Viewerregression, kontrollierter Produktrollout,
PDF/UA-Live-Readback und manuelle Screenreader-Abnahme bleiben offen.
PR #541, CI-Lauf 33163812578 und der geschützte Preview
dpl_AejPoE9E4Joeh9J1ireiHZdKz7k7 belegen den Vier-Tier-Vertrag. Merge-SHA
f5d57d9ac0b4c57a576fa64b9fbddbff49ef8726 und Produktionsdeployment
dpl_GqMcWA5uHvML97ZrciT4dkzPKoQD halten die interne Route für alle vier
Tier-POSTs und einen GET leer 404; dies aktiviert keinen öffentlichen
PDF/UA-Pfad.
ADR-0064 ergänzt Slice F als
automatisierten lokalen Apple-Viewercheck. Apple PDFKit liest alle vier
synthetischen slice-e-1-Dateien mit je acht Seiten, zwei Linkannotationen und
seitenspezifischer Textschicht. Quartz rendert alle 32 Seiten in Graustufen und
wendet dieselben Grenzen für helle Ränder, Helligkeit, Schwarzflächen und
sichtbaren Body-Ink wie der Poppler-Vertrag an.
Der Slice-F-Nachweis belegt
lokal 32/32 Seiten auf macOS 26.6.2 mit Swift 6.3.3. PR #543, CI-Lauf
33166935667 und Preview dpl_5NCcXGThbbpocRGCsfhS2VsZMg5H belegen auch den
Apple-Readback aller vier deployten Tiers. Merge-SHA
e998d3e42886adef491eb489f5c8a874aca652a3 und Produktionsdeployment
dpl_D4fhMzmmwCDvhGrTcAN3Mm3TMcEL halten die interne Route für vier
Tier-POSTs und einen GET leer 404.
Die nachgelagerte manuelle Abnahme vom 4. September 2026 prüfte die exakt SHA-256-gebundene synthetische Premium-Preview-Datei mit Apple Vorschau 11.0 und aktivem VoiceOver. Alle acht Seiten waren vollständig sichtbar und per Tastatur erreichbar; Überschriften, Tabellen, Listen, drei beschriebene Abbildungen und zwei benannte Links wurden nativ exponiert. VoiceOver wurde danach wieder ausgeschaltet.
Der öffentliche React-PDF-Pfad bleibt unverändert. Chrome/PDFium-Tag-Semantik, echte Karten, kontrollierter Rollout und PDF/UA-Live-Readback eines echten Nutzerreports bleiben offen.
Der Implementierungsstand wurde mit PR #532 als Merge-Commit
e39272c56134bfbe4c9f3b7789e872baa88706e8 übernommen. Main-CI-Lauf
32954309960 und Vercel-Produktionsdeployment
dpl_27B3QDZtKAyT7kEi3xe1rFWk1qWB sind daran gebunden; Entscheidung,
Machbarkeitsnachweis, Report-Output-Vertrag und diese Feature-Seite wurden auf
www.landnutzen.at mit HTTP 200 und der weiterhin offenen Produktgrenze
rückgelesen.
Grenzen & Ehrlichkeit
- Ein Permalink ist eine Momentaufnahme der Datenlage zum Erstellungszeitpunkt — Quellen können sich später ändern.
- Nach Ablauf der 90 Tage ist der Link anonymer Reports nicht mehr abrufbar; konto-gebundene Reports bleiben erreichbar.
Chrome/PDFium-Viewerregression (#333, Slice G)
Slice G ergänzt den echten Chrome/PDFium-Viewer für vier synthetische Tiers mit je acht Seiten. Der gepinnte Chrome for Testing 148.0.7778.96 prüft vollständige A4-Seiten, seitenspezifischen Text und benannte Links. Darstellung und Tag-Semantik sind getrennte Gates: Im Standardviewer fehlen Tabellen-, Listen- und Bildrollen. Ein grüner Darstellungscheck ist deshalb keine vollständige Chrome-Barrierefreiheitsabnahme.
Der öffentliche React-PDF-Pfad bleibt unverändert, der Shadow bleibt
slice-e-1 und Preview-only. Chrome-Tag-Semantik, echte Karteninhalte,
kontrollierter Produktrollout und PDF/UA-Live-Readback eines echten
Nutzerreports bleiben offen; Issue #333 bleibt offen.
Vertrag und verifizierter Release-Stand: Slice-G-Entscheidung
und Slice-G-Nachweis.
Slice G wurde über PR #548 produktiv ausgeliefert: Merge
8ccc9fe28236c894bee69de5502ff11b98c592c0, Deployment dpl_Y8GsNSbTzn5swXMfVsxU7Zt5QRiw,
Main-CI 33914599076.
Lokal, im Linux-CI und mit den deployten Preview-Dateien bestanden 32/32
Chrome/PDFium-Seiten; sechs Dokuportalseiten und die geschlossene
Shadow-Produktionsgrenze wurden live rückgelesen. Die Chrome-Tag-Semantik
bleibt ausdrücklich nicht abgenommen. Der Slice-G-Nachweis
enthält die commitgebundenen Prüfergebnisse.
PDF/UA-Parzellengeometrie (#550, Slice H)
Slice H ersetzt die feste Grundstücksskizze im geschützten synthetischen
Shadow durch validierte Polygon-/MultiPolygon-Vektoren. Der optionale interne
Eingang bindet den bestehenden pdf_parcel_outline-Export an den Reporthash
und Public-/Export-Release. Rechte, Coverage, Frische und Consumerbindung
bleiben Voraussetzung. Fehlende oder abgelehnte Geometrie erzeugt einen
Absatz statt einer Figure; Innenringe werden sichtbar als nicht unterstützt
abgelehnt. Alt-Text, hervorgehobener Treffer, Nachbarn, Nordrichtung sowie
Herkunft und Lizenz folgen dem tatsächlichen Eingang.
Der positive Slice-H-Previewbeleg bleibt ausdrücklich synthetisch. Der damalige fehlende echte Geometriebeleg wird im getrennten Slice I weitergeführt; dessen aktueller Abnahmestand steht im verlinkten Slice-I-Nachweis. Chrome-Tag-Semantik, weitere Karten, Produktrollout und echter PDF/UA- Nutzerreport bleiben offen; #333 bleibt offen. Der öffentliche Renderer bleibt React-PDF. Slice-H-Vertrag und Slice-H-Nachweis trennen lokale Implementierung, CI/Preview, Produktion und Live-Readback.
PDF/UA: echte interne Parzellenreferenz (#553, Slice I)
Slice I ergänzt einen festen internen QA-Einstieg für den vorhandenen anonymen
Schul-Referenzreport aus dem DXF-Produktionsnachweis. Ein enger lesender Selektor,
getReport, die atomaren pdf_parcel_outline-Gates und wiederholte Report-/
Quellenprüfung binden genau eine Zielparzelle an die finalisierte PDF/UA-Figure.
Es gibt keine neue HTTP-Route und keine frei wählbaren Report- oder Geometrieeingaben.
Der eigene QA-Mapper bewahrt die echte Reportidentität. Zielparzelle, Schuladresse, gespeicherte DKM-Fläche und BEV-Herkunft sind real; alle übrigen Prüfbestandteile bleiben sichtbar synthetisch. Die vorhandene Kartenadapter-Vereinfachung von 23 Originalstützpunkten auf neun Koordinaten ist von der unveränderten Auswahl und metrischen Projektion getrennt mit Hashes belegt. Innenringe der Zielparzelle, Mehrdeutigkeit sowie negative Rechte-/Release-/Coverage-/Quality-/Freshness-/ Quarantänegates bleiben gesperrt. Das H-Chrome-Profil 20/7/6/3/2 bleibt erhalten; I hat ein eigenes semantisches 20/7/6/3/4-Profil.
Die echte interne Referenz ist auf Merge 5609b182db810983e0240eacbab5cfce2eb9ac5a
mit aktueller Produktionsquelle lesend geprüft. PR #554,
der gebaute Preview und zwölf schreibfreie Produktionschecks sind bestanden.
Die vollständige Main-CI 33953550809 ist grün. READY-Deployment dpl_FDEorR7WyuagkPvSw281WnREWSXB
und getrennte CLI-/HTTP-Belege stehen im Slice-I-Nachweis.
Die reale I-PDF wurde intern erzeugt; die HTTP-Prüfung bestätigt Dokumentation
und Produktionssperre des synthetischen H-Shadows.
ADR-0067 dokumentiert Vertrag und Abnahmetests.
Chrome-Tag-Semantik, weitere echte Karten, öffentlicher PDF/UA-Rollout und echter
PDF/UA-Nutzerreport bleiben offen; #333 bleibt offen. Öffentlicher React-PDF-Pfad
und synthetischer Preview bleiben erhalten. Es wurde kein neuer Report angelegt.
Nachtrag 30. September 2026: Nach der BEV-Erneuerung vom 29. September 2026 liefert der Adapter für den ursprünglichen Referenzreport keine Geometrie mehr, weil Exporte releasegebunden sind. Die Referenz-QA wurde deshalb auf einen neuen anonymen Referenzreport derselben Adresse neu gebunden (ADR-0067, Nachtrag vom 30. September 2026); der anschließende lesende Produktionslauf bestand vollständig. Die Chrome-Tag-Semantik bleibt offen. Der anonyme Referenzreport läuft nach 90 Tagen ab (29. Dezember 2026); danach und nach jeder Neuqualifizierung des BEV-Public- oder -Exportkanals ist neu zu binden.