VerityRead Privacy Test Plan

1. Egress tests

Goal: Page content never appears in external request body, query, header, or logs.

ID Case Steps Pass
E1 Summarize article Load fixture, run summarize with Chrome AI or Ollama Markers absent from non-exempt requests
E2 Ask page Ask question containing unique page phrase Markers absent externally
E3 Translate selection Translate selected confidential string Selection absent externally
E4 Health check Run capability/health No page URL/title/body in Ollama /api/tags

Automation:

  • tests/e2e/egress.spec.ts validates the marker-detection harness.
  • tests/e2e/extension.spec.ts loads the production MV3 bundle and verifies permissions, consent, storage migration, and no unauthorized read/egress.
  • E1–E4 remain manual release checks against the selected real local Provider.

Exempt destinations: chrome-extension:, data:, 127.0.0.1, localhost.

2. Static product scan

ID Case Pass
S1 No eval / new Function in dist pnpm scan:dist
S2 No remote .js / .wasm imports same
S3 Endpoints allowlisted same

3. Data residue

ID Case Pass
R1 History off + browser restart No task content in storage/IDB
R2 Clear all local data Preferences reset scope + cache/history empty
R3 Selection translate Selection not persisted

4. Permissions

ID Case Pass
P1 No auto extract on navigate Manifest has no static content script; dynamic injection fails without a user grant
P2 chrome:// / Web Store Shows PAGE_PROTECTED
P3 Gmail-class SPA Quality fallback / selection guidance
P4 GitHub README/Issue Extract + jump works

5. Offline Lock

ID Case Pass
O1 Lock ON + non-loopback fetch OFFLINE_LOCK_BLOCKED
O2 Lock ON + Ollama loopback Allowed
O3 Lock ON + model download Blocked until user unlocks

Release gate

Every release must run: lint, typecheck, unit tests, loaded-extension E2E, egress harness, production build, scan:dist, and manual smoke on an article, GitHub, a protected page, and both local Providers where available.