PDF/UA-1-Report-Shadow: Slice-C-Nachweis

  • Datum: 28. August 2026
  • Issue: #333 bleibt offen
  • Entscheidung: ADR-0061
  • Branch: codex/pdf-ua-report-shadow-slice-c
  • Implementierungscommit: 37ba1b778297abef4f05dbd33607158e5236b29a
  • Pull Request: #537
  • Merge-Commit: 59036df7aca8a70025efcbf8f0d8dd467700cb9c

Aussagegrenze

Slice C ersetzt die renderer-eigene Slice-B-Direktfixture durch vier repository-fixierte Objekte des deployten Report-Typs und einen expliziten, fail-closed Mapper. Die Objekte sind produktnah strukturiert, aber alle Inhalte sind erfunden. Der Pfad liest weiterhin weder Datenbank, gespeicherte Reports, Session, Provider noch Requestinhalte und führt keinen Netzwerkzugriff aus.

Dieser Nachweis behauptet weder die PDF/UA-Konformität des öffentlichen React-PDF-Outputs noch die Abnahme realer Produktreports. Der öffentliche Renderer bleibt unverändert. Vollständige Realreport-Abdeckung, Viewer-, Rollout-, Produktions- und Screenreader-Abnahme bleiben offen. Der Slice-C-Shadow hat keinen Zugriff auf gespeicherte oder reale Reports.

Implementierter Vertrag

  • feste Produktfixture PDF-UA-REPORT-SLICE-C-1 für alle vier ReportTier;
  • daraus ausschließlich per Mapper erzeugte Renderer-View PDF-UA-SLICE-C-1;
  • Tier, Zeitstand, Fläche, drei Steckbrief-Risiken, sechs Szenarien, drei Förderhinweise und optionaler Solarblock stammen aus realen Report-Feldern;
  • Adresse, Koordinate, Kataster-Rohfelder, Quellen-/Disclaimerobjekte sowie imagery_quality und imagery_date bleiben außerhalb der View;
  • Manipulationen an Fläche, Zeitstand, Kardinalitäten, Risikostatus und Solarwerten schlagen vor dem Renderer fehl;
  • die bestehende Preview-only-Route bleibt ohne Body, Query, Session, Auth.js- Cookies und neuen Shadow-Token geschlossen.

Lokale Verifikation

Code- und Vertragsgates

GateErgebnis
gezielte Fixture-, Mapper-, Runtime-, Finalizer- und Routentests43/43 bestanden
gezielte Dokuportal- und Aussagegrenzentests5/5 bestanden
vollständiger Vitest-Lauf270 Dateien / 3.474 Tests bestanden; 6 Dateien / 39 Tests bewusst übersprungen
npm run typecheckbestanden
npm run lint -- --quietbestanden
npm run build122 Routen/Seiten erfolgreich; nur unerreichbarer lokaler Platzhalter-DB-Endpunkt, kein Produktionszugriff
unveränderter öffentlicher React-PDF-/Poppler-VertragFree 3 / Premium 4 Seiten; pdftoppm und pdftocairo bestanden
Netzwerkzugriff im Vier-Tier-Harnessverboten; kein Zugriff erfolgt
temporäre PDF-Verzeichnisse nach Harnessautomatisch entfernt

Vier-Tier-PDF/UA-/Poppler-Lauf

npm run qa:pdf:ua-shadow bestand mit veraPDF 1.30.2. Jeder Tier-Output enthielt exakt fünf A4-Seiten, zwei unterschiedliche Figure-Alternativtexte, zwei Links, zehn Pagination-Artefakte, physische Textschicht, vollständige Struktur-Tabreihenfolge sowie je fünf Rasterseiten in pdftoppm und pdftocairo.

TierBytesveraPDFFixture-SHA-256PDF-SHA-256
free60.944106 Regeln / 10.196 Checks5af016271f50cfb8782ad532db922b5f838df7b7cd1f245fe4ff4b3d3459f53ab3f83ea5a0eac536e7777920d0d8a08367fe7eaa8f31ae42db342d02ce8c1f22
standard62.552106 Regeln / 10.991 Checks84682cf45638a44035ec4cf26a4ba36a44140feb6af5296a6943f7da19b24ff4fe647fc607b39133ceab72633aefb6479691b87ba710afe12b6f2027aa4acfe4
premium67.377106 Regeln / 11.740 Checksc774e499b55f0768b6cb23d3e6bead5b2a2b54e1b9dae1e0a6d8c66190fbb898bd36efdfe49b2a2215b7883c9c2bae253830b6a6ff59a2fae1fbbcef89cca8f3
planer65.821106 Regeln / 11.070 Checks2d1e1929a31789bd79f65cc017cddbbb0f4ed5e782aa68752d6f0071073899c9883934f5ba3e5413a2595af67adbb90a0d3ecaf0896433e3da71e91a139e0952

Die Byte- und PDF-Hashes sind an den lokalen Lauf gebunden. PDF-Erzeugung kann Metadatenobjekte serialisieren; der strukturelle Vertrag und die repository-fixierten Eingabe-Hashes sind die dauerhaften Regressionsgrenzen.

CI und geschützter Preview-Readback

Der unveränderliche Vercel-Preview dpl_5mFy2pwv4DjZPLXZgRhjcyYnisSY war READY und laut Vercel-API exakt an den Implementierungscommit 37ba1b778297abef4f05dbd33607158e5236b29a gebunden. Der Zugriff erfolgte über den angemeldeten Vercel-CLI-Bypass der Deployment Protection; ein anonymer öffentlicher Produktpfad wurde nicht geöffnet.

TierHTTP / BytesServer-TimingRequest-IDAuth.js-Cookiesheruntergeladener PDF-Vertrag
free200 / 61.042710,0 + 192,0 = 902,7 msfra1::iad1::bw2wb-1787870539507-d74c211d7c5905 Seiten; 106 / 10.196 veraPDF-Checks; Poppler 5/5 + 5/5
standard200 / 62.655567,0 + 119,3 = 686,6 msfra1::iad1::9r2rs-1787870597112-3a261c99c3ca05 Seiten; 106 / 10.991 veraPDF-Checks; Poppler 5/5 + 5/5
premium200 / 67.474462,6 + 74,6 = 537,4 msfra1::iad1::8tmnr-1787870600539-9656e25af3fc05 Seiten; 106 / 11.740 veraPDF-Checks; Poppler 5/5 + 5/5
planer200 / 65.919444,8 + 116,6 = 561,5 msfra1::iad1::vsp6t-1787870603945-3fdca16aa95905 Seiten; 106 / 11.070 veraPDF-Checks; Poppler 5/5 + 5/5

Alle vier Erfolgsantworten trugen Content-Type: application/pdf, Cache-Control: private, no-store, X-Robots-Tag: noindex, nofollow, noarchive und X-LandNutzen-PDF-UA-Shadow: slice-c-1. Die lokal erneut geprüften Downloads besaßen je fünf strukturierte Seiten, zwei informative Figures, zwei Linkannotationen und zehn Pagination-Artefakte; veraPDF 1.30.2 sowie pdftoppm und pdftocairo waren für jede Datei grün.

GegenprobeErgebnisRequest-ID
GET /freeleerer 404, 0 Cookiesfra1::iad1::btxw8-1787870608831-095dfeabe8e2
POST /free?source=realleerer 404, 0 Cookiesfra1::iad1::qj6kw-1787870611505-f4a562b930ae
POST /free mit {}-Bodyleerer 404, 0 Cookiesfra1::iad1::z4fqp-1787870614272-705f208c5b58
POST /unbekanntleerer 404, 0 Cookiesfra1::iad1::vxmvp-1787870616822-61d7e750d56e

Ein nicht angemeldeter POST auf dieselbe unveränderliche Deployment-URL erreichte den Handler nicht: Vercel Deployment Protection antwortete mit 302, 15 Bytes und ausschließlich seinem Schutz-Cookie; Request-ID fra1::2krxv-1787870936872-3988741dfe39. Das ist die Gegenprobe zum angemeldeten CLI-Readback und keine Auth.js-Sitzung.

Der Pull-Request-CI-Lauf 33123471241 prüfte den Implementierungscommit vollständig grün: verify / Job 98695864890 in 9:59 Minuten, PDF-UA-Feasibility / Job 98695865003 in 1:45 Minuten und PDF-Poppler-Regression / Job 98695865097 in 0:57 Minuten. Der exakte Preview-Peak-RSS bleibt unvermessen und wird deshalb nicht behauptet.

Merge, Main-CI und Produktionstrennung

PR #537 wurde als 59036df7aca8a70025efcbf8f0d8dd467700cb9c gemergt. Der finale PR-Lauf 33124148125 und der Main-Lauf 33124303812 waren vollständig grün. Im finalen PR-Lauf bestanden verify / Job 98698092171 in 8:46 Minuten, PDF-UA-Feasibility / Job 98698092248 in 1:39 Minuten und PDF-Poppler-Regression / Job 98698091982 in 0:56 Minuten. Auf dem exakten Merge-SHA bestanden in Main verify / Job 98698596150 in 8:42 Minuten, PDF-UA-Feasibility / Job 98698596152 in 1:32 Minuten und PDF-Poppler-Regression / Job 98698595968 in 0:58 Minuten.

Das Vercel-Produktionsdeployment dpl_FbKhtfArLz6wnDTAaRn3aq1bVJh9 war READY, hatte target=production, war laut Vercel-API exakt an den Merge-Commit gebunden und trug die Aliase www.landnutzen.at, landnutzen.at und landnutzen.vercel.app.

ProduktionsgegenprobeErgebnisRequest-ID
POST /freeleerer 404, 0 Cookiesfra1::iad1::94jcx-1787871326337-b763bc47dc0b
POST /standardleerer 404, 0 Cookiesfra1::iad1::8tmnr-1787871330249-38060307a566
POST /premiumleerer 404, 0 Cookiesfra1::iad1::5q5t7-1787871333890-1d789dfae3d2
POST /planerleerer 404, 0 Cookiesfra1::iad1::dcvbz-1787871337561-fc93ff90e679
GET /freeleerer 404, 0 Cookiesfra1::iad1::27kdg-1787871341037-b64200167933

Alle fünf Antworten des unveränderlichen Produktionsdeployments trugen Cache-Control: private, no-store und X-Robots-Tag: noindex, nofollow, noarchive. Damit ist die Produktionstrennung belegt; es wurde kein PDF/UA-Produktpfad geöffnet.

Der öffentliche Dokuportal-Readback über www.landnutzen.at war für alle aktualisierten Seiten grün:

RouteHTTP / BytesRequest-ID
/docs/pdf-ua-report-shadow-v1200 / 55.967fra1::iad1::dpxfw-1787871362784-36d6a6751c20
/docs/pdf-ua-report-shadow-slice-c-2026-08-28200 / 70.248fra1::iad1::55xjj-1787871364442-1d6fba4618e8
/docs/report-output200 / 83.593fra1::iad1::tj7rz-1787871365137-68288777216b
/docs/feature-pdf-permalink200 / 57.886fra1::iad1::v54tz-1787871365983-0ee5ab097fee
/docs/status200 / 207.835fra1::iad1::78fc5-1787871366419-de3c77463d63

Alle fünf Seiten waren privat/no-store und noindex; die erwarteten Slice-C-, Commit-, CI- und Deployment-Marker waren vorhanden. Ein schreibfreier POST /api/v1/report mit leerem Objekt bestätigte zusätzlich über X-Deploy-Commit exakt den Merge-SHA und endete erwartungsgemäß mit 400 address_missing; Request-ID fra1::iad1::2krxv-1787871367568-5d930aad012d.

Offene Produktabnahme

BereichStand
repository-fixierte Vier-Tier-Objekte des echten Report-Typslokal und im geschützten Preview belegt
vollständige reale Reportsektionen und Karten-Alternativtexteoffen
Mehrseiten-Viewerregression des neuen Renderersoffen
kontrollierter Produktrollout und PDF/UA-Live-Readbackoffen
Screenreader-Abnahmeoffen

Issue #333 bleibt bis zum Abschluss dieser Produktgates offen.