Orphan Page Audit — Test Matrix
6 Intentional IssuesSeven fixtures for exercising an orphan-page detector: six URLs that should be reported (each unreachable for a different reason) and one properly linked control that should not. The orphan URLs below are printed as text, never linked — linking them would destroy the fixture.
What counts as an orphan here
A page is orphaned when it exists and returns 200, but no crawlable <a href> on any fetchable, indexable page of the site points to it. Being present in sitemap.xml does not cure the problem: a sitemap entry declares a URL, it does not give the page internal link equity or a finite click depth.
Expected totals for this site: 6 orphans reported, /orphan-control-linked left clean.
/sitemap.xml and /robots.txt are generated per request from the Host header, so every <loc> is on the same origin you are crawling. They used to be static files pinned to https://example.com, which made every sitemap entry look cross-origin and silently reduced the sitemap set to zero — orphan detection could never fire.
| URL | Expected verdict | In sitemap | Inbound links |
|---|---|---|---|
/orphan-simple | ORPHAN | yes | none |
/orphan-in-sitemap | ORPHAN | yes | none |
/orphan-not-in-sitemap | ORPHAN | no | none |
/orphan-linked-from-noindex | EFFECTIVE ORPHAN | yes | 1, from /noindex-page |
/orphan-linked-from-blocked | EFFECTIVE ORPHAN | yes | 1, from /private/blocked-page (Disallow: /private/) |
/orphan-js-only-link | EFFECTIVE ORPHAN | yes | 0 anchors; one button onClick on this page |
/orphan-control-linked | NOT AN ORPHAN | yes | 1, from this page (a real anchor) |
What each fixture catches
/orphan-simple- The simplest possible orphan — 200, indexable, in the sitemap, no inbound links, no canonical to confuse URL keying. If a detector misses this one, the fault is in the detector.
/orphan-in-sitemap- Same as above but with a self-referencing canonical, so it also checks that canonical handling does not suppress the finding.
/orphan-not-in-sitemap- Invisible to both crawling and sitemap diffing. Needs a URL source outside the site graph — route manifest, server logs, Search Console.
/orphan-linked-from-noindex- Counting raw anchors clears it; counting anchors on indexable pages flags it. Tests which definition your script implements.
/orphan-linked-from-blocked- Tests robots.txt compliance. A script that reads files off disk sees the link; a compliant crawler never fetches the source page.
/orphan-js-only-link- Tests that only href attributes count. A regex over response bodies finds the path string in the JS bundle and wrongly clears it.
/orphan-control-linked- False-positive check. Reporting this URL as an orphan means the detector is over-flagging.
The two non-anchor navigation paths
The button below navigates with router.push() from an onClick handler. View source and you will find no href for its destination — it is a button, not a link, so it must not count as link discovery. Beside it is the control, wired with an ordinary anchor.
Keeping these fixtures valid
- Never add the orphan URLs to the navbar, the footer, the homepage or the issues index.
- Keep
/orphan-not-in-sitemapout ofsitemap.xml. - Keep the sole inbound links to the noindex and robots-blocked fixtures on their current source pages only.
- The orphan pages link outward to this hub. Outbound links do not affect orphan status — only inbound ones do.