diff --git a/docs/wiki/Audit-Skill.md b/docs/wiki/Audit-Skill.md index 000da8d..c6fe618 100644 --- a/docs/wiki/Audit-Skill.md +++ b/docs/wiki/Audit-Skill.md @@ -1,10 +1,10 @@ # Audit Skill -The audit skill scores a site across five content layers — SEO, AEO, GEO, perf and -security — plus a site-level cross-URL pass, an indexability-contradictions pass, and -sitemap hygiene, returning findings that carry an observed value, an expected value, a -fix and a `fixTier`. It never edits the site; it only diagnoses, then hands the list to a -human, CI job, or `omnirank fix`. +The audit skill scores a site across **five** content layers — SEO, AEO, GEO, perf and +security — plus a site-level cross-URL pass, an indexability-contradictions pass, and one +sitemap-hygiene check, returning findings that carry an observed value, an expected +value, a fix and a `fixTier`. It never edits the site; it only diagnoses, then hands the +list to a human, CI job, or `omnirank fix`. Everything on this page is verified against `scripts/py/omnirank/audit.py`, `scripts/py/omnirank/gates/`, `scripts/py/omnirank/report.py`, and `skills/audit/`. @@ -19,7 +19,7 @@ phrases and what will *not* trigger it: [[Claude-Code-Setup#what-should-i-say-to ## CLI reference -Verbatim `--help` output, unchanged since v0.3.0: +Verbatim `--help` output from v0.4.0: ``` $ python3 -m omnirank.cli audit --help @@ -64,42 +64,42 @@ Two behaviours worth being precise about: - **Passing `--fail-on` with zero gate names** explicitly overrides the config to an empty gate list, so the run always exits `0` regardless of what `audit.failOn` says. -**Console output as of v0.2.1** groups findings by `id`, shows a count, the shared -`expected`/`fix` text, and up to three example URLs — every group is shown, nothing is -silently truncated. `--detail` keeps the historical ungrouped, 25-finding-capped view. The -JSON report is unaffected by either flag: it always holds every finding individually. +**Console output** groups findings by `id`, shows a count, the shared `expected`/`fix` +text, and up to three example URLs — every group is shown, nothing is silently truncated. +`--detail` keeps the historical ungrouped, 25-finding-capped view. The JSON report is +unaffected by either flag: it always holds every finding individually. ## What are the five layers? | Layer | Audience | What it wants | |---|---|---| -| SEO | Googlebot, Bingbot | Crawlable, canonical, correctly sized metadata, valid structured data, no self-contradictions between what the site submits and what it forbids | +| SEO | Googlebot, Bingbot | Crawlable, canonical, correctly sized metadata, valid structured data, and no self-contradictions between what the site submits and what it forbids | | AEO | AI Overviews, Copilot, voice assistants | A short, liftable, factual answer near the top of the page, sized for the page's script | | GEO | ChatGPT, Claude, Perplexity, Gemini | Machine-ingestible ground truth (`llms.txt`, `facts.json`) plus explicit permission to cite | | perf | Every crawler and user agent | Fast full response time, reasonable HTML weight, compression, and no excess render-blocking `
` scripts — derived from one HTTP response, no browser involved | -| security | Browsers rendering the page | No mixed content and an http→https redirect; response headers reported as inventory, never graded (v0.4.0) | +| security | Browsers rendering the page | No mixed content and an http→https redirect (the two that break crawling/rendering); response headers reported as inventory, never graded — **new in v0.4.0**, see [[Security-Layer]] | -Crawl hygiene, the site-level cross-URL pass, and the indexability-contradictions pass all -carry `layer: "seo"` in the report — there is no separate `"hygiene"`, `"site"` or -`"contradictions"` value. `report.py` defines `Layer = Literal["seo", "aeo", "geo", -"offsite", "smm", "perf", "security"]`. `perf` has been a real, populated layer since -0.2.0 — every audited page runs `perf.run(page)`. `security` is new in v0.4.0 and -populated the same way (`security.run_page(page)` per page, plus one site-level -`http://` redirect probe). `offsite` and `smm` remain reserved for roadmap skills and are -unused by any gate today. +Crawl hygiene, the site-level cross-URL pass, and the indexability-contradictions pass +([[Contradictions]]) all carry `layer: "seo"` in the report — there is no separate +`"hygiene"`, `"site"` or `"contradictions"` value. `report.py` defines `Layer = +Literal["seo", "aeo", "geo", "offsite", "smm", "perf", "security"]`. `perf` has been a +real, populated layer since v0.2.0. `security` is new in v0.4.0 and is populated the same +way (`security.run_page(page)` per page, plus one site-level `http://` redirect probe). +`offsite` and `smm` remain reserved for roadmap skills and are unused by any gate today. As of 0.2.0, `audit_site()` keeps every fetched page's HTML alive as a `PageData` record instead of discarding it after the per-page gates run — that is what makes the site-level -pass below possible. +and contradiction passes below possible. ## Every gate, by layer Every finding carries a `gate` (what `--fail-on` matches against), an `id` (a stable, dotted identifier), and a `fixTier` (`mechanical`/`templated`/`drafted`/`advisory`/ -`infrastructure`, described in [[Fix-Tiers-and-Applicability]]). For the complete, -registry-generated table of all 67 ids see [[Finding-Reference]]. 42 distinct gate names -exist in `audit.failOn`'s schema enum; only 21 of them are error-capable and can actually -gate a build — see [[CI-Recipes#which-gates-can-actually-fail-a-build-with---fail-on]]. +`infrastructure`, described in [[Fix-Tiers-and-Applicability]]). 42 gate names exist in +`audit.failOn`'s schema enum (up from 28 pre-v0.4.0); 21 of them are error-capable and can +actually trip `--fail-on`, 21 cannot — see [[CI-Recipes#which-gates-can-actually-fail-a-build-with---fail-on]] +for the full breakdown. For the complete, registry-generated table of all 67 ids see +[[Finding-Reference]]. ### SEO gates @@ -113,8 +113,9 @@ gate a build — see [[CI-Recipes#which-gates-can-actually-fail-a-build-with---f | `hreflang` | If any `hreflang` alternates exist, one is `x-default` | warning | Add `` | | `image-dims` | Every `