v1.0.0 · 2026-10-18
First release: reads what the owner of a site on Cloudflare Workers (usually Next.js through OpenNext) pasted - Search Console numbers, an audit of status codes, `open-next.config.ts`, `wrangler.jsonc`, data-fetch code, robots, sitemap and metadata code, `wrangler tail` lines and the owner's plan - and reports what stops Google from crawling, indexing or showing the pages, in a fixed diagnosis order (Page indexing first, then Performance, then what is missing). Each finding has a fixed code, the evidence, a fix and a check that can fail, then one verdict (crawler sees errors, fix before relying on it, wrong stage, no site-side problem). Group 1, the crawler gets errors: the site's own API rate-limiting the site's own renders, a 5xx or 429 burst whose cause is not pasted. Group 2, the site tells Google the wrong thing, renders cold or never refreshes: ISR without a queue, a queue without its self reference binding, a dynamic route that never becomes ISR, a cold cache after each deploy, thin twin pages, pages with no internal link, noindex behind a Disallow, www blocked by a robots guard, a title suffix that pushes the useful words out, an untrue lastmod, a redirect over a cached 404, no max-image-preview, a short sitemap address in a Domain property. Group 3, the reading or the plan is at the wrong stage: `site:` used as a count, ranking treated as discovery, the example list of a report taken as its size, young pages treated as a defect, an audit taken while the pages answered errors, a check from one request without a cache-buster. Facts: Google Search Central and Search Console help, Cloudflare, Next.js and OpenNext documentation and the OpenNext source 1.20.2, all read on 18 October 2026, and our own measurements; contested or unverified points are marked as such and never turned into rules.
Model test, 18 October 2026, one run per model and case, read by hand: the first set (35 cases, 30 with a fault and 5 sound, the telling evidence pasted) - Sonnet 35/35 with the skill and 35/35 without, Haiku 35/35 and 32/35; the hard set (11 cases from the owner's real starting point, written separately before any run, scored alike on both sides: the main cause first and right) - Sonnet 11/11 and 9/11, Haiku 11/11 and 8/11. By the skill's own format checks: first set Sonnet 34/35 (a misspelled code corrected in place), Haiku 34/35 (a coded line for a check with no finding); hard set 9/11 each (an added ranking line on the young site, Haiku also on thin twins; one Sonnet line without `Check:`). The mechanical score of the hard set erred both ways; its four known faults are listed in `test/results-2026-10-18-hard-compare.md` and were left as they were after the run. Records: `test/results-2026-10-18*.md`, `notes/hard-set-2026-10-18.md`.
Price $0.05 (50000 micro-USDC), the owner's choice of 18 October 2026: the table gives $0.03 for a Sonnet gain of 2, and our rule puts a skill that helps Sonnet on content at $0.05 or more. Not marked Recommended (the gain is 2 of 11).
Known gaps, reported by the author of the hard set and left for 1.1 with a new set of cases (fixing them now against these cases would tune the skill to its test): the headers that tell ISR-NO-QUEUE from DYNAMIC-ROUTE-NOT-ISR; the owner-visible sign of a missing self reference (STALE that never returns to HIT until a deploy); OWN-API-RATE-LIMITED could name the branch when the paste says the API sits in another zone, and does not mention a zone WAF rate-limiting rule; YOUNG-PAGES-WAIT does not cover Discovered - currently not indexed; CHECK-WITHOUT-BUSTER gives no robots.txt cache time; no code for a plan that works on Crawled - currently not indexed while Crawl stats show live 5xx. None of them is a false statement in the skill.
Changed after the first run of 18 October 2026, before release: `ISR-NO-QUEUE` and `DO-QUEUE-NO-SELF-REFERENCE` moved from group 1 to group 2. Sonnet gave `fix before relying on it` in all three cases with these codes, against the skill's group 1 verdict; the skill's own facts side with Sonnet (OpenNext 1.20.2: the failed send to the queue is caught and logged, so the crawler gets the stale page with 200, not an error). The three cases now expect `fix before relying on it`; they and the five sound cases were run again on both models with the corrected text, the other cases keep their first-run answers.
Checks widened after reading every failure (for both sides, in `test/make-cases.mjs`): the own-API concept accepts "shares one rate-limit bucket" and "the site's own calls … the public limiter"; the burst concept accepts "rerun the audit and capture the body of a 503", and in `audit-during-errors` (whose input does not say one-by-one requests pass) also "wrangler tail while requesting one failing URL"; the one-by-one concept accepts "do not contradict" and the hyphenated "one-at-a-time"; the lastmod concept accepts the real edit field (`edited_on`, `updatedAt`) and "the real updated or published date"; the `site:` concept accepts "rough"; the internal-link concept accepts "render … as real links" and "a crawlable anchor". No check was narrowed.