PDF/UA-1-Report-Shadow: Slice-E-Nachweis
- Datum: 28. August 2026
- Issue: #333 bleibt offen
- Entscheidung: ADR-0063
- Branch:
codex/pdf-ua-real-report-slice-e - Implementierungscommit:
4c88ca06b5af95d8ed0731b5b90c3f27618d2121 - Pull Request: #541
- Merge-Commit:
f5d57d9ac0b4c57a576fa64b9fbddbff49ef8726 - Produktionsdeployment:
dpl_GqMcWA5uHvML97ZrciT4dkzPKoQD
Aussagegrenze
Slice E bindet einen vollständigen synthetischen Report über die exakten
saveReport()- und getReport()-Abfragen an ein isoliertes PostgreSQL-
Testschema und rendert erst das wieder geladene StoredReport-Objekt. Der
Preview-Shadow verwendet die repository-fixierte Kopie desselben
persistenznormalisierten Kanaris und liest keine Datenbank.
Der Nachweis behauptet keinen Zugriff auf einen gespeicherten Nutzerreport, keinen PDF/UA-Produktrollout und keine Screenreader-Abnahme. Der öffentliche React-PDF-Renderer bleibt unverändert.
Implementierter Vertrag
- Produktfixture
PDF-UA-REPORT-SLICE-D-1, gespeicherter VertragPDF-UA-STORED-REPORT-SLICE-E-1und Renderer-ViewPDF-UA-SLICE-E-1; - vier echte PostgreSQL-
jsonb-Roundtrips im isolierten Schemapdf_ua_stored_report_test; - Store-Pfad über
saveReport()undgetReport()einschließlich Disclaimer-Opt-in-Normalisierung; solar.google,solar_googleund der Google-Solar-Disclaimer-Baustein bleiben in allen gespeicherten Tiers ausgeschlossen;- Report-ID, Adresse, Eigentümer-ID und exakter Opt-in-Zeitpunkt gelangen nicht in die Renderer-View;
- acht strukturierte A4-Seiten, 31 Sektionen, drei Figures, zwei Links und 16 Pagination-Artefakte;
- Preview-only-Route ohne Body, Query, Session, Produktionsdatenbank oder
Provider; Erfolgsheader
slice-e-1.
Verifikation
Lokal
- 56 gezielte Unit-, Routen- und Dokumentationstests in sechs Dateien: grün;
- vollständige Vitest-Suite: 3.487 bestanden, 43 erwartete Skips;
- vier echte Store-Roundtrips mit
saveReport()→ PostgreSQLjsonb→ optionalemrecordReportOptIn()→getReport()→renderPdfUaStoredReportShadow(): 4/4 grün; anonyme und kontogebundene Ablaufzustände sowie beide Opt-in-Zustände sind enthalten; - isoliertes Schema
pdf_ua_stored_report_testnach dem Lauf entfernt; - PostgreSQL-Container aus dem auch in CI gepinnten Image
postgis/postgis:16-3.5-alpine@sha256:d2fe6296c8ed5b21b31a426f51b9176b4d89f80a0a380632a7a833d604951273nach dem Lauf entfernt; - Typecheck, gezielter ESLint-Lauf und Produktions-Build mit nicht
verbindendem lokalen
DATABASE_URL-Placeholder: grün; - manueller visueller Readback des Premium-Kanaris: 8/8 Seiten ohne Überlauf, abgeschnittene Inhalte, leere Seite oder sichtbare PII; die neue Persistenztabelle auf Seite 6 und die Store-Grenze auf Seite 8 sind lesbar.
Der lokale Vier-Tier-Validatorlauf mit veraPDF 1.30.2 bestand je 106 Regeln:
| Tier | Bytes | Checks | Fixture-SHA-256 | PDF-SHA-256 |
|---|---|---|---|---|
free | 130.231 | 24.130 | 8fb3cadeddf17b14296f9fedf98249783b27f88944eb4342ef688394bf2694e6 | 97fa71f9dd7888bced64d7a8b2bd4f026bfab6c5e289c2ad6fdf57973c0cb9bb |
standard | 131.804 | 24.990 | 3bbf243699afc2c97f61a97a18ecc4c930a62de98033b399fa046c61b36a51ea | afb94aef5c55d77e0ace82bee0573fc4cf026f56f9d1df8802e9ac9efef1044e |
premium | 131.804 | 24.910 | 6069804596067b7de00cea440238d66c20f5f93b16dae6f486d1371fd33bf96e | fa61fe7fc530f6c4bd902522bc9be4ca69e925b93b9ae5ada140edac139a93fd |
planer | 130.240 | 24.255 | d08b59f42658510b06106f479845877f1afeb6e7c8a41a03fbbd47e93e95899c | e573ff3534b499593afb488f0a25f05de6b4ef1d3ec9d5c5aa2612cd129928dc |
Die Fixture-Hashes sind der stabile Inhaltsvertrag. Die PDF-Hashes binden den konkreten lokalen Validatorlauf; der PDFKit-/Finalisierungsoutput wird nicht als byteidentisch zwischen getrennten Läufen behauptet.
Alle vier Dateien besitzen acht A4-Seiten, 31 Sektionen, drei Figures, zwei
Links, 16 Pagination-Artefakte und eine Textschicht; pdftoppm und
pdftocairo renderten jeweils alle Seiten.
Release
Der Implementierungs-CI-Lauf
33163812578
lief exakt auf 4c88ca06b5af95d8ed0731b5b90c3f27618d2121 vollständig grün:
verify einschließlich des neuen PostgreSQL-Roundtrips, PDF-Poppler-Regression
und PDF-UA-Feasibility. Der geschützte Preview
dpl_AejPoE9E4Joeh9J1ireiHZdKz7k7 war an denselben Commit gebunden.
Alle vier Preview-POSTs lieferten application/pdf, private, no-store,
slice-e-1, keine Auth.js-Cookies und acht Seiten. veraPDF 1.30.2 bestand pro
Datei 106/106 Regeln; pdftoppm und pdftocairo renderten zusammen 64/64
Seiten. Die gemessenen Antworten waren:
| Tier | Bytes | Gesamtzeit | Renderer / Finalisierung / Gesamt | Vercel-Request-ID |
|---|---|---|---|---|
free | 130.162 | 2,691 s | 1.313,7 / 257,8 / 1.571,7 ms | fra1::iad1::fqs4w-1787913295351-323b2f33b8ce |
standard | 131.727 | 1,809 s | 1.000,0 / 227,9 / 1.228,0 ms | fra1::iad1::bf5qs-1787913308819-a334eaa85c8e |
premium | 131.742 | 1,503 s | 794,3 / 116,1 / 910,4 ms | fra1::iad1::5z4cg-1787913313075-33fbd87148ad |
planer | 130.161 | 1,554 s | 842,2 / 149,4 / 991,7 ms | fra1::iad1::m5qzn-1787913316973-c55a30111aa0 |
Body, Query, unbekanntes Tier und GET blieben leer 404. Ein anonymer
Direktzugriff endete bereits an der Vercel Deployment Protection mit 302
und setzte ausschließlich deren SSO-Nonce, keine Auth.js-Cookies.
PR #541 wurde als f5d57d9ac0b4c57a576fa64b9fbddbff49ef8726
gemergt. Das produktive Deployment dpl_GqMcWA5uHvML97ZrciT4dkzPKoQD
liefert exakt diesen Commit. Dort antworteten alle vier Tier-POSTs und ein GET
auf der internen Route leer 404, private, no-store, ohne Cookies. Der
öffentliche schreibfreie Guard POST /api/v1/report mit {} blieb auf dem
unveränderten Produktpfad bei 400 address_missing und trug denselben
X-Deploy-Commit.
Der vollständige Main-CI-Lauf
33164390512
bestand auf exakt diesem Merge-SHA: verify einschließlich PostgreSQL-Gate
(Job 98826219278), PDF-Poppler-Regression (Job 98826219519) und
PDF-UA-Feasibility (Job 98826219524) waren grün.
Entscheidung, Nachweis, Report-Output, Report-Contract, Feature-Seite und
Statusseite wurden auf www.landnutzen.at jeweils mit HTTP 200, private, no-store, noindex und den erwarteten Slice-E-Markern rückgelesen. Damit ist
die Produktionstrennung des Shadows belegt; ein öffentlicher PDF/UA-Report
wurde weder aktiviert noch behauptet.
Die Release-Evidenz wurde mit PR
#542 als Merge-Commit
969fd4130c359c8ec4c3dc0cbffcfdc56608abda übernommen. Der vollständig grüne
Main-CI-Lauf
33166099688
bestand auf genau diesem SHA: verify (Job 98831762925),
PDF-Poppler-Regression (Job 98831762616) und PDF-UA-Feasibility (Job
98831762873). Das Produktionsdeployment
dpl_4MASQLCnNjiCjD2AR3fdUUkrcp7R ist READY und liefert diesen
Evidenz-Merge.
Der abschließende Live-Readback bestätigte die sechs Dokuportalseiten erneut
mit HTTP 200, no-store, noindex und sämtlichen Release-Markern. Alle vier
Tier-POSTs sowie ein GET der internen Shadow-Route blieben leer 404,
private, no-store und ohne Cookies. Der schreibfreie öffentliche Guard mit
POST /api/v1/report und {} blieb bei 400 address_missing und trug
X-Deploy-Commit: 969fd4130c359c8ec4c3dc0cbffcfdc56608abda.
Offene Produktabnahme
| Bereich | Stand |
|---|---|
| synthetischer Report über echten PostgreSQL-Store-Roundtrip | abgeschlossen: lokal 4/4 und CI grün |
| PDF/UA-Struktur des persistenznormalisierten Vier-Tier-Kanaris | abgeschlossen: lokal, Preview und CI grün |
| Karten-/Viewerregression des neuen Renderers | offen |
| kontrollierter Produktrollout und PDF/UA-Live-Readback | offen |
| manuelle Screenreader-Abnahme | offen |
Issue #333 bleibt bis zum Abschluss der Produktgates offen.