Audit the ToS against all tech and features shipped since the last update, propose changes, review them, and apply with human approval.
Run this after batches of shipped features, especially when new APIs, data flows, or AI providers are introduced.
ai, data, or legal shipsCOPY.LEGAL_LAST_UPDATED is more than 2 months oldsrc/app/content/copy.ts → LEGAL_LAST_UPDATED — determines review windowsrc/app/content/tos.md — current ToS text (markdown source of record)features/done/INDEX.md — all shipped features; filter by date > last ToS updatesupabase/functions/ — edge functions (third-party API calls, data processing).env.local, vite.config.ts, and src/ — third-party service inventory (VITE_ vars + frontend service calls)First, grep for third-party service calls in edge functions — structural discovery before reading:
# Edge functions + frontend source — catches all third-party calls:
grep -rn "fetch\|MAILGUN\|GEMINI\|STRIPE\|OPENAI\|SENTRY\|MIXPANEL" \
supabase/functions/ src/ \
| grep -v "node_modules\|\.git\|\.snap\|test\|spec" | sort -u
# VITE_ env vars — third-party service signals baked at build time:
grep -r "VITE_\|import\.meta\.env\." src/ | grep -v "node_modules" | sort -u
Then inventory everything since LEGAL_LAST_UPDATED:
Produce a structured list: [Service] → [What user data it receives] → [Feature that introduced it]
Read the full ToS. For each section, note:
Cross-reference Stage 1 vs Stage 2. Identify:
Before spawning: Read src/app/content/tos.md in full. In the prompt below, replace [ToS file content] with the full file text and [Gap analysis] with your Stage 3 structured list.
Spawn a general-purpose agent (model: "sonnet") with this prompt:
You are a legal drafter specializing in SaaS and GDPR-compliant terms of service for European startups.
Company: TechSalesBox OÜ (Estonia), product: ClarityPledge — calibrated communication practice platform.
Users: co-founder pairs. Target market: Europe. Legal jurisdiction: Estonian law + GDPR.
Current ToS: [ToS file content]
Gap analysis: [Gap analysis]
Task: Propose specific, minimal ToS changes to close the identified gaps. For each change:
1. Section it belongs in (or new section name)
2. The proposed text (complete paragraph, ready to publish)
3. Legal rationale in 1-2 sentences
4. GDPR article or Estonian e-commerce law reference if applicable
Be minimal — don't rewrite sections that don't need it. Only close the gaps.
Before spawning: Use the same [ToS file content] read in Stage 4. Replace [Stage 4 output] with the full output from the Stage 4 agent.
Spawn a second general-purpose agent (model: "sonnet") with this prompt:
You are a GDPR compliance advisor and devil's advocate reviewer for SaaS terms of service.
Your job is to find problems in proposed ToS changes — not to approve them.
Company: TechSalesBox OÜ (Estonia), product: ClarityPledge, users: co-founder pairs, jurisdiction: Estonian law + GDPR.
Original ToS: [ToS file content]
Proposed changes: [Stage 4 output]
Review each proposed change for:
1. GDPR compliance (data minimization, lawful basis, consent requirements, Art. 13/14 disclosures)
2. Legal holes — ambiguities, overreaches, missing definitions, unenforceable promises
3. User experience — anything a user could reasonably misinterpret
4. Estonian e-commerce law specifics (Võlaõigusseadus, infoühiskonna teenuse seadus)
**Output format — one entry per proposed change, verdict first:**
[APPROVE | BLOCK | MINOR] [Change ref]: [bottom line in plain English, 1 sentence] Issue: [specific problem, if any] Fix: [concrete fix, if any]
APPROVE = ship as-is. BLOCK = do not apply until fixed. MINOR = optional improvement, won't block.
No legalese. Write as if explaining to a non-lawyer founder in 30 seconds.
Present to the user for each proposed change:
Framing by change size:
Do NOT apply anything without explicit approval per change.
For each approved change:
src/app/content/tos.md (markdown source of record — no legal text lives in TSX)COPY.LEGAL_LAST_UPDATED in src/app/content/copy.ts to today's dateThis step is non-optional. Without it, users won't be prompted to re-accept updated terms.
CURRENT_TERMS_VERSION in src/lib/constants.ts (e.g., v1.1 → v1.2)src/tests/consent-api.test.ts to match the new versionnpm test -- consent-api.test.ts — must passUse Claude in Chrome to load http://localhost:5173/terms-of-service and screenshot the updated sections.
Pass criteria: All new paragraphs render without truncation, spacing matches surrounding sections, no raw HTML visible, date in page header matches today.
Fallback (if Claude in Chrome unavailable): Use any available browser automation tool — Chrome DevTools MCP, Playwright, or Claude in Chrome. If none is available, note "Visual review skipped — no browser tool available. Run manually before pushing."
Do not mark Stage 8 complete based on code reading alone.
After completion, commit with message: