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-1für alle vierReportTier; - 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_qualityundimagery_datebleiben 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
| Gate | Ergebnis |
|---|---|
| gezielte Fixture-, Mapper-, Runtime-, Finalizer- und Routentests | 43/43 bestanden |
| gezielte Dokuportal- und Aussagegrenzentests | 5/5 bestanden |
| vollständiger Vitest-Lauf | 270 Dateien / 3.474 Tests bestanden; 6 Dateien / 39 Tests bewusst übersprungen |
npm run typecheck | bestanden |
npm run lint -- --quiet | bestanden |
npm run build | 122 Routen/Seiten erfolgreich; nur unerreichbarer lokaler Platzhalter-DB-Endpunkt, kein Produktionszugriff |
| unveränderter öffentlicher React-PDF-/Poppler-Vertrag | Free 3 / Premium 4 Seiten; pdftoppm und pdftocairo bestanden |
| Netzwerkzugriff im Vier-Tier-Harness | verboten; kein Zugriff erfolgt |
| temporäre PDF-Verzeichnisse nach Harness | automatisch 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.
| Tier | Bytes | veraPDF | Fixture-SHA-256 | PDF-SHA-256 |
|---|---|---|---|---|
free | 60.944 | 106 Regeln / 10.196 Checks | 5af016271f50cfb8782ad532db922b5f838df7b7cd1f245fe4ff4b3d3459f53a | b3f83ea5a0eac536e7777920d0d8a08367fe7eaa8f31ae42db342d02ce8c1f22 |
standard | 62.552 | 106 Regeln / 10.991 Checks | 84682cf45638a44035ec4cf26a4ba36a44140feb6af5296a6943f7da19b24ff4 | fe647fc607b39133ceab72633aefb6479691b87ba710afe12b6f2027aa4acfe4 |
premium | 67.377 | 106 Regeln / 11.740 Checks | c774e499b55f0768b6cb23d3e6bead5b2a2b54e1b9dae1e0a6d8c66190fbb898 | bd36efdfe49b2a2215b7883c9c2bae253830b6a6ff59a2fae1fbbcef89cca8f3 |
planer | 65.821 | 106 Regeln / 11.070 Checks | 2d1e1929a31789bd79f65cc017cddbbb0f4ed5e782aa68752d6f0071073899c9 | 883934f5ba3e5413a2595af67adbb90a0d3ecaf0896433e3da71e91a139e0952 |
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.
| Tier | HTTP / Bytes | Server-Timing | Request-ID | Auth.js-Cookies | heruntergeladener PDF-Vertrag |
|---|---|---|---|---|---|
free | 200 / 61.042 | 710,0 + 192,0 = 902,7 ms | fra1::iad1::bw2wb-1787870539507-d74c211d7c59 | 0 | 5 Seiten; 106 / 10.196 veraPDF-Checks; Poppler 5/5 + 5/5 |
standard | 200 / 62.655 | 567,0 + 119,3 = 686,6 ms | fra1::iad1::9r2rs-1787870597112-3a261c99c3ca | 0 | 5 Seiten; 106 / 10.991 veraPDF-Checks; Poppler 5/5 + 5/5 |
premium | 200 / 67.474 | 462,6 + 74,6 = 537,4 ms | fra1::iad1::8tmnr-1787870600539-9656e25af3fc | 0 | 5 Seiten; 106 / 11.740 veraPDF-Checks; Poppler 5/5 + 5/5 |
planer | 200 / 65.919 | 444,8 + 116,6 = 561,5 ms | fra1::iad1::vsp6t-1787870603945-3fdca16aa959 | 0 | 5 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.
| Gegenprobe | Ergebnis | Request-ID |
|---|---|---|
GET /free | leerer 404, 0 Cookies | fra1::iad1::btxw8-1787870608831-095dfeabe8e2 |
POST /free?source=real | leerer 404, 0 Cookies | fra1::iad1::qj6kw-1787870611505-f4a562b930ae |
POST /free mit {}-Body | leerer 404, 0 Cookies | fra1::iad1::z4fqp-1787870614272-705f208c5b58 |
POST /unbekannt | leerer 404, 0 Cookies | fra1::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.
| Produktionsgegenprobe | Ergebnis | Request-ID |
|---|---|---|
POST /free | leerer 404, 0 Cookies | fra1::iad1::94jcx-1787871326337-b763bc47dc0b |
POST /standard | leerer 404, 0 Cookies | fra1::iad1::8tmnr-1787871330249-38060307a566 |
POST /premium | leerer 404, 0 Cookies | fra1::iad1::5q5t7-1787871333890-1d789dfae3d2 |
POST /planer | leerer 404, 0 Cookies | fra1::iad1::dcvbz-1787871337561-fc93ff90e679 |
GET /free | leerer 404, 0 Cookies | fra1::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:
| Route | HTTP / Bytes | Request-ID |
|---|---|---|
/docs/pdf-ua-report-shadow-v1 | 200 / 55.967 | fra1::iad1::dpxfw-1787871362784-36d6a6751c20 |
/docs/pdf-ua-report-shadow-slice-c-2026-08-28 | 200 / 70.248 | fra1::iad1::55xjj-1787871364442-1d6fba4618e8 |
/docs/report-output | 200 / 83.593 | fra1::iad1::tj7rz-1787871365137-68288777216b |
/docs/feature-pdf-permalink | 200 / 57.886 | fra1::iad1::v54tz-1787871365983-0ee5ab097fee |
/docs/status | 200 / 207.835 | fra1::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
| Bereich | Stand |
|---|---|
repository-fixierte Vier-Tier-Objekte des echten Report-Typs | lokal und im geschützten Preview belegt |
| vollständige reale Reportsektionen und Karten-Alternativtexte | offen |
| Mehrseiten-Viewerregression des neuen Renderers | offen |
| kontrollierter Produktrollout und PDF/UA-Live-Readback | offen |
| Screenreader-Abnahme | offen |
Issue #333 bleibt bis zum Abschluss dieser Produktgates offen.