{"server":"dev.lekta/lekta","count":1,"changes":[{"tool":"lekta_audit","kind":"changed","observed_at":"2026-10-06T05:50:11.090Z","fields":["description"],"description_before":"Audits ONE live page for AEO (Answer Engine Optimization), also called GEO (Generative Engine Optimization): whether ChatGPT, Claude, Perplexity, Google AI Overviews and Bing can reach, read, quote and cite it. Fetches the page the way those engines do — a plain HTTP GET as LektaBot, then a headless-Chromium render pass — and grades it A+ to F across four weighted layers: Access 25% (robots.txt permission for 36 published AI crawler tokens: GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Googlebot, bingbot, CCBot and more), Indexability 25% (noindex / nosnippet / canonical controls, and how much main content survives with JavaScript off), Answerability 30% (concrete data density, external evidence, semantic section structure, hedging), Recency 20% (a machine-readable and visible last-updated date). Returns Markdown under fixed headings: \"## Verdict\" (grade, score, per-layer scores, and the URL actually measured after redirects), \"## Top issues\" (failing and warned checks ranked by points lost, tagged critical/serious/moderate/minor, with evidence), \"## Fixes\" (the full remediation text for each). Unmeasured layers cap the grade at B and say so. USE THIS for \"run an AEO audit\", \"run a GEO audit\", \"why is my page not cited in AI answers\", \"will ChatGPT / Claude / Perplexity quote this page\", \"check my robots.txt for AI crawlers\" — and again after every deploy to re-measure. DO NOT use it when code will parse the result (lekta_report is the same run as JSON), when an audit already exists and you only want the ranked work list (lekta_fix_plan, which never fetches), or to compare two runs (lekta_diff). It scores one page, not a site: no crawling, no sitemap expansion. COST AND BEHAVIOUR: read-only — the audited site is never modified. It READS AND GRADES robots.txt rather than obeying it as a fetch gate: the audit runs even where LektaBot is disallowed, and the report flags that. A blocking call — a live fetch plus a render pass, cut off at a 75 s hard limit. NOT idempotent: a URL not audited in the last 15 minutes starts a fresh run and spends one slot of the daily MCP quota (free plan default 10 fresh audits per UTC day across 1 hostname; every result prints the count used and the host slot in use), while a repeat inside that window replays the cached measurement for free. An unreachable, blocked or HTTP-error target still returns a report, graded U for \"unknown\" — never F. Only these return an error instead of a grade: a timeout or a server-side engine failure, an exhausted daily quota or host slot, 2 audits already in flight for this account, or the per-target ceiling of 1 audit per minute and 5 per hour.","description_after":"Audits ONE live page for AEO (Answer Engine Optimization), also called GEO (Generative Engine Optimization): whether ChatGPT, Claude, Perplexity, Google AI Overviews and Bing can reach it, read it and lift answers from it. Fetches the page the way those engines do — a plain HTTP GET as LektaBot, then a headless-Chromium render pass — and grades it A+ to F across four weighted layers: Access 25% (robots.txt permission for 38 published AI crawler tokens, counting vendor user agents and robots.txt control tokens alike: GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Googlebot, bingbot, CCBot and more), Indexability 25% (noindex / nosnippet / canonical controls, and how much main content survives with JavaScript off), Answerability 30% (concrete data density, external evidence, semantic section structure, hedging), Recency 20% (a machine-readable and visible last-updated date). Returns Markdown under fixed headings: \"## Verdict\" (grade, score, per-layer scores, and the URL actually measured after redirects), \"## Top issues\" (failing and warned checks ranked by points lost, tagged critical/serious/moderate/minor, with evidence), \"## Fixes\" (the full remediation text for each). Unmeasured layers cap the grade at B and say so. USE THIS for \"run an AEO audit\", \"run a GEO audit\", \"why is my page not cited in AI answers\", \"can ChatGPT / Claude / Perplexity fetch and read this page\", \"check my robots.txt for AI crawlers\" — and again after every deploy to re-measure. The grade measures eligibility preconditions (access, indexability, extractable answers, dates); it does not observe or predict whether any engine cites the page. DO NOT use it when code will parse the result (lekta_report is the same run as JSON), when an audit already exists and you only want the ranked work list (lekta_fix_plan, which never fetches), or to compare two runs (lekta_diff). It scores one page, not a site: no crawling, no sitemap expansion. COST AND BEHAVIOUR: read-only — the audited site is never modified. It READS AND GRADES robots.txt rather than obeying it as a fetch gate: the audit runs even where LektaBot is disallowed, and the report flags that. A blocking call — a live fetch plus a render pass, cut off at a 75 s hard limit. NOT idempotent: a URL not audited in the last 15 minutes starts a fresh run and spends one slot of the daily MCP quota (free plan default 10 fresh audits per UTC day across 1 hostname; every result prints the count used and the host slot in use), while a repeat inside that window replays the cached measurement for free. An unreachable, blocked or HTTP-error target still returns a report, graded U for \"unknown\" — never F. Only these return an error instead of a grade: a timeout or a server-side engine failure, an exhausted daily quota or host slot, 2 audits already in flight for this account, or the per-target ceiling of 1 audit per minute and 5 per hour.","description_similarity":0.923,"before_hash":"519205a2f8361734b3013de54ad8e07b","after_hash":"18e06798232a8783b7b669f361f4fec3"}],"next_before":null,"next_actions":[]}