Background
Our brand guardrail (see CLAUDE.md) is firm: iEye watches over you, never watches you. Copy is always "looking out for / you are seen / never alone" — never "monitor / track / surveil." Today this is enforced by convention only. Per our "enforce structurally, not by convention" principle, let's make it a real CI gate.
The task
Add a small check that scans user-facing copy for a denylist of surveillance words and fails CI on a hit, with an allowlist for legitimate phrases (e.g. "watch over").
- A node or shell script, exposed as
npm run lint:copy in landing/, plus a CI step.
- Denylist (seed, refine in the PR):
monitor, surveil, surveillance, spy, track you, watch you, camera, eavesdrop.
- Allowlist:
watch over, looking out, oversee.
- Scope to copy, not code: start with
landing/src/components/HonestyLine.tsx, landing/src/lib/legalCopy.ts, landing/src/pages/*.tsx, and the app's user-facing strings. Don't scan technical identifiers/comments (a "tracking issue" reference must not trip it).
Acceptance criteria
Why this is a good first issue
Self-contained, needs no app architecture knowledge, and it directly protects a load-bearing guardrail. Pointers: CLAUDE.md, docs/standards/.
Background
Our brand guardrail (see
CLAUDE.md) is firm: iEye watches over you, never watches you. Copy is always "looking out for / you are seen / never alone" — never "monitor / track / surveil." Today this is enforced by convention only. Per our "enforce structurally, not by convention" principle, let's make it a real CI gate.The task
Add a small check that scans user-facing copy for a denylist of surveillance words and fails CI on a hit, with an allowlist for legitimate phrases (e.g. "watch over").
npm run lint:copyinlanding/, plus a CI step.monitor,surveil,surveillance,spy,track you,watch you,camera,eavesdrop.watch over,looking out,oversee.landing/src/components/HonestyLine.tsx,landing/src/lib/legalCopy.ts,landing/src/pages/*.tsx, and the app's user-facing strings. Don't scan technical identifiers/comments (a "tracking issue" reference must not trip it).Acceptance criteria
npm run lint:copyruns locally and in CI.CONTRIBUTING.mdpointing to the check.Why this is a good first issue
Self-contained, needs no app architecture knowledge, and it directly protects a load-bearing guardrail. Pointers:
CLAUDE.md,docs/standards/.