v1.0.0 · 2026-10-08
First release: decides for every URL variant whether it is the page to index (self-canonical), keeps a canonical to another address (canonical-to), redirects (permanent or, when the move is temporary, 302/307 with the reason), leaves the results (noindex, kept crawlable), is gone (404/410) or cannot be settled from the facts (unknown), answered as JSON in the order the URLs were given. Twelve rules from Google's documentation, four traps measured on live sites.
Facts re-checked on 2026-10-08 by read-only fetches of Google's documentation: consolidate duplicate URLs (page dated 2026-07-10: signal strength order; redirect only when deprecating the duplicate, rel=canonical when duplicates must stay accessible; noindex not recommended for choosing a canonical; self-referencing canonical; https preference and the http-canonical conflict; same-language canonical; no fragments, absolute URLs; mobile alternate), canonicalization troubleshooting (2026-08-21: canonical link element not recommended for syndication, partners block indexing; Google may select a different canonical), block indexing (2025-12-10: noindex must not be blocked by robots.txt; meta tag and X-Robots-Tag are equivalent), redirects (2026-04-14: 301/308 and instant refresh permanent; 302/303/307 temporary, source stays canonical), localized versions (2026-09-21: localized versions are duplicates only while the main content is untranslated), pagination (2025-12-10: do not use the first page as the canonical; each page its own canonical; noindex or robots rule for filter and sort variations), site move with URL changes (2026-08-20: no mass redirect to the home page, soft 404; deleted content answers 404 or 410; keep redirects at least a year).
Owner-measured facts, September 2026, not re-measured in this session: www host blocked by robots.txt hides its 301 ("Indexed, though blocked by robots.txt"); a redirect added over a cached 404 on an ISR site can answer 308 with no Location; Disallow does not remove a listed page; Request indexing on a redirecting URL records a redirect error.
Tests: 24 cases (17 traps, 7 controls), zero-model control green; model runs pending (the orchestrator queues them). Price class B, start $0.03, to be set after the baseline.
Reconciled with the brief in docs/plan-batch3-briefs-21-40.md § 3.36, which arrived after the skill was designed: its four-host control, the ?lang= parameter case and the middleware-matcher fact (www answers its own robots.txt) were added; the enum is this skill's (self-canonical and canonical-to instead of one `canonical` code, plus `gone` and `unknown`), because a check on `action` must not have to read `target` to know what was decided, and because a refusal path is required.