Review passes — Intrinsic Value
Four passes on every user-facing surface before ship. Not just high-traffic — all of them.
| Pass | Lens | Question |
|---|---|---|
| 1 — Segall | Focus | One job? One primary action? What can we remove entirely? |
| 2 — Zinsser | Voice | Human? Clear? No clutter or pitch-deck? |
| 3 — Strunk | Mechanics | Can I cut words? Active voice? One idea per sentence? |
| 4 — Buffett | Trust | Candor on money, delete, sync, permissions? |
Read WRITING_PHILOSOPHY.md first.
Order for new work: Segall → Zinsser → Strunk. Buffett when trust is on the line.
Surface taxonomy (all products)
| Category | Examples |
|---|---|
| Navigation | Tab labels, section headers, back titles |
| Primary actions | Buttons, toolbar items, menus |
| Empty states | List zero, search miss, cold start |
| Explainers | Sheets, "Why this?", settings footers |
| Destructive | Delete, sign out, discard |
| Errors & sync | Alerts, banners, offline |
| Auth | Sign in, sign up, passkey, validation |
| Commerce | Trial, subscribe, pricing, FAQ |
| Marketing | Hero, principles, comparison, waitlist |
| Transactional subject + body | |
| Voice / Siri | Spoken confirmations (VOICE_INTENTS.md) |
| Meta | App Store, page <title>, OG description |
Per-product inventory
Maintain a checklist in products/<app>-surfaces.md.
Columns:
| Surface ID | Category | Location | Segall | Zinsser | Strunk | Buffett | Notes |
|---|
Tasteful: products/tasteful-surfaces.md (canonical inventory; add Segall column on next audit refresh)
Pass 1 — Segall (focus)
Every surface: screen, sheet, email, landing section, onboarding step.
| Rule | Check |
|---|---|
| One job | This surface answers one user question |
| One primary CTA | At most one loud action (.glassProminent / hero button) |
| Say no | Features explained only when the user opened that path |
| Start with the question | User intent before product vocabulary |
| Subtract first | Remove whole blocks before editing sentences |
Segall questions:
- If I remove this paragraph, does the screen still work?
- Are two buttons both pretending to be primary?
- Am I listing capabilities when the user came for one decision?
Pass 2 — Zinsser (voice)
Every string in: empty states, body copy, marketing paragraphs, settings footers.
| Rule | Check |
|---|---|
| Read aloud | Kitchen-table test |
| No jargon stack | One technical term max |
| Positive form | "Add meals first" not "Nothing to suggest" |
| Product sheet | Matches products/<app>.md |
| No engagement bait | No guilt, false urgency |
Pass 3 — Strunk (mechanics)
Every string that survived Segall: buttons, nav, alert titles, email subjects.
| Rule | Check |
|---|---|
| Omit needless words | ≥20% shorter? |
| Active voice | "Meal saved." not "has been saved" |
| No banned words | COPY_STANDARDS.md |
| Button budget | ≤ 4 words when possible |
| Alert title budget | ≤ 6 words |
| Title Case buttons | iOS primary actions (patterns/PRIMARY_ACTION.md) |
Pass 4 — Buffett (trust)
Every string in: delete, sync, sign out, pricing, trial, permissions, email, legal adjacency.
| Rule | Check |
|---|---|
| What happened | Plain language |
| What's safe | Local data, cancel path |
| Permanence | No false undo |
| Candor | Price, Apple refunds, who decides |
TRUST_COPY.md shapes | Delete, sync, email |
Workflow
- Inventory — Add row for every surface (or batch by feature).
- Draft — Write or fix copy in product repo.
- Four passes — Mark columns ✅ in inventory.
- Parity — iOS ↔ web-app ↔ marketing for same concept.
- Ship gate — PR checklist: new strings passed all four.
PR checklist (paste in description)
## Copy
- [ ] Segall pass (one job, one primary CTA, subtract whole blocks)
- [ ] Zinsser pass (empty states, body)
- [ ] Strunk pass (buttons, nav, alert titles)
- [ ] Buffett pass (delete/sync/money if touched)
- [ ] Entity names (`ENTITY_NAMES.md` + product sheet)
- [ ] Inventory updated (`products/<app>-surfaces.md`) if new surface
Cursor / agent
- Read
voice/WRITING_PHILOSOPHY.md - Read
voice/products/<app>.md - For trust moments, read
voice/TRUST_COPY.md - Update inventory when adding surfaces