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 Vertrag PDF-UA-STORED-REPORT-SLICE-E-1 und Renderer-View PDF-UA-SLICE-E-1;
  • vier echte PostgreSQL-jsonb-Roundtrips im isolierten Schema pdf_ua_stored_report_test;
  • Store-Pfad über saveReport() und getReport() einschließlich Disclaimer-Opt-in-Normalisierung;
  • solar.google, solar_google und 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() → PostgreSQL jsonb → optionalem recordReportOptIn()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_test nach dem Lauf entfernt;
  • PostgreSQL-Container aus dem auch in CI gepinnten Image postgis/postgis:16-3.5-alpine@sha256:d2fe6296c8ed5b21b31a426f51b9176b4d89f80a0a380632a7a833d604951273 nach 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:

TierBytesChecksFixture-SHA-256PDF-SHA-256
free130.23124.1308fb3cadeddf17b14296f9fedf98249783b27f88944eb4342ef688394bf2694e697fa71f9dd7888bced64d7a8b2bd4f026bfab6c5e289c2ad6fdf57973c0cb9bb
standard131.80424.9903bbf243699afc2c97f61a97a18ecc4c930a62de98033b399fa046c61b36a51eaafb94aef5c55d77e0ace82bee0573fc4cf026f56f9d1df8802e9ac9efef1044e
premium131.80424.9106069804596067b7de00cea440238d66c20f5f93b16dae6f486d1371fd33bf96efa61fe7fc530f6c4bd902522bc9be4ca69e925b93b9ae5ada140edac139a93fd
planer130.24024.255d08b59f42658510b06106f479845877f1afeb6e7c8a41a03fbbd47e93e95899ce573ff3534b499593afb488f0a25f05de6b4ef1d3ec9d5c5aa2612cd129928dc

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:

TierBytesGesamtzeitRenderer / Finalisierung / GesamtVercel-Request-ID
free130.1622,691 s1.313,7 / 257,8 / 1.571,7 msfra1::iad1::fqs4w-1787913295351-323b2f33b8ce
standard131.7271,809 s1.000,0 / 227,9 / 1.228,0 msfra1::iad1::bf5qs-1787913308819-a334eaa85c8e
premium131.7421,503 s794,3 / 116,1 / 910,4 msfra1::iad1::5z4cg-1787913313075-33fbd87148ad
planer130.1611,554 s842,2 / 149,4 / 991,7 msfra1::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

BereichStand
synthetischer Report über echten PostgreSQL-Store-Roundtripabgeschlossen: lokal 4/4 und CI grün
PDF/UA-Struktur des persistenznormalisierten Vier-Tier-Kanarisabgeschlossen: lokal, Preview und CI grün
Karten-/Viewerregression des neuen Renderersoffen
kontrollierter Produktrollout und PDF/UA-Live-Readbackoffen
manuelle Screenreader-Abnahmeoffen

Issue #333 bleibt bis zum Abschluss der Produktgates offen.