site-triage
releasev1.0.0Claude Code plugin that diagnoses why a live site is not indexed, traces each reason to the file that causes it, fixes it, and verifies the fix.
README Snapshot
site-triage
A Claude Code plugin that works out why a live site is not showing up in Google, traces each reason to the file or setting that causes it, fixes it, and verifies the fix.
C1 redirect targets resolve to 200 ............................. OK
C2 live robots.txt matches repo ............... FAIL a CDN is injecting a managed block
C3 http://example.com/ -> 307 ................. FAIL temporary; must be 301/308
C7 /index.html returns 200 at 1224 bytes (root: 72763) ... FAIL SSR bypassed
and: no canonical
and: indexable (no noindex)
Every line above is a command that ran, not a rule that was read.
Why
Search Console tells you what — "Page with redirect ×37", "Not found (404) ×3" — and stops there. Turning that into a change in a file is the whole job, and it is where most tooling leaves you: a score, a checklist, a list of symptoms.
Two things make that harder than it looks.
Most of those counts are not defects. A site with 40 canonical URLs whose slashless twins all return a permanent redirect will show ~39 "Page with redirect" entries, and every one of them is Google correctly consolidating. Chasing them changes a working site. This plugin does the arithmetic first and is willing to conclude that nothing is wrong.
Written rules drift from live behaviour. A config comment saying "no 2-hop chain" was wrong for months in the codebase this plugin was built against, because nothing tested it. So the checks here are runnable commands with one-line verdicts, not prose.
Install
/plugin install site-triage --marketplace voyvodka/claude-plugins
That adds the catalog and installs the plugin in one command, on Claude Code 2.1.275 or later (from the
shell, claude plugin install site-triage --marketplace voyvodka/claude-plugins needs 2.1.292).
On an older version, register the catalog first:
/plugin marketplace add voyvodka/claude-plugins
/plugin install site-triage@voyvodka
Requires Claude Code. The diagnostic checks need curl, grep and a POSIX shell — present on
macOS and Linux by default. GEO scoring uses the GeoDaddy MCP server,
declared by the plugin and fetched via npx on first use; Search Console access needs a one-time
Google OAuth setup, and both are optional.
If GeoDaddy fails to connect. Claude Code gives an MCP server 30 seconds to start. The first
npx run of geodaddy-mcp downloads the package and, in its postinstall step, the analyzer binary
from GitHub releases — on a slow network that can run past 30 seconds, and the failure is then
cached for a while. Start Claude Code once with a longer limit, e.g. MCP_TIMEOUT=90000 claude,
so the cache fills; later starts take about a second. The postinstall step ignores its own
failure (|| true): if the binary download fails, the server still starts and only analyze_url
fails, with "geodaddy binary not found". Clearing the npx cache entry for geodaddy-mcp and
starting again re-runs the download.
Usage
Invoke it in a site's repository:
/site-triage
It picks a mode — launch, audit, or brand-only — scans the project, and produces a severity-ranked gap report before changing anything. For a live site it runs the diagnostic checks first and reports what they returned.
Ask it directly when you already know the question:
why isn't this page indexed? score this site for AI search set up Cloudflare deployment with the apex redirect
What it covers
| Area | What it does |
|---|---|
| Diagnosis | Maps each Search Console reason to its cause; ten runnable checks for redirect chains, edge-injected robots.txt, temporary redirects, hop counts, sitemap health, canonical mismatches, SSR shell leaks, header delivery, and social cards |
| Discoverability | robots.txt, sitemaps, llms.txt, security.txt, JSON-LD, the full meta head, multi-page canonical and breadcrumb structure |
| GEO | Scores AI-search signals with GeoDaddy, and says where that tool's scoring disagrees with this one — including one finding of its own that is measurably wrong |
| Deployment | Cloudflare Workers: wrangler config, headers, redirects, custom domain and SSL, plus the failure modes that cost real hours |
| Hardening | Dependabot or Renovate, CI audit gates, secret scanning, SBOM, licence sweep, pinned actions |
How it works
It reads, then proposes, then asks. Diagnosis is entirely read-only: HTTP requests to the public site and reads of the repository. Nothing is written until you approve a plan.
Search Console access is read-only apart from submitting a sitemap. The API has no request-indexing and no start-validation method, so the plugin says what it changed and hands you the interface link rather than pretending it triggered a recrawl. Credentials stay on your machine.
Every technical claim carries the date it was verified and the source it came from. Reference files are stamped at three levels — verified, partially verified, not re-verified — and the plugin puts itself on a 60-day review clock. An unstamped claim is unverified, and it says so rather than sounding certain.
Limitations
- Cloudflare only, for deployment. Diagnosis is platform-agnostic and runs over live HTTP, but scaffolding and deploys target Cloudflare Workers. Knowing one platform properly beat knowing four halfway.
- No content, no analytics, no consent flows. It builds the technical scaffolding; the words and the tracking are someone else's job.
- No deep application SEO — hreflang for multi-region sites, e-commerce product feeds, and logged-in single-page apps are out of scope.
- "Crawled – currently not indexed" cannot be closed technically. It is a content and authority question. The plugin names it and does not pretend otherwise.
- Search Console's coverage report cannot be downloaded. No API exposes it, so the plugin reconstructs a candidate URL set and inspects it — the numbers will approximate the interface, not match it, and it says which URLs it could not reach.
Contributing
Issues and pull requests are welcome, particularly measurements: a check that misses a real defect, or one that fires on a healthy site, is the most useful thing you can report. Include the command and its output.
A claim without a source will not be merged — that rule is the product, not a preference.
License
MIT — see LICENSE.
Changelog
Changelog
All notable changes to the site-triage plugin (named web-launcher before 1.0.0) are
documented here. The format follows Keep a Changelog, and this project
adheres to Semantic Versioning.
Content carries verification dates; a release that only re-verifies claims still gets an entry.
[Unreleased]
[1.0.0] - 2026-10-14
Changed
web-launcheris renamed tosite-triage. BREAKING: install with/plugin install site-triage@voyvodkaand run/site-triage. Claude Code 2.1.193+ rewritesenabledPluginsautomatically; expect oneplugin-cache-missand a reinstall. No content changed.
[0.4.0] - 2026-10-14
Added
- AI-search visibility reports. Bing Webmaster Tools' AI Performance and Search Console's
Generative AI performance report are covered, with a first check for zero AI impressions (
04,15,16). - Release-age gates for npm, pnpm, Bun and Yarn, and npm 12's blocking of dependency install
scripts unless
allowScriptsallows them (13). - Cloudflare's AI bot policies (Search, Agent, Training), Bot Preference Sync and the managed
robots.txt
use=referenceline (06,08, C2 in14). - User-triggered fetchers such as ChatGPT-User are no longer listed as robots.txt controls;
Meta-WebIndexer, Amzn-SearchBot and OAI-AdsBot are added (
03,15). - The live probes in
08,09and11print a verdict for every check, including000/NO RESPONSEandMISSING:lines. 08covers Workers Builds,wrangler-actionv4, Worker Previews, thecfCLI beta, cache Invalidate, redirect status codes per mechanism, and anhttp://probe.
Changed
- Content re-verified on 2026-10-14; review due 2026-12-13. Claims that could not be re-read keep their older stamp or a ⚠️.
- Search Console's reason table (
16) uses Google's current labels and adds the missing reasons, including Redirect error, Server error (5xx), 401, 403, Duplicate without user-selected canonical, Discovered – currently not indexed, and the warnings "Indexed, though blocked by robots.txt" and "Page indexed without content". - Google's published timings for crawling after a request and for duplicate clusters replace "Google publishes no timing".
07covers satori 0.56.1's breaking layout changes:@vercel/og1.0.3 still runs satori 0.33.5, direct satori does not.06covers isitagentready's 22 checks and API, and scopes the plugin to four of its signals.- GitHub Actions guidance pins every action by SHA and covers the workflow lockfile; the
13§13.11 pin check reads more ref formats and ends in an OK/FAIL line. - Dependabot's default 3-day cooldown and per-ecosystem limits are documented, and that pnpm 12 and
npm 12 fall outside its documented versions (
13). - Versions re-resolved on 2026-10-14: wrangler
4.151.0, satori0.56.1, svelte-sitemap4.1.2,setup-nodev7.1.0,codeql-actionv4.38.3,pnpm/setupv3.1.1, pnpm12.11.2, TruffleHogv3.99.2, Syftv1.54.1. 08and13match current vendor docs on Pages versus Workers,--use-keyring, Automatic SSL/TLS, Secret Protection, Node 20 runners and npm trusted publishing.- README leads with the one-step install,
/plugin install web-launcher --marketplace voyvodka/claude-plugins(Claude Code 2.1.275 or later).
Fixed
- SVG logos are allowed for
Organization.logo; Search favicons still need an ICO (01,03,10). 12and16list the Search Console API's other writes (sitemaps.delete,sites.add,sites.delete), which the plugin never calls.- Web Bot Auth uses the correct directory media type and a signed response; the advice to publish
an empty key set is withdrawn (
06,09,13,SKILL.md). - The baseline
Permissions-Policyno longer ships the deprecatedbrowsing-topics=()(08). - The Markdown-for-Agents middleware no longer sets the dropped
X-Markdown-Tokensheader and addsVary: Accept(06). llms.txtis linked withrel="describedby", notalternate(03,06,08).- A single trailing-slash redirect reports as "Page with redirect", not "Redirect error", and
Googlebot follows up to ten hops (
09,14,SKILL.md). - The SoftwareApplication template is marked ineligible for the rich result without
aggregateRatingorreview, which must never be invented (03,09). security.txtExpiresis under a year, per RFC 9116, and the sitemap template drops<changefreq>and<priority>(03).- 302/307 are a weak canonical signal, not none (
14);sizeson<link rel=icon>is optional (01); theme-color applies only to installed web apps in desktop Chrome and Safari 26 (01,02,03).
[0.3.3] - 2026-09-25
Added
- README: what to do when GeoDaddy fails to connect, including
MCP_TIMEOUTfor the slow firstnpxstart and a failed analyzer download that breaks onlyanalyze_url.
Changed
- Versions re-resolved on 2026-09-25: satori
0.33.5,@vercel/og1.0.3,astro-og-canvas0.13.2,@astrojs/sitemap3.7.4, wrangler4.140.0, Lighthouse13.5.0,codeql-actionv4.38.2, TruffleHogv3.97.9, Syftv1.52.0, CycloneDX spec1.7.2. - pnpm 12 in
13-dependency-security.md. The example pins thepnpm/action-setupv6.1.0SHA withversion: 12, and notes thatpnpm/setupv3installs pnpm 11+ only and runspnpm installby default. 11lists all seven Lighthouse 13.5.0 Agentic Browsing audits, including the neward-schema(ai-catalog.json) audit.06names AIPREF's provisionalai-usecategory (draft-ietf-aipref-vocab-08) as the counterpart toContent-Signal'sai-input.
Removed
- Every unsourced indexing and logo timeline in
10and12; they now say "days to weeks, depending on crawl frequency" and point to Search Console.
Fixed
- C1 passes a correct
404. A redirect ending anywhere but200fails, a5xxfails, and the OK line counts how many probes redirected. - C3 requires consolidation: exactly one variant may answer
200; the others must 301/308 into it. 09's action-pin check now runs13.11check 4.- The baseline CSP no longer carries
script-src 'unsafe-inline'. SKILL.md's always-loaded pitfalls match08: no unconditional SPA fallback, no unsourced field observations, and a zone rule instead of a Worker redirect.08's Worker-redirect variant no longer hardcodes the SPA fallback or expects random paths to answer200, and11.1no longer tests www→apex only on a random path.09and11take the probe address from DNS instead of a hardcoded Cloudflare IP.15's citation check resolves each token to its governing robots.txt group and now sees aDisallowunderUser-agent: *; GeoDaddy's training-crawler count is corrected to five.16maps "Blocked by robots.txt" torobotsTxtStateandpageFetchStateinstead of the retiredindexingState: BLOCKED_BY_ROBOTS_TXT.13.11no longer runsyarn outdatedon Yarn Berry, and the13.3workflow SHA-pins its third-party actions.06no longer callssitemapandsecurity-txtIANA-registered or recommends the empty JWKS placeholder, and points to14C2 for the live-vs-repo diff.Content-Signaland the empty JWKS placeholder are intent-only everywhere, no longer proposed as fixes or rated 🟡 (09,13.11).mask-iconis gone everywhere, and02and03include thefavicon.icothat01requires.02no longer states as verified two iOS claims that lack a primary source.05's orphan check no longer reports every page as an orphan.11drops retired Lighthouse font-size and tap-target audits and counts the WebMCP audits correctly.03's humans.txt template and13's examples no longer carry a real project's stack or a real timezone.01's emoji search no longer usesgrep -P, so it works with macOS grep.14: C2 prints a result on success, C5 handles a sitemap index, and C6/C9 match tags whose attributes come in either order.03'sllms.txtclaim cites Google's documentation update and marks the crawler-traffic claim as secondary.SKILL.mdno longer runs the Mode-B-only live probe in Mode A, counts 15 validators, and leads its description with the trigger keywords.
[0.3.2] - 2026-09-08
Fixed
- The 0.3.0 and 0.3.1 entries in this changelog no longer list the same fixes twice under two
### Fixedheadings.
[0.3.1] - 2026-08-28
Fixed
- C4 and C7 no longer pass an unreachable origin: both detect the
000sentinel first and print? not checked. 13-dependency-security.mdruns one audit tool: the Mode B sweep picks the package manager from the lockfile, withbunandyarnbranches, instead ofpnpm audit || npm audit.- The
@vercel/ogrow in07-og-satori.mdsays1.0.2(published 2026-08-24, pinning[email protected]), matching the prose. - The claim that Workers has no "deployment finished" event is marked partly verified; the advice
to add a step after
wrangler deployis unchanged.
[0.3.0] - 2026-08-28
Changed
16-search-console.mddefaults to thewebmasters.readonlyscope, widening only when the user asks and confirms the sitemap URL, and states it is a procedure, not client code.14-diagnostic-checks.mdwarns that C5, C7 and C9 request URLs taken from the audited site's content.
Fixed
- Diagnostic checks no longer report a skipped or failed run as healthy (
14): C1 passes only a final200and flags a host that never answered, C5 and C7 flag zero URLs read, and C9 prints a counted OK line. - The baseline
wrangler.jsoncno longer ships an SPA fallback to every site;not_found_handling: "single-page-application"now depends on the site shape. 03's meta template uses raster images forapple-touch-iconandOrganization.logo, matching01and10.- The checks run in a POSIX shell: every block in
14,09and11passesdash -nas well asbash -n. - Audits run exactly one scanner:
pnpm audit … || npm audit …is replaced withpackageManager-then-lockfile detection,bunincluded. 09-audit-workflow.mdno longer says "Commit logically"; commit, push, deploy, cache purge, sitemap submit and DNS changes each need their own named approval.15-geo-measurement.mdclassifiesClaudeBotas a training crawler, explains theGoogleOthercheck GeoDaddy runs, and adds acurlcheck against the tokens that decide citation.10-brand-serp.md's canned user message no longer reports "Requested indexing via GSC" as done.SKILL.md's Mode C stops at step 3 instead of running a full-scope scan.08-cloudflare-deploy.mdno longer justifies CSP'unsafe-inline'by inline JSON-LD.01-brand-application.mdmatches the icons itssite.webmanifestreferences, and its verification checklist uses per-category placeholder searches.og:urlis set per route:03's meta template no longer hardcodes the site root,05lists it among per-route overrides, and03says when to load05.06-agent-ready.md's section header no longer says to "ship the top two always".02-coming-soon-scaffold.md's skeleton loads all three font families its typography section specifies.11-validation-toolkit.mdrequests reindexing once per URL per content change, not on every meaningful change.12-indexing.mddescribes IndexNow automation as a deploy-pipeline step, not a "wrangler deploy event".13-dependency-security.mdsays how to choose when a repo runs both Dependabot and Renovate, and that deleting the config alone does not stop Renovate.
[0.2.0] - 2026-08-28
Changed
.mcp.jsonpins[email protected]instead of running the registry'slatest.- Version claims refreshed on 2026-08-28: satori
0.29.0→0.33.4, `codeql-ac
Releases
- v1.0.0Open on GitHub
Changed
web-launcheris renamed tosite-triage. BREAKING for anyone with the old name inenabledPlugins: install is now/plugin install site-triage@voyvodka, and the skill is/site-triage. The catalog'srenamesentry maps the old name to the new one, so Claude Code 2.1.193+ rewrites user, project and local settings automatically; expect oneplugin-cache-missand a single/plugin install. The repository moved tovoyvodka/site-triage; GitHub redirects the old URL.Diagnosis became the primary job, and "launcher" only described the first day. Triage — working out what is wrong and in what order to fix it — is what the skill's 🔴/🟡/🟢/⚪ rubric does, and "site" covers SEO, GEO, deploy and supply chain together. No content changed.
- v0.4.0Open on GitHub
Added
- AI-search visibility is measurable now, and the references say where. Bing Webmaster Tools'
AI Performance (citations, cited pages, grounding queries) and Search Console's Generative AI
performance report (AI Overviews and AI Mode impressions, rolled out to every site on
2026-08-31) reverse the "no citation report" line in
04and15. The Search Console report is interface-only — no API search type, no bulk-export table — and16says so, with a first check for zero AI impressions: the property's Search generative AI setting. - Release-age gates for npm, pnpm, Bun and Yarn, each in its own unit and with its real default,
plus npm 12 blocking dependency install scripts unless
allowScriptsallows them (13). - Cloudflare's AI bot policies (Search, Agent, Training) and Bot Preference Sync — the managed
robots.txt block now carries
use=reference, and a Free zone without its own robots.txt is served Cloudflare's Content Signals Policy text (06,08, C2 in14). - Robots-honouring crawlers and user-triggered fetchers are told apart, quoting each vendor:
ChatGPT-User, Perplexity-User, Meta-ExternalFetcher, Google-Agent and the other user-triggered
fetchers may not follow robots.txt, so they are no longer listed as controls (
03,15). Meta-WebIndexer, Amzn-SearchBot and OAI-AdsBot are added. - The live probes in
08,09and11print a verdict for every check: a status andlocationper redirect,000/NO RESPONSEfor a host that did not answer,MISSING:per absent security header — silence no longer reads as a pass. 08: Workers Builds,wrangler-actionv4, Worker Previews and thecfCLI beta as paths (wrangler stays the documented one); cache Invalidate next to Purge; the redirect status codes each mechanism offers; anhttp://probe in the verification block.
Changed
- Content re-verified on 2026-10-14; review due 2026-12-13. Every file was walked against its primary source; claims that could not be re-read keep their older stamp or a ⚠️.
- Search Console's reason table (
16) uses Google's current labels and gains the reasons it lacked: Redirect error, Server error (5xx), 401, 403, other 4xx, Duplicate without user-selected canonical, Discovered – currently not indexed, and the two warnings, "Indexed, though blocked by robots.txt" and "Page indexed without content". - Google's published timings are quoted instead of "Google publishes no timing": crawling after a request takes "a few days to a few weeks", a duplicate cluster "up to two weeks".
- satori moved from 0.33.5 to 0.56.1 with three breaking layout changes, none in the release notes:
Taffy, browser
displaydefaults, and CSS initial values forposition,box-sizingand borders (a padded card overflows).07now splits the advice:@vercel/og1.0.3 still runs 0.33.5, direct satori does not. - isitagentready runs 22 checks in five categories and has an API;
06names its own four signals as its scope and the rest as parked. - GitHub Actions guidance pins every action by SHA, GitHub's own included, and covers the workflow
lockfile (public preview). The pin check in
13§13.11 skips only workflows the lockfile lists, reads quoted, CRLF and flow-style refs, and ends in an OK/FAIL line;09points at it instead of carrying a copy. Dependabot's default 3-day cooldown and its per-ecosystem limits are documented, and so is the gap: pnpm 12 and npm 12 sit outside the versions it documents (pnpm v7–v10, npm v7–v11). - Versions re-resolved on 2026-10-14: wrangler
4.151.0, satori0.56.1, svelte-sitemap4.1.2,setup-nodev7.1.0,codeql-actionv4.38.3,pnpm/setupv3.1.1 (SHAs re-resolved), pnpm12.11.2, TruffleHogv3.99.2, Syftv1.54.1. CI's ownsetup-nodepin moved to v7.1.0. 08and13re-read against the vendors: Cloudflare's Pages docs now steer new projects to Workers and C3 creates a Workers project by default (Pages is still not deprecated);--use-keyringkeeps only the encryption key in the keychain; Automatic SSL/TLS is the default mode; Secret Protection cannot be bought for a personal private repository; Node 20 is gone from GitHub-hosted runners; npm trusted publishing expires unvalidated configurations after 48 hours and rejectsissue_commenttokens.- README leads with the one-step install,
/plugin install web-launcher --marketplace voyvodka/claude-plugins(Claude Code 2.1.275 or later).
Fixed
- SVG logos are allowed.
Organization.logoonly has to be a Google Images format, and Google Images supports SVG. Search favicons are the opposite — Google's list has no SVG — so the ICO stays (01,03,10). - The Search Console API has more writes than
sitemaps.submit(sitemaps.delete,sites.add,sites.delete); they change the account, and the plugin never calls them (12,16). - Web Bot Auth: the directory's media type is
application/http-message-signatures-directory+jsonand the response must be signed; the advice to publish an empty key set is withdrawn — the scanner requires a key and scores a missing directory as informational only (06,09,13,SKILL.md). - The baseline
Permissions-Policyshippedbrowsing-topics=(), itself deprecated — the same failure the note above it was written to fix (08). - The Markdown-for-Agents middleware set
X-Markdown-Tokens, which Cloudflare dropped on 2026-10-09, and lackedVary: Accept, so a cache could serve markdown to browsers (06). llms.txtis linked withrel="describedby";alternateis for a page's own markdown (03,06,08).- A single trailing-slash redirect reports as "Page with redirect", not "Redirect error", and
Googlebot follows up to ten hops rather than stopping at the first (
09,14,SKILL.md). - The SoftwareApplication template is valid but not eligible for the rich result without
aggregateRatingorreview; never invent one (03,09). security.txtExpiresis under a year, per RFC 9116; the sitemap template drops<changefreq>and<priority>, which Google ignores (03).- 302/307 are a weak canonical signal, not none (
14);sizeson<link rel=icon>is allowed, not required (01); theme-color is used only by installed web apps in desktop Chrome and Safari 26 (01,02,03).
- AI-search visibility is measurable now, and the references say where. Bing Webmaster Tools'
AI Performance (citations, cited pages, grounding queries) and Search Console's Generative AI
performance report (AI Overviews and AI Mode impressions, rolled out to every site on
2026-08-31) reverse the "no citation report" line in
- v0.3.3Open on GitHub
Added
- CI's changelog check now requires a
[x.y.z]:link for every released version and an[Unreleased]link that compares from the newest tag. Two releases shipped without their links and[Unreleased]kept comparing fromv0.3.0; nothing looked, so nothing noticed. - README: what to do when GeoDaddy fails to connect. The first
npxstart downloads the analyzer binary and can run past Claude Code's 30-second MCP limit (MCP_TIMEOUTraises it), and the package's postinstall ignores a failed download, so the server starts and onlyanalyze_urlbreaks.
Changed
- Versions re-resolved on 2026-09-25 against npm and GitHub: satori
0.33.5,@vercel/og1.0.3,astro-og-canvas0.13.2,@astrojs/sitemap3.7.4, wrangler4.140.0, Lighthouse13.5.0,codeql-actionv4.38.2(SHA re-resolved), TruffleHogv3.97.9, Syftv1.52.0, CycloneDX spec1.7.2. - pnpm 12 became
latest, which is the event13-dependency-security.mdsaid to re-check on.pnpm/action-setupnow supports pnpm 12 and earlier, but only fromv6.1.0— its floatingv6tag still points atv6.0.10— so the example pins thev6.1.0SHA withversion: 12.pnpm/setupmoved to a breakingv3that installs pnpm 11+ only and runspnpm installby default. The old "action-setupis for v10 and older" framing is gone. - Lighthouse 13.5.0 reshaped the Agentic Browsing category:
llms-txtchanged group and anard-schemaaudit (ai-catalog.json) was added.11lists all seven audits. draft-ietf-aipref-vocab-08added anai-usecategory.06said AIPREF had no counterpart toContent-Signal'sai-input; it now has a provisional one.
Removed
- Every indexing and logo timeline.
10and12quoted unsourced ranges that disagreed with each other, while09said never to quote a number.09's rule now holds everywhere: "days to weeks, depending on crawl frequency", and Search Console for the real signal.
Fixed
- C1 failed every healthy site. Its probe paths are meant not to exist, and since 0.3.0 only a
final
200passed, so a correct404printedFAIL. C1 judges redirects: a direct404now passes, a redirect ending anywhere but200fails, a5xxfails, and the OK line counts how many probes actually redirected. - C3 passed a site with no consolidation at all. Every variant answering
200printed four OK lines — the split-authority and missing-HTTPS-redirect defects C3 exists to catch. Exactly one variant may now answer200; the others must 301/308 into it. 09's action-pin grep matched nothing. It was the regex13had already replaced for exactly that reason; the sibling was left behind. It now runs13.11check 4.- The baseline CSP still carried
script-src 'unsafe-inline', although 0.3.0's changelog and08's own note said it had been removed. SKILL.md's always-loaded pitfalls contradicted08: an unconditional SPA fallback, two field observations08had removed as unsourced (purge before retesting, "Bindings=0"), and a Worker redirect where08recommends a zone rule. Rewritten to match08.08's Worker-redirect variant hardcoded the SPA fallback and its checks expected random paths to answer200— the soft 404 0.3.0 removed from the baseline.11.1tested www→apex only on a random path, the one probe that passes when a Worker never sees real pages.09and11pinned every probe to a hardcoded Cloudflare IP, which breaks a platform-agnostic audit of any site not on Cloudflare. The address now comes from DNS.15's citation check could not see aDisallow. Grepping token names printsUser-agent:lines and nothing for aUser-agent: *block. It now resolves each token to its governing group. The file also said four of GeoDaddy's six bot checks were training crawlers; it is five.16mapped "Blocked by robots.txt" toindexingState: BLOCKED_BY_ROBOTS_TXT, which Google marks "Reserved, no longer in use" (as isverdict PARTIAL). It now usesrobotsTxtStateandpageFetchState.13.11ranyarn outdated, which13.3says Yarn Berry does not have, and the13.3workflow tag-pinned the third-party actions13.7says to SHA-pin.06calledsitemapandsecurity-txtIANA-registered link relations (they are not), told the reader to ship the empty JWKS placeholder while its own matrix says to skip it, and pointed at11for a live-vs-repo diff that lives in14C2.09proposedContent-Signaland the empty JWKS placeholder as fixes, called a missingContent-Signala GEO weakness, and counted a scanner score rise as re-validation;13.11ratedContent-Signal🟡.06's matrix andSKILL.md's ⚪ band say they have no known effect. They are intent-only everywhere now.mask-iconwas dropped in01and02but re-added by03's meta template,09's patch plan andSKILL.md's scan. It is gone everywhere now;03and02gained thefavicon.ico01requires.02stated as verified two iOS claims01says have no primary source.05's orphan check compared/docs/xagainst/x, so every page read as an orphan.11cited Lighthouse font-size and tap-target audits that no longer exist, and miscounted the WebMCP audits.03's humans.txt template carried a real project's stack;13's examples a real timezone.01's emoji search usedgrep -P, which macOS grep rejects.14: C2's managed-block test printed nothing on success, C5 reported a sitemap index as clean, and C6/C9 missed tags whose attributes came in the other order.03'sllms.txtclaim now cites Google's documentation update, and marks the crawler-traffic claim as secondary.SKILL.mdsaid Mode A ran the Mode-B-only live probe and counted 13 validators where11lists- Its description now leads with the trigger keywords.
- CI's changelog check now requires a
- v0.3.2Open on GitHub
Fixed
- Two release blocks in the changelog held the same fixes twice.
0.3.1carried two### Fixedheadings describing the same four repairs in different words, and0.3.0split twenty genuine entries across two### Fixedlists with a### Changedbetween them. The cause was the same in both: separate pull requests each appended to[Unreleased], and the release stamped both without merging them. Merged, with every unique entry kept — including the**/references/local/ignore-rule entry that appeared in only one of0.3.1's two blocks and would have been lost by deduplicating on the heading alone. The Workers "deployment finished" claim, recorded once underFixedand again underChanged, is now stated once.
Added
- CI checks the changelog's structure: no section heading twice inside one version block, only
Keep a Changelog section names, an
[Unreleased]section that the next change can land in, and one dated heading per version. This file spent two weeks stating the same fixes twice and no check looked; a written convention is not a check, which is the argument this plugin makes about every site it audits.
No reference file changed in this release — the diagnostic checks and their verification stamps are unchanged from 0.3.1.
Full changelog: https://github.com/voyvodka/web-launcher/blob/main/CHANGELOG.md
- Two release blocks in the changelog held the same fixes twice.
- v0.3.1Open on GitHub
Follow-ups from a full re-audit. Every item is something 0.3.0 missed.
Fixed
- Two more checks passed on a dead origin. 0.3.0 fixed C1, C5 and C9 for this pattern. Sweeping every check against it found two more: C4 (
hop_count) reportedOK … 0 hopfor an unreachable host — masking the dead-alias defect it exists to catch — and C7 (shell_leak_check) reportedOK no shell leakwhen the origin never answered, because every size is then 0 and every code000. Both now print? not checked. 13-dependency-security.mdstill ranpnpm audit || npm audit. 0.3.0 fixed that exact line in09-audit-workflow.mdand left the sibling in the Mode B checklist. Audit tools exit non-zero when they find something, so on a pnpm project with a real CVE the fallback fired and rannpm auditagainst a lockfile it cannot read.- The
@vercel/ogrow in07-og-satori.mdsaid1.0.1while the prose two lines above said1.0.2. The table is the block an agent quotes. - A claim added in 0.3.0 — that Workers has no "deployment finished" event — carried no date and no source, which is what this skill's own rule 3 forbids. It now states what was checked and when, and marks the conclusion unverified: the docs document no such event, but an absence is not a denial.
- Two more checks passed on a dead origin. 0.3.0 fixed C1, C5 and C9 for this pattern. Sweeping every check against it found two more: C4 (
- v0.3.0Open on GitHub
Diagnostic correctness. If you run the check suite, upgrade.
Fixed — checks that reported success on a failing site
- C1 passed a direct 404. v0.2.0 added the
000no-response branch and left the gap under it: a path that 404s without redirecting matched no branch, so the loop printedOK redirect targets resolve to 200. Only an explicit 200 at the end of the chain is a pass now. - C5 reported a missing sitemap as a healthy one. A sitemap that 404'd, timed out or parsed to nothing produced zero iterations and then printed
OK all sitemap URLs return 200. Zero URLs read is now?, not a pass. C7 gained the same guard.
Fixed — a deploy baseline that generated soft-404s
not_found_handling: "single-page-application"sat unconditionally in thewrangler.jsoncevery deploy path copies. On a multi-page site that serves the homepage with a 200 for every unknown route — and C1 cannot catch it, because the response really is 200. Now chosen from the site shape the scan phase already establishes.Fixed — the POSIX promise
The README says the checks need a POSIX shell; two blocks used process substitution. Rewritten rather than softening the promise: every bash block in
14,09,11and08now passesdash -nas well asbash -n.Fixed —
pnpm audit || npm auditran bothAudit tools exit non-zero when they find something, so the fallback fired on a real vulnerability and ran the second scanner against a lockfile it does not understand. Now detects
packageManagerthen lockfile and runs exactly one,bunincluded.Also
03's meta template usedfavicon.svgforapple-touch-iconandOrganization.logowhile01and10say with sources that both must be raster.- "Commit logically" now needs its own approval, alongside deploy, cache purge, sitemap submit and DNS changes — applying a change is not publishing it.
- Search Console defaults to the
webmasters.readonlyscope, and says plainly that it is a procedure rather than shipped client code. - The checks that follow URLs out of fetched content (
<loc>,og:image) now say what that means when the origin is not yours.
- C1 passed a direct 404. v0.2.0 added the
- v0.2.0Open on GitHub
Content corrections found by a full re-audit on 2026-08-28, plus the repository's first CI gate.
Fixed
- Two action pins in
13-dependency-security.mdcould not resolve. Thegithub/codeql-actionv4 row gave a SHA absent from that repository entirely, so a workflow copying it failed to find the action rather than running a stale one.pnpm/action-setupv6 was pinned to the annotated tag object instead of its commit. Both came out of the resolution command the file itself recommended, which returns.object.shawithout dereferencing annotated tags. The file now gives the one-step form and explains the trap. 06-agent-ready.mdhad the AIPREF status backwards. It describeddraft-ietf-aipref-attachas expired and told the reader to wait for it to revive. It revived as-05on 2026-08-19 and runs to 2027-02-20;vocabmoved to-07. Corrected in all three places it appeared. Nothing is known to parseContent-Usageyet, so it stays an intent-only signal.
Changed
.mcp.jsonpins[email protected]; it previously rannpx -y geodaddy-mcp, so every session executed whatever the registry served aslatest.- Versions refreshed against the registries on 2026-08-28: satori
0.29.0→0.33.4,codeql-action→v4.37.9, TruffleHog →v3.97.1, Syft →v1.51.1, pnpm →11.24.0. The satori jump spans four minor releases whose notes have not been read, so the CSS-support claims below it are marked not re-verified rather than carried forward silently.
Added
- CI that validates the manifest and checks the capability index against
references/in both directions — a row pointing at nothing and a reference nothing routes to are both breakage that manifest validation cannot see. - Dependabot for the pinned action SHAs. This plugin recommends the practice; it now follows it.
- Two action pins in