feat(legal): Impressum + Legal Notice pages (Phase B.2)#8
Merged
Conversation
DE /impressum (legally authoritative) + EN /en/legal (courtesy translation). Copy held inline (per OQ-1: legal pages stay as .astro, not in the editorial collection) and verbatim from docs/BASELINE_COPY.md §7 / §8 — six sections in BASELINE order (Kontakt, Umsatzsteuer, USt-IdNr., Haftungsausschluss, Haftung für Links, Urheberrecht / their EN counterparts). Layout mirrors design/handoff-bundle/design/jsx/impressum.jsx + styles/impressum.css — semantic markup (h1, lede paragraph, address block, six h3+p sections), not a pre-formatted code block. The bundle's older five-section list (with § 18 Abs. 2 MStV, no Haftung für Links) is superseded by BASELINE post- G2.5 Stream A; structure follows bundle, content follows BASELINE. SiteFooter gains the Impressum / Legal entry between Contact and GitHub. footer.legal i18n keys were already provisioned in Phase A.2. Counterpart map (/impressum ↔ /en/legal) and hreflang already covered both routes; verified in built HTML. Text-color verification (G0 item 2.3): the bundle's impressum.css uses standard tokens (--color-text, --color-heading, --color-text-muted, --color-link), not -hc variants. Per CLAUDE_DESIGN_BRIEF §4.8, Volcanic Stone is AAA on every surface (10.09:1+). Implementation uses the same standard tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
blackbrowed-labs
added a commit
that referenced
this pull request
Apr 28, 2026
Adds src/data/cloudflare-facts.json with hand-verified initial values from the 2026-04-28 verification cycle (DPF Active per participant/5666; CWA aggregated retention 6 months per Web Analytics FAQ; raw-event retention placeholder removed by G B.3.1 amendment). scripts/check-cloudflare-facts-freshness.mjs runs ahead of astro build in the build script chain. Fails the build if verifiedDate is older than 90 days — manual-era 'no silent failures' mechanism per backlog item #8. Tighter than the post-verifier 120-day threshold because manual processes need stronger forcing functions than automated ones. Phase D Cloudflare-fact-verifier (backlog #8) will overwrite the JSON file via automated workflow; the consumer pattern lands here so D is purely 'automate the data source' work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7 tasks
blackbrowed-labs
added a commit
that referenced
this pull request
Apr 29, 2026
…failures" design
Adds verify-cloudflare-facts.yml weekly cron workflow + scripts/checks/dpf.mjs
+ scripts/checks/cwa-retention.mjs + 6 fixtures + scripts/run-verifier.mjs
orchestrator. Extends scripts/check-cloudflare-facts-freshness.mjs to read
_meta.last_check_attempt with 30-day threshold (down from 90).
Migrates src/data/cloudflare-facts.json to verifier-era schema (schema_version
1; per-fact status + value fields; _meta block; structured cwa_retention with
integer month values; raw_events_retention_months explicitly null per
Cloudflare's documented absence). Updates src/lib/cloudflare-facts.ts type +
adds getEffectiveVerifiedDate helper (worst-case freshness signal: older of
the two per-fact verified_at). Privacy pages (datenschutz.astro, en/privacy.astro)
read via the helper.
Verifier shape per plans/active/pass-2/g-d-2/spec.md: 1/5/15-min retry budget
(21 min total, fits 30-min workflow timeout); status-return error handling
(no throws cross check boundaries); explicit registry per spec §9.6;
hand-written validator per §9.7; status-enum rename ('ok' CheckResult →
'active' JSON) per §6.2; v1-coverage smoke step inside verifier workflow only,
mode #8 deploy-triggered limitation acknowledged per §3.8.
All synthetic failure modes (#2, #4, #5, #6) verified via MOCK_SCENARIO=
fixture routing. Mode #1 (freshness gate) verified via stale last_check_attempt.
Modes #3, #7, #8, #9 deferred to controller-side post-commit per prompt's
"may defer" guidance. Outcome record at
plans/active/pass-2/g-d-7/verifier-test-matrix.md (workspace, gitignored).
Closes backlog #8.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/impressum(legally authoritative) + EN/en/legal(courtesy translation), with copy verbatim fromdocs/BASELINE_COPY.md§7 / §8 (six sections post-G2.5 Stream A: Kontakt · Umsatzsteuer · USt-IdNr. · Haftungsausschluss · Haftung für Links · Urheberrecht).design/handoff-bundle/design/jsx/impressum.jsx+styles/impressum.css— semantic markup (h1, lede paragraph, address block, six h3+p sections), not a<pre>block. Standard color tokens used per bundle CSS; no-hcvariants needed (G0 item 2.3 verification).SiteFootergains the Impressum / Legal entry between Contact and GitHub.footer.legali18n keys, counterpart map (/impressum ↔ /en/legal), and hreflang were already provisioned in earlier phases.Bundle/BASELINE conflict resolved by following bundle for structure, BASELINE for content: the bundle's older five-section list (with § 18 Abs. 2 MStV, no Haftung für Links) is superseded by post-G2.5 BASELINE.
Test plan
astro check— 0 errors, 0 warningsastro build— both/impressum/index.htmland/en/legal/index.htmlemitted<title>, canonical, hreflang both sides, og:locale per language, language-switcher counterpart wiring, footer ordering (About / Contact / Legal / GitHub), skip-link copy per localedev.blackbrowedlabs.com/impressum,/en/legal) — light + dark, desktop + mobile, DE↔EN round-triphttps://blackbrowedlabs.com/impressum+/en/legal+ footer link + lang round-trip🤖 Generated with Claude Code