V1 Web PWA · Surface walkthrough

Legal · Lilith Privacy Policy (editorial variant)

A per-surface walkthrough of the V1 Web PWA customer surface: layout, states, interactions, data, and cross-references.

walked
9sections3 minread

On this page

Context. surface customer · domain onboarding-public · route /legal/lilith/privacy · auth anon · source apps/oshun/web/src/app/legal/lilith/privacy/page.tsx

Last walked. 2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data (2xx), console/page-errors, expected content, screenshot verified; manual screen-reader and real telemetry-delivery checks pending. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; 2026-06-28 public-legal-pages Playwright pass covered anonymous routing, editorial heading/version/body contract, non-clickable footer markers, 390 px no-overflow, offline-after-load stability, no telemetry hooks, and axe. Manual AT pass and real telemetry delivery remain pending.

Purpose#

Editorial-register privacy policy rendered through the same LegalPage component as /legal/lilith, but with kind="privacy". The composition swaps the page title from Terms of use. to Privacy policy. while keeping the body copy structure identical (five roman-numeralled briefs).

Entry points#

  • Footer link on /landing
  • Direct URL / bookmark — yes (anon)

Layout regions#

page.tsx is <LegalPage kind="privacy" />. The shared LegalPage composition (in apps/oshun/web/src/components/lilith/system-pages.tsx) does NOT branch on kind for body copy — only the heading text changes (kind === 'terms' ? 'Terms of use.' : 'Privacy policy.'). The five briefs below the title are the same Lilith terms body content as /legal/lilith.

  • Header (shell): LWebShell chrome
  • Page eyebrow: "Lilith · legal"
  • Title: Privacy policy. in 48px serif
  • Version code: "Effective · 1 May 2026 · v.0142"
  • Double rule
  • Body (max-width 62ch): same five briefs as /legal/lilith (I · what this is, II · your account, III · what we keep, briefly, IV · AI · disclosed, V · ending the agreement), including the disclosure glyph, Settings · AI reference, and "We do not sell anything."
  • Footer rule + link row: same five non-clickable italic spans (Terms, Privacy, DPA, Sub-processors, DMCA)

States#

  • Loading — N/A; static
  • Default — title shows "Privacy policy." instead of "Terms of use."; body copy is unchanged from /legal/lilith
  • Narrow viewport — body reflows at 390 px without horizontal overflow
  • Print — no print-specific stylesheet
  • Offline after load — once loaded, the URL, heading, and body contract remain stable when the browser context goes offline

Interactions#

  • "Terms" / "Privacy" / "DPA" / "Sub-processors" / "DMCA" — same non-clickable <span> markers as /legal/lilith

Body content#

Inherits the same disclosure-glyph explanation, "Settings · AI" opt-out reference, and "We do not sell anything." statement.

Data & contracts#

  • Reads: none — static text
  • Writes: none
  • Caching: SSR static; loaded-route offline stability is asserted. Cold offline navigation / per-legal SW path caching is not asserted, and current sw.js does not path-cache /legal/*.
  • Auth: anon (in middleware PUBLIC_PREFIXES)
  • Metadata: title: 'Lilith · privacy policy', description: 'What we keep, what we do not. AI is disclosed; nothing is sold.'

Cross-references#

E2E coverage#

  • Backed by apps/oshun/web/e2e/public-legal-pages.spec.ts — covers anonymous access, editorial heading/version/body contract, , Settings · AI, "We do not sell anything.", intentionally non-clickable footer markers, 390 px no-overflow, offline-after-load stability, no telemetry hooks, and axe.

Open questions / known gaps#

  • Cold offline navigation / per-legal SW cache is not asserted and current sw.js does not path-cache /legal/*; PWA shell cache coverage remains in the offline-first / PWA walkthroughs.
  • Body copy is identical to /legal/lilith — only the title changes via the kind prop. Confirm whether the privacy variant should have privacy-specific body content rather than reusing the terms briefs
  • Footer link row is decorative spans, not anchors
  • Description meta says "nothing is sold" and the body now explicitly includes "We do not sell anything."
  • No print stylesheet specific to this editorial variant