seo-technical — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited seo-technical (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Technical SEO decides whether content can be fetched, parsed, indexed, and trusted by Google, Bing, and AI answer engines (ChatGPT, Claude, Perplexity, Gemini). In 2026 the discipline split in two: Googlebot renders JavaScript and tolerates slow pages, AI crawlers do neither. Treat the raw HTML response as the product.
Work in this order: indexation, rendering, speed. A fast page that is not indexed earns nothing. An indexed page whose content only appears after client-side JavaScript runs is invisible to every AI engine except Google's. Every threshold below is labeled either official or measured (with a source URL) or field heuristic from 115+ agency audits.
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed. Vault structure, read-first and write-back protocols: the obsidian-brain skill.
Use it for:
Hand off neighboring problems:
Before any recommendation, confirm both:
Field finding from 115+ agency audits: a large share of audited sites had neither installed, or had them installed with nobody able to access the accounts. Without GSC you cannot see coverage, queries, or manual actions, and every later step degrades into guessing. Set both up first, then add Bing Webmaster Tools: it imports GSC properties in a few clicks and matters in 2026 because Bing's index feeds ChatGPT search (https://yoast.com/chatgpt-search/).
For a fast automated first pass, run the bundled audit script from the seo-geo-audit skill (scripts/seo_audit.py), which checks robots.txt AI bot rules, sitemap, and on-page basics. Use its output to direct the manual work below.
In GSC, open Indexing > Pages and compute the ratio of indexed to submitted pages.
Then act on the gaps:
Measurement artifact (September 2025): Google removed the num=100 results parameter. Many properties saw desktop impressions collapse and average position improve overnight because rank-tracking bots stopped loading 100-result pages. Check clicks before declaring a loss: clicks typically stayed flat. Never present this artifact to a client as a traffic drop (https://searchengineland.com/google-num100-impact-data-462231).
robots.txt:
Sitemap.xml:
Discovery for ultra-fresh topics: when the site publishes time-sensitive news, add a dedicated News sitemap plus an RSS or Atom feed so Google can pick up items within minutes; an RSS feed is also the fastest way to source breaking topics worth covering. This channel only fits genuinely fresh, newsworthy content, not the evergreen archive.
Meta robots versus robots.txt, the distinction behind most "why is this still indexed" tickets:
| Goal | Correct tool | Why |
|---|---|---|
| Keep a page out of the index | meta robots noindex, page stays crawlable | Google must fetch the page to see the noindex |
| Keep crawlers out of infinite or private URL spaces | robots.txt Disallow | Saves crawl budget; does NOT deindex |
| Both on the same URL | Never combine them | Disallow prevents Google from ever seeing the noindex; the URL can stay indexed from external links |
A disallowed page can appear in results as a URL-only listing. If something must disappear, allow the crawl, serve noindex (or 404/410), and use the Removals tool for urgent cases.
Crawl budget (sites above roughly 10,000 URLs):
No AI crawler executes JavaScript. The Vercel and MERJ study of 500M+ crawler fetches found that GPTBot, ClaudeBot, PerplexityBot, and Meta-ExternalAgent sometimes download JavaScript files (11.5 percent of ChatGPT fetches, 23.8 percent of Claude fetches) but execute none of it. Googlebot is the only major crawler that renders (https://vercel.com/blog/the-rise-of-the-ai-crawler and https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/).
Consequence map:
| Engine | Sees client-side rendered content |
|---|---|
| Google search, AI Overviews, AI Mode, Gemini grounding | Yes (Googlebot renders) |
| ChatGPT (search and training) | No |
| Claude (search and training) | No |
| Perplexity | No |
| Bing and Copilot | Rendering is deferred and inconsistent; treat as no |
The test costs one minute. Fetch the raw HTML and search for a sentence that should be on the page:
curl -sL https://example.com/page/ | grep -c "exact sentence from the page"
Zero matches means AI engines see an empty shell. Cross-check with view-source in a browser (not DevTools Elements, which shows the rendered DOM) and with GSC URL Inspection for what Googlebot renders.
Decision rule: any page that should rank or be cited must serve its content in the initial HTML response. SSR or SSG is mandatory; client-side rendering is acceptable only for logged-in app surfaces.
Stack verdicts:
| Stack | Content in raw HTML | Verdict |
|---|---|---|
| WordPress, Shopify, Webflow | Yes | Hold up at volume (field experience, 115+ audits) |
| Next.js, Nuxt, Astro, SvelteKit with SSR/SSG enabled | Yes | Fine, but verify template by template: hybrid apps regress silently |
| React, Vue, Angular client-side SPA | No | Invisible to every AI engine; prerender or rebuild |
| Framer, Lovable, and similar recent builders | Mixed | Field experience: unstable for SEO at scale (rendering, redirects, sitemap control); audit before committing a content operation to them |
Inside a stable CMS, the theme still decides the technical floor. Pick a lean, SEO-oriented e-commerce theme (clean markup, no JavaScript bloat, content in raw HTML, fast Core Web Vitals out of the box) over a heavy multi-purpose one: on Shopify, for example, the gap between a performance-focused theme and a bloated one shows up directly in LCP. Choose the domain on the same logic: for a French local business, a .fr signals geography to Google and tends to earn a better local click-through than a .com (field heuristic from 115+ agency audits). Settle the domain before launch, since changing it later means a full migration (Step 7).
Judge mobile first: mobile carries 80 to 90 percent of traffic on typical lead-gen and e-commerce sites (field range). Measure with the free PageSpeed Insights web interface at https://pagespeed.web.dev: no API key, no account, and it returns both field data (CrUX, what real users experienced over 28 days) and lab data. Field data wins arguments; lab data locates causes.
| Metric | Good (at p75) | Notes |
|---|---|---|
| LCP | Under 2.5 s | Largest Contentful Paint |
| INP | Under 200 ms | Replaced FID in March 2024; roughly 43 percent of sites failed INP at the switch, making it the most commonly failed vital (https://web.dev/articles/inp) |
| CLS | Under 0.1 | Layout stability |
| PageSpeed score | 75+ desktop acceptable, aim higher | Field heuristic; mobile scores run lower, judge the trend |
Keep perspective: Core Web Vitals act as a tiebreaker, not a dominant ranking factor. Do not spend weeks chasing a score of 100 on a site with an indexation or rendering problem; sequence speed after Steps 1 to 3.
High-yield fixes, ordered by how often audits surface them:
Canonicals (the e-commerce deduplication tool):
hreflang (international versions):
Migrations destroy more rankings than algorithm updates do (field observation across 115+ audits). Operating rule: it is easy to break rankings and very hard to build them.
Fast verifications during any conversation, before reaching for tools. Each answers one question from the steps above:
curl -sIL https://example.com/page/ | grep -iE "^HTTP|^location"
curl -sIL https://example.com/page/ | grep -i "x-robots-tag" curl -sL https://example.com/page/ | grep -io '<meta name="robots"[^>]*>'
curl -sL https://example.com/page/ | grep -io '<link rel="canonical"[^>]*>'
curl -s https://example.com/robots.txt
curl -sL https://example.com/page/ | grep -c "a sentence from the page"
For anything beyond spot checks, run the bundled audit script from the seo-geo-audit skill (scripts/seo_audit.py).
| Check | Target | Basis |
|---|---|---|
| GSC, GA4, Bing Webmaster Tools | Installed, verified, accessible | Field rule; the most common audit failure |
| Indexed to submitted ratio | 75%+ healthy; below 50% investigate first | Field heuristic from 115+ agency audits |
| Request Indexing quota | Reserve the ~10-12 daily inspections for money pages | Field rule |
| 404s with traffic or links | 301 to closest equivalent, never blanket to home | Official guidance plus field rule |
| Sitemap | Declared in robots.txt, segmented by type, honest lastmod, no Google ping (dead since 2023) | Official |
| IndexNow | Implemented (Bing is a gateway to ChatGPT search) | Sourced (yoast.com/chatgpt-search/) |
| noindex plus Disallow on one URL | Never | Official crawler logic |
| LCP, INP, CLS | Under 2.5 s, under 200 ms, under 0.1 at p75 | Official (web.dev) |
| PageSpeed score | 75+ desktop floor; judge mobile first (80-90% of traffic) | Field heuristic |
| Images | 200 KB max, WebP/AVIF, width and height set, no lazy-load above the fold | Field heuristic plus official CLS guidance |
| Text-to-HTML ratio | 10% or more | Field heuristic (thin-page signal) |
| DOM size | Under ~1,500 nodes | Official (Lighthouse) |
| Content present in raw HTML | 100% of content that must rank or be cited | Measured (Vercel/MERJ study) |
| hreflang | Reciprocal pairs, self-reference, x-default | Official |
| HTTPS | Sitewide, single 301 hop | Official |
| Migration redirects | 100% of exported URLs mapped | Field rule |
What the data says:
Recommendation: generating one takes 10 minutes and does not hurt, so create it when asked or when it costs nothing. Never present it, prioritize it, or bill it as a visibility lever, and never let it displace work on rendering, indexation, or content. A vendor selling llms.txt as a GEO strategy is telling you something about the vendor.
This skill is the canonical owner of AI crawler knowledge for the whole skill set. The full table (user agents, operators, robots.txt compliance, IP verification URLs) and paste-ready robots.txt blocks live in references/ai-crawlers.md. Read that file whenever a task touches robots.txt or bot access. Summary:
Three bot roles, three different blocking costs:
| Role | Examples | If you block it |
|---|---|---|
| Training crawlers | GPTBot, ClaudeBot, CCBot, Google-Extended, Applebot-Extended, Meta-ExternalAgent | Brand absent from future model weights; no effect on today's citations |
| Search-index crawlers | OAI-SearchBot, Claude-SearchBot, PerplexityBot, Bingbot, Googlebot | You disappear from that engine's live answers and citations |
| User-fetch agents | ChatGPT-User, Perplexity-User, Claude-User, MistralAI-User | Mostly cannot be blocked via robots.txt; they act on a user's explicit request |
Default recommendation for brands, SaaS, lead-gen, e-commerce: allow everything, including training bots. Presence in training data means the model itself knows the brand and can recommend it even when the answer runs without web search. Defensive configuration for publishers whose content is the product: keep the search surfaces (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Bingbot, Googlebot), block training (GPTBot, ClaudeBot, CCBot, Google-Extended). Both configurations are ready to paste in references/ai-crawlers.md.
The Google-Extended trap: Google-Extended is a control token, not a crawler. Blocking it only opts the site out of Gemini training and grounding. It does NOT remove the site from AI Overviews or AI Mode, which are fed by regular Googlebot crawling. The only opt-outs from AI Overviews (nosnippet, max-snippet, noindex) also reduce classic search snippets. Decide with eyes open (https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers).
Two facts from earlier sections weigh double for AI bots: they read raw HTML only (Step 3), and Bing's index reaches ChatGPT (Step 2, IndexNow). Anti-spoofing: user-agent strings are trivially forged, so verify IPs against the published ranges listed in references/ai-crawlers.md before whitelisting anything or trusting log analyses.
For what to write so engines quote it, use the geo-visibility skill. For measuring citations and AI referral traffic, use the geo-tracking skill.
Deliver a prioritized action plan, never a data dump. Default structure:
Per finding: evidence (URL plus observed value), why it matters, exact fix, effort (S/M/L)
Same fields
Same fields
One line per check that passed, so the absence of findings is itself evidence
Severity rubric:
| Severity | Definition | Examples |
|---|---|---|
| Critical | Content cannot be crawled, indexed, or seen by AI engines | Disallow: /, client-side-only content, noindex on money pages, active hack |
| Important | Indexed but leaking performance | Failed INP, missing 301s, hreflang conflicts, 3 MB images |
| Maintenance | Works but fragile or wasteful | Unsegmented sitemap, dishonest lastmod, missing IndexNow |
Every claim carries its evidence (the URL tested and the raw value observed), and every number is labeled official, measured, or field heuristic.
| Mistake | Consequence | Do instead |
|---|---|---|
| Reading the September 2025 GSC impression drop as a traffic loss | False alarm, wasted remediation | Check clicks; explain the num=100 artifact |
| Blocking Google-Extended to escape AI Overviews | No effect; AI Overviews use Googlebot | nosnippet, max-snippet, or noindex, accepting the search cost |
| noindex plus robots.txt Disallow on the same URL | Page stays indexed; Google never sees the noindex | Allow the crawl, serve noindex, drop the Disallow |
| Weeks of Core Web Vitals work on an unindexed site | Polishing pages nobody is shown | Sequence: indexation, rendering, then speed |
| Lazy-loading the LCP image | LCP degrades by design | Eager-load it with fetchpriority="high" |
| Selling llms.txt as a deliverable | Credibility debt with informed clients | 10-minute add-on, framed honestly |
| Migrating with menu-only redirects | Long-tail URLs 404, history burned | 301 100% of the GSC export |
| Deleting ugly pages that rank | Rankings traded for aesthetics | Hide from the menu, keep the URL live |
| Trusting user-agent strings in logs | Spoofed bots pollute analyses and whitelists | Verify IPs (references/ai-crawlers.md) |
| lastmod bumped sitewide on every deploy | Google learns to ignore the signal | Update lastmod only on real content changes |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.