Subpages.
One URL, but most product judgement happens across several pages — pricing, signup, checkout, help, terms. After the entry page is audited, the LLM identifies the most important internal links and runs the same battery on each. Findings that show up on every page collapse into one entry with cross-page evidence.
What it does pickSubpages()
Once the entry-page audit finishes, the LLM is shown a compact list of the visible internal links + the entry-page screenshot. It picks the N most consequential targets (default 2, configurable 0–20) — usually the pages a real evaluator would click next: /pricing, /signup, /help, /checkout, /about, top product pages. Each pick comes with a reason field so you know why the agent thought that page mattered.
Each subpage then runs through the same pipeline: capture (screenshot, HTML, console, network), analyse, accessibility audit, exploratory steps. A pruned version of the report doc per subpage gets attached to report.subpages[]. A post-pass deduplication step groups identical findings across pages into report.issueDuplicates: e.g. "footer 'Privacy Policy' link is 404 — seen on home, pricing, help (3 pages)."
What it audits
- Pricing pages — table clarity, hidden fees, plan-comparison ergonomics, CTA prominence, FAQs
- Signup & login — form validation, error message quality, password-visibility toggle, social-login affordances
- Checkout — shipping/billing forms, promo-code application, address autofill, order-confirmation clarity
- Help / docs — search functionality, navigation, content completeness, deep-link IDs, last-updated stamps
- Product pages — image gallery, descriptions, reviews, variant selectors, stock status
- Legal / footer pages — privacy, terms, cookie policy, security page (Diana's persona checks these)
- About / team — credibility signals, recent activity, social links that actually work
Cross-page deduplication
The same bug surfacing on 5 pages is one bug to fix, not 5 separate findings. Post-run we walk every issue across every subpage and group by canonical signature (category + selector + similar title). The output:
{
"title": "Footer 'Privacy' link returns 404",
"category": "reliability",
"severity": "medium",
"affectedPages": [
"/",
"/pricing",
"/help",
"/checkout",
"/about"
],
"firstSeenOn": "/",
"evidence": "All 5 pages render `<a href=/legal/privacy>` in the footer.\nThat URL responds 404. Likely a deleted route that the shared footer\ncomponent still links to."
}
Coverage
reason.issueDuplicates with the list of affected pages.- Not a crawler — picks from links visible on the entry page. Deep parts of the site (5 navigation clicks in) require submitting those URLs directly.
- The LLM may pick boring pages (terms-of-service, privacy) over interesting ones. Submit the URLs you specifically want audited if the auto-pick misses.
- Each subpage adds ~30–60s of wall-clock time + 1 page-credit. A 20-subpage audit is ~10 minutes and 20 credits — bound your run.
- No state-carry between subpages — each opens in a clean context. Flows that require multi-step state must be defined as Custom Tests.
- Sites with infinite-scroll feeds or single-page-app routing may report fewer real "subpages" — the LLM sees rendered HTML links, not framework routes.
Sample subpage entry
// One entry from report.subpages[] { "id": "a3f2c1b9-...", "url": "https://acme.example.com/pricing", "label": "Pricing", "reason": "Most consequential conversion page — visible from hero CTA", "analysis": { "score": 72, "issues": [ { "category": "content", "title": "Pricing card 'most popular' badge overlaps the price" }, { "category": "usability", "title": "Monthly/annual toggle has no keyboard support" }, // … ] }, "screenshotUrl": "https://.../subpage-1-screenshot.jpg", "durationMs": 38421 }