STAY quality
No dark patterns — promised and proven
Program STAY adds engagement surfaces (a first welcome, first-session value, a calm return to your saved work). "Delight" must come from real value, never a hook. This page renders the SAME manifest the CI gate asserts against — so what you read here is exactly what is enforced in code.
STAY surfaces
Onboarding to value (new-visitor value paths)
ST-26- The real value
- Three honest, signed-out paths straight into real value: search, plan, a real guide.
- Self-limits (never nags)
- Local-first dismissedTips (never re-asks) AND auto-steps-aside once the visitor has any real local signal.
- Basis always shown: Yes
- One-tap dismiss: Yes
First-session starter (try this real thing now)
ST-27- The real value
- Real example searches the live catalog answers, plus the real planner + a real guide.
- Self-limits (never nags)
- Lives on the opt-in /start orientation surface (gates nothing, never auto-shown as a nag); renders nothing with no starters.
- Basis always shown: Yes
- Shows only on real signal
Welcome back (return-session, your real saved work)
ST-28- The real value
- Your real shortlist + the last piece you viewed, one tap away — read only from this browser.
- Self-limits (never nags)
- Local-first dismissedTips (never re-asks) AND renders nothing unless there is genuine returning signal (honest absence).
- Basis always shown: Yes
- One-tap dismiss: Yes
Engagement cues banned across all STAY surfaces
- streaks are a loss-aversion hook (banned)
- streak (AR) — loss-aversion hook (banned)
- points/badges/rewards are extrinsic gamification (banned)
- FOMO framing (banned)
- FOMO (AR) framing (banned)
- manufactured urgency (banned)
- fake scarcity (banned)
- fabricated social proof (banned)
- countdown timer (banned)
Enforced in CI by
Every claim above is asserted by a unit test against the real source file. Any new surface that forgets the basis, hides the dismiss, or slips in a banned cue fails the build.
__tests__/stay/no-dark-patterns.test.ts · components/stay/stay-manifest.ts