link-audit
Playwright Link Audit
Crawls outward from a starting point, finds every internal link and image the rendered page actually exposes, and checks whether each one resolves. Unlike everything else discovery-oriented in this toolkit, this isn't curated — it's meant to be exhaustive, because a broken link three levels deep in the site is just as broken as one on the homepage.
Relationship to the other skills
Doesn't need scenario-mapper's output the way visual-snapshot and performance-audit do — this crawls far beyond what that skill's shallow, curated pass would ever cover, by design. It's fine to start from the same seed (homepage, primary nav) if convenient, but the crawl should go wherever the site's own links lead, not stop at one level deep.
Findings here don't need bug-triage's involvement. An HTTP status code is a deterministic, immediately confirmed fact the moment you observe it — there's no reproducibility question or root-cause investigation the way there is for a UI behavior bug. Report it directly.
Core principles (and why)
Discover via the browser, verify via lightweight HTTP requests — not a full page load for every link. Finding the links in the first place needs a real browser: a JS-heavy site can render links into the DOM that would never show up in raw HTML, so a plain HTTP crawler would miss them. But once a URL is known, loading a full page — images, scripts, full render — just to check whether it 404s is needlessly expensive across what could be hundreds of links. Use Playwright's request API (a lightweight HTTP call within the same browser context) for the actual status check, and reserve full navigation for pages you're deliberately crawling deeper into.
Stay within the site's own domain for recursive crawling; verify external links without crawling into them. Following external destinations recursively turns a link check into an uncontrolled crawl of the internet. Confirm an external link actually resolves, then stop — don't follow it further.
Guard against crawl traps. Pagination, calendar widgets, faceted search filters, and similar patterns can generate effectively unbounded URLs. Cap the total pages crawled, deduplicate by normalized URL, and watch for a URL pattern that's clearly generating new pages indefinitely rather than following it forever hoping it terminates.
Redirect chains and loops are findings too, not just hard failures. A redirect loop (A → B → A) will hang a real user's browser and deserves the same urgency as a 404. A long redirect chain (roughly four or more hops) technically works but is slow and fragile — worth flagging even though it isn't broken yet.