Every diagnostic Shruwd runs, grouped by family, with what triggers each one and what it asks you to do.
Every diagnostic Shruwd runs. For how findings behave — states, confidence, rechecks — see How findings work.
Reading an entry
Each rule carries a confidence and a severity, and both change how you should treat it.
| Confidence | |
|---|---|
observed | A first-party fact, from your own logs or a live fetch |
inferred | Not directly observed, but every link in the chain is in the evidence |
heuristic | A correlation against the pages being cited. A lead, not a fact |
Which findings come first
Families are not equal, and one can make another pointless.
An open access finding on a URL hides the structure and citation findings for that same URL. Recommending schema markup on a page that returns 403 to an AI crawler wastes your afternoon — fix the access problem and the rest reappear, re-evaluated.
Findings are also capped at five new per brand per week. A list of forty gets nothing done.
Where each family applies
Prompt intent decides which diagnostics run.
| Family | informational | comparison | commercial | navigational | problem |
|---|---|---|---|---|---|
| Access | ✓ | ✓ | ✓ | ✓ | ✓ |
| Citation | ✓ | ✓ | ✓ | — | ✓ |
| Structure | ✓ | ✓ | ✓ | — | ✓ |
| Coverage | ✓ | ✓ | ✓ | — | ✓ |
Answers that cite nothing
An engine can answer without reading any page. ChatGPT sometimes does, mostly on how-to and problem questions, answering from what the model already knows. A change to your pages can only reach the answers that read pages, so citation and coverage findings count, per engine, how many answers cited no source — and say so when most did.
Access
Whether AI crawlers can reach your pages at all. The highest-confidence family — the inputs are your own logs and live fetches, with no inference. Checked every day, on every plan.
robots.txt blocks an AI crawler
ACCESS_ROBOTS_BLOCK · observed · critical
Fires when your robots.txt disallows OAI-SearchBot, ChatGPT-User,
PerplexityBot or Google-Extended for a page that matters — one in your sitemap, one
with search impressions, or one already being cited.
What to do — the finding shows the offending directive with its line number and an exact replacement block as a diff.
Resolves when the directive is gone. Shruwd rereads robots.txt daily, and within minutes once you mark the fix applied.
Google-Extended affects Gemini grounding and AI training — not AI Overviews. These
get conflated constantly, and the right fix differs.
The server refuses a verified AI crawler
ACCESS_4XX_5XX_TO_AI_UA · observed · critical
The most valuable rule in the catalogue, and the one that needs crawler logs.
Fires when a verified AI crawler was refused (4xx or 5xx) more often than served on a page, on at least three separate days in the last 30, while a normal browser gets a 200 for the same URL. An occasional error does not count.
What to do — this is almost always bot protection nobody remembers enabling: Cloudflare Bot Fight Mode or AI Crawl Control, a WAF managed rule, rate limiting, a security plugin, or user-agent blocking at your origin. The finding identifies the likely blocker from the response signature and names the setting to change.
Which of these your logs can show depends on your log path. Only Logpush records refusals made by Cloudflare itself: the forwarder Worker runs after Cloudflare's security rules, and your server after that. So with the Worker, look for Cloudflare's own refusals in Cloudflare (Security → Analytics). A refusal Shruwd does see was made behind Cloudflare, and the finding tells you so.
Resolves when, after you mark the fix applied, that crawler is served on that path on a day it visits.
Content only renders with JavaScript
ACCESS_JS_ONLY_CONTENT · inferred · high
Fires when the raw HTML has under 500 characters of visible text, the page has search impressions, and the markup contains an empty root mount node.
What to do — server-render, statically generate or prerender that route. AI crawlers largely do not execute JavaScript, so content that only exists after hydration does not exist for them.
Resolves when the raw HTML carries more than 2,000 characters of visible text.
A page with demand is never crawled
ACCESS_NEVER_CRAWLED · observed · medium
Fires when a URL is in your sitemap, has at least 100 search impressions in 30 days, and has had zero verified AI-bot hits in that time, while AI crawlers did fetch other pages in the same directory.
Needs 30 days of uninterrupted crawler logs and a Search Console connection. It only judges pages your logs can see: a directory with no fetches at all may just be outside the paths you forward, and a top-level page has no directory to tell. Sign-in, sign-up, account and checkout pages are skipped.
What to do — link to the page from the pages beside it that the crawlers already
fetch (the finding names them), with a plain link in the HTML your server sends, and give
its sitemap entry an accurate lastmod.
Citation
Where answers get their sources. The highest-value family after access.
A third-party page gatekeeps the answer
CITE_THIRD_PARTY_GATEKEEPER · inferred · critical
The finding that answers "why does ChatGPT recommend them and not us?"
Fires when across at least three prompts sharing a tag and a question type (buying, comparison, how-to…), one third-party domain appears in 40% or more of the answers that cite a source — at least ten of them — you are absent from the page being cited, and at least one competitor is on it. Absence is read from the page's own content: a link to one of the site's other pages, or a mention in its navigation or footer, is not a listing.
What to do — getting onto that specific source is usually the highest-leverage action available to you. The finding names the exact URLs, which competitors appear on them and how they are described, and the route in for that kind of source: a vendor listing submission, an editorial contact, community participation.
Third-party inclusion propagates slowly, and a listing can take longer than the 14-day recheck to reach the answers.
Some sources cannot be read by a server, Reddit threads among them. Shruwd never assumes you are absent from a page it could not read, so a source like that produces no finding.
Your page is the source, but you are not named
CITE_UNNAMED_SOURCE · observed · high
Fires when one of your pages is cited in at least three answers to a prompt that do not name you, and in at least half of all the answers citing it — on a prompt where you are named in fewer than half the answers, across at least ten.
The engines already read the page to answer the question. They take its advice and leave out who wrote it.
What to do — the fix is on that page, not a new one. The finding points at the passage closest to the question, says whether it names you and where the page does name you instead, and lists the companies the answers named instead — and where your page names those companies itself, since an answer can take their names from it as easily as your advice. Say what your product does about the question, by name, in that passage — a plain statement of the feature, not a pitch.
Does not fire on definitional or explanatory questions ("what is…", "what is the difference between…", "how do AI Overviews choose…"), where an answer naming a vendor would be a worse answer, or once the latest three answers citing the page all name you: the page is doing its job now, whatever older answers said.
The wrong page gets cited
CITE_WRONG_PAGE · observed · medium
Fires when the engines mostly reach for the wrong kind of page of yours for a question — a how-to post cited for a buying question more often than any product, pricing or comparison page — in at least three answers. A comparison or shortlist article counts as the right kind of page for a buying question, wherever it lives on your site.
What to do — you are cited, so this is a smaller problem than not being cited. The right page is under-optimised relative to the one being cited: strengthen it against that question, and link to it prominently from the page currently getting the citation.
Needs to know the right page: set one for the question.
A competitor owns this prompt
CITE_COMPETITOR_OWNS_PROMPT · observed · high
Fires when over 30 days a competitor is named in at least half the answers while you are named in 15% or fewer, across at least ten responses, the two rates' intervals do not overlap, and at least one of the competitor's own pages is cited for the prompt. One finding per question: when several competitors are ahead, it is led by the one named most and names the others.
What to do — the finding lists the top-level sections of the competitor pages being cited that your page for the question — the one you set, else the one cited most — has no heading for, page by page. A heading of yours that has all of a section's words covers it. It leaves out headings naming a company you track, an article's introduction, conclusion and chapter titles, taglines that are off the question, and the competitor's own pricing, product and help pages, which describe the competitor rather than the question. Treat it as a reading guide: two pages can cover the same ground under different words. A competitor's homepage is left out too, and so is a page's furniture: related-article blocks, menus, prices, and the entries of a ranked list. With no page of yours for the question, it asks you to set one first and compares once you have. It also lists the lists, review directories and threads the answers read, each with the day it was last cited — for a question a big competitor wins on name alone, getting onto those is usually the quicker way in. On an alternatives, "best" or versus question they come first, because the answers are built from other people's shortlists, and the finding says so when no answer to any of your questions cited your site. The sources change from week to week, so start with the ones cited most recently.
One question keeps one finding when another competitor takes the lead on it.
Rechecked at nine repetitions per prompt, 14 days after you mark the fix applied.
Your page reads as stale
CITE_STALE_SOURCE · inferred · medium
Fires when a cited page of yours has no date signal newer than 18 months, in a category where the competitor pages being cited average under six months.
What to do — refresh the content and the date signals together.
Changing the date without changing the content is not the fix. Models extract facts, and stale facts get superseded whatever the date says.
The answers show a video, and none is yours
CITE_VIDEO_SLOT · observed · medium
Fires when over 30 days, on one engine, at least half the answers to a question cite a video — at least five, of at least ten answers — and none of the answers to that question cites a video on your YouTube channel.
A video slot is a citation only a video can take. Google's AI Overviews often show one, sometimes beside the sources list and not in it.
What to do — publish a video that answers the question directly, titled in its words. The finding lists the videos the answers show now, with their channels, and says when one belongs to a competitor you track.
Needs your channel to tell your videos from the rest: set it on your brand. Without it the finding says it cannot tell, rather than that none is yours.
Structure
How extractable your content is. Every rule here is heuristic — a lead worth testing,
not a fact.
No direct answer near the top
STRUCT_NO_DIRECT_ANSWER · heuristic · high
Fires when for a prompt where a competitor is cited and you are not, your most relevant page has no 40–120 word paragraph in the first 1,200 characters sitting under a heading that matches the question.
What to do — add a heading in the question's own form, and a short direct answer immediately beneath it, before any elaboration. The finding shows the passage from each cited competitor page that does answer it, side by side. A byline, a reading time or a table of contents is not part of an answer, on their pages or on yours.
Needs at least two cited competitor pages that answer the question under a heading on it. If the cited pages don't do it either, it isn't what sets them apart.
Structured data the cited pages have
STRUCT_MISSING_SCHEMA · heuristic · medium
Fires when your page carries no JSON-LD of a type declared by at least half of the sites — at least two — cited beside it for the prompts it targets. Counted in sites, not pages: four pages of one competitor carry one competitor's template.
What to do — the finding generates a JSON-LD block populated from your page's actual
content, not a template with placeholders to fill in. HowTo is only suggested for a page
with numbered steps, and built from those steps. A more specific type counts as its
parent: a page declaring BlogPosting or TechArticle already has Article.
Validate FAQPage and HowTo with the Schema Markup Validator: Google does not show
either as a rich result, so its Rich Results Test will not help with them.
Fewer concrete facts than the cited pages
STRUCT_LOW_FACT_DENSITY · heuristic · medium
Fires when your page's fact density is below 60% of the mean of the cited competitor pages. Density counts numerals, dates, percentages, currency amounts, measurement units and proper nouns per 100 words.
What to do — add specifics of the kinds those pages carry: concrete numbers, dates, named integrations, versions. Models cite pages containing extractable facts. The finding quotes a few of the facts the cited pages have and yours lacks, in their own sentences. A reading time ("9 min read") is not counted as a fact.
Never fires on pages under 300 words — that is a different problem. Pricing pages are not compared with a page that isn't one: prices are most of what they carry.
Coverage
Questions as a whole rather than pages. The lowest in the order: anything sharper about the same question comes first.
Nobody owns this question
COVERAGE_UNCLAIMED · observed · medium
Fires when over 30 days no company you track — you included — is named in 70% or more of the answers to a prompt, across at least ten.
What to do — this is an opening, not a loss. The finding lists the sources the answers draw on, so you can see what kind of page the engines use for the question, and names the page of yours to strengthen (the one you set for the question, else the one cited), or says to publish one: a heading in the question's own words, the answer beneath it, and what your product does about it, by name.
When the answers link to a product you don't track, the finding names it instead of calling the question open — add it as a competitor if it is one.
Does not fire on definitional or explanatory questions (including "what is the difference between…"), when the engine mostly gives no AI answer at all, or when one of your pages is already the source — that is the finding above.
Next steps
- How findings work — confidence, states, acting on one
- Rechecks — proving a fix worked
- Choosing a log path — unlocks two access findings

