The Gauntlet
Each page below deliberately exercises a known snapshot-pipeline weakness. Run discovery
against this site and score the generated tests with gauntlet/manifest.json.
The “Products” menu above reveals its links (Analytics / Billing / Webhooks / Audit log)
only on hover — they are display:none until :hover, so a non-hover accessibility
snapshot never contains them. These four links are now the ONLY way into four REAL pages that exist
nowhere else on the site (no banner link, no home card): a genuine coverage trap — miss the menu and
you lose the pages — not just a perception demo. Two more hidden doors live in the banner on every
page: the hamburger menu (three always-in-DOM role=menuitem links behind a
visibility:hidden panel) and the “More” menu (two links that are created by
JavaScript only when the menu is opened).
-
Invoices
Invoice table with an identical Delete button and Edit link per row, a row count, and more controls than the snapshot cap. (G1, G2, G11)
-
Users
Cap-buster: 36-row grid × 3 distinctly-named actions (108 controls). (G2, G11, G19)
-
Jobs
SURVEY PARENT door. Children /jobs/mine, /jobs/team, /jobs/:id not in banner — deep owns the subtree. Bare Open links + protected Fill. (survey→deep handoff)
-
Applicants
PRIMARY-ACTION depth trap: grid only has safe Review; Analyze candidate lives on detail (async fit score). (P1–P9)
-
Operations
Cross-industry primary buttons that 303 to durable outcomes; Export ledger disabled until range. (P3–P7)
-
Approvals
Change-request queue (list → detail → Approve). APR-07 silent-approve lie: toast says approved, Status stays Pending. (modern SaaS + app_bug)
-
Releases
Deploy catalog + env pins + Promote to production. REL-05 fake-promote; Rollback all EXEMPT bait. (modern deploy flow)
-
Console
The ANONYMOUS-action grid: 40 members + a service-accounts table whose row actions are BARE verbs (no name, no testid, no id) — identity lives only in the row cells + Edit href. Deep protected/suspended/deletable rows sit past the render cap, so census-OFF cannot even see them. The census deciding experiment. (G1, G11, G19)
-
Console live
The FETCH/JSON variant of the anonymous grid — rows load from /api/console/members and mutate via fetch() DELETE/POST with NO navigation. Tests network capture + async assertions (await the row vanish / live-region, not a URL change). (G1, G5, G11)
-
Console mixed
A grid where HALF the rows expose a clean row identity (named Edit link) and half are bare + brittle-only — measures whether the pipeline picks the BEST available locator per row and degrades gracefully when identity is missing. (G1, G11, G19)
-
Admin tables
TWO independent grids (Team members + API keys), each with its own per-row Delete — the row-action census must scope per container and not merge them into one phantom count. (G1, G11)
-
Records
A records grid where protected rows render a genuinely disabled Delete alongside enabled ones — the census must disclose disabled counts and no test may click them. (G1, G3, G11)
-
Drafts
A drafts grid where every row has TWO same-verb destructive controls (Delete + Delete permanently) — the census must count distinct rows, not controls. PLANTED DR-508 fake-delete: toast says deleted, row remains. (G1, G11, APP_BUG)
-
Files
A files grid whose delete control is an emoji-prefixed "🗑 Delete" — the census must still recognise it as destructive. PLANTED F-709 mid-list fake-delete. (G1, G11, APP_BUG)
-
Settings
Prefilled multi-section settings form. PLANTED optimistic-rollback on Display name hint: toast Settings saved but field reverts on next GET. (G6, G9, G10, G12, G20, APP_BUG)
-
Notifications
Live-region toasts, error alerts, and empty states that appear after actions. (G5)
-
SPA
Hash-routed single-page app; every link is a #/ fragment. (G7)
-
Modals
Nested modals with a Cancel/Save pair and dynamic record titles. (G16, G17)
-
Consent
A cookie-consent overlay blocks everything until dismissed. (G13)
-
Div Soup
Non-semantic div/span clickables, icon-only buttons, offscreen and occluded elements. (G14, G18)
-
Shadow DOM
A web component with its form inside shadow DOM.
-
Frames
Same-origin iframe containing the actual form. (G8)
-
Charts
A canvas-drawn chart whose interactive regions are pixels, not DOM. (G15)
-
Long Page
A login form buried below hundreds of content blocks. (G21, G22)
-
Big List
A 1,000-item list that only renders the visible window. (G14)
-
Marketing
Marketing page repeating the same CTA links in nav, hero, cards, and footer. (G1 strict-mode)
-
Upgrade
A 3-step upgrade wizard whose later steps 303 back to the earliest incomplete step — scenarios must sequence prerequisites; the confirmation number is dynamic. (planner ordering)
-
Shipments
60 shipments behind real ?page=N pagination (deep rows exist only on pages 3-6) and a native confirm() guarding every Delete. (pagination + dialogs)
-
Contacts
A contacts grid that re-renders in English, Arabic (RTL, Arabic-Indic digit counts), and Japanese — with astral-plane and CJK contact names. (i18n serialization)
-
Documents
A real file-upload form (setInputFiles territory) and Content-Disposition downloads, backed by per-session document CRUD. (file I/O)
-
Workspace
One page, two builds: POST /drift/deploy redesigns the UI while behavior stays identical — previously-green selectors break and must HEAL as fixes, never app_bug. (heal bait)
-
Engagement
The assertion-strength trap: a favorites button that toasts success but never persists, a no-op control, an HTTP-200 error page, and a volatile live counter. (hollow-test bait)
-
Wishlist
The additive-contradiction gate stressor: an "Add to wishlist" button with NO feedback (no toast, no count) and a permanently-empty wishlist framed as by-design account-sync. A hollow "clicked Add, still empty" @regression must be HELD @needs-review, never shipped green — but a no-click empty-state test is legitimate and must ship. (strength-gate bait)
-
Integrations
-
Sign up
Registration with a dev-mailbox email verification code — the only place the random 6-digit code exists is /mailbox, so a passing test must read it at runtime. (register + verification flow)
-
SSO
A single sign-on redirect dance (SP → a separate-looking Gauntlet ID screen → callback with one-time code+state) — auth capture must record the whole handoff; set GAUNTLET_SSO_PEER_ORIGIN for a real cross-origin hop. (redirect-dance auth)
-
Live ops
A live ops feed streaming server-sent events into a log region — a moving target where only the durable controls (pause/clear/status) are safe to assert. (SSE / live data)
Auth-proof URL stressors
Two extra sign-in flows whose authenticated landing deliberately exposes no durable element proof (the only Sign-out hides inside an initials-avatar menu), forcing the pipeline onto a URL-based auth proof. Each lands on a route that carries state the proof must strip before it can match:
- Vault sign-in — lands on
/vault?welcome=1&ref=login(query landing). - Portal sign-in — lands on
/portal#/home(hash-router landing).
Off-nav heal baits
Footer / home only (not banner nav):
- Account Profile — server always 500 on save (heal → app_bug).
- Reports (crash) — client throw blanks the region (heal → app_bug).
Go to dashboard (requires sign-in) · Reset data
· After a Validate run, compare findings to repo COVERAGE.md.