seo
Audits and fixes technical SEO, researches search demand, creates content briefs, and measures SEO/AEO performance. Use when asked to "audit SEO", "fix indexing", "improve AI visibility", "check keyword volume", "write an SEO brief", or "why did organic traffic drop". For Mintlif
Install
npx skills add https://github.com/mblode/agent-skills/tree/main/skills/seo
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install mblode-agent-skills@llmmart
git clone https://github.com/mblode/agent-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole mblode/agent-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
SEO
- IS: one entry point for search visibility: evidence-led audits, implementation, demand research, writer briefs, and performance measurement across search and answer engines.
- IS NOT: writing the article (
ghostwriter), standalone marketing copy (copywriting), visual redesign (ui-design), tenant infrastructure (multi-tenant-architecture), or implementing AFDocs / Is Agentic / Is It Agent Ready scorecards (agent-ready). Fix SEO copy and markup when they are part of the requested implementation.
Route the task
| Request | Load | Deliverable |
|---|---|---|
| Audit a site, diagnose indexing, review a migration | references/audit.md and references/validation-evidence.md |
Prioritized findings with URLs, observed evidence, impact, and correction |
| Fix or implement SEO | Audit references, then applicable implementation references below | Code changes, scoped checks, and served-page evidence for the changed behavior |
| Research demand, choose a target, brief a page | references/research-protocol.md; references/brief-template.md for a brief |
Sourced demand table and decision, or a durable writer brief |
| Explain traffic movement, measure AI visibility, monitor SEO | references/monitoring.md |
Property-scoped diagnosis or configured monitoring with explicit data gaps |
For a combined request, reuse one property and URL inventory across modes. An audit request produces findings; a request to fix them proceeds through implementation and verification within the user's authorized scope. A research-only request does not require crawling every URL or changing code.
Establish the evidence boundary
Identify the exact public host, URL-prefix or domain property, production environment, project/subpath, audience, and business outcome. On a shared domain, filter each project's path separately. In analytics, verify hostname, path, conversion event and attribution window before interpreting a number.
Discover connected tools and existing project bindings first. Prefer the established reporting source, then an available equivalent, then a signed-in browser. No vendor is required. Ownership verification, API consent and a successful scoped query are separate states. An export for a neighboring property is not a fallback.
Use No data with its reason for inaccessible, missing, unsupported or unmeasured metrics; distinguish these from a measured zero. Label historical exports by their actual dates. Do useful public checks while an authenticated metric is unavailable.
Working sequence
For substantial mixed work, track only the applicable steps:
- Confirm property, scope, baseline and intended outcome.
- Inspect live evidence and map affected route patterns or research questions.
- Prioritize blocking defects and high-value opportunities; separate observations from hypotheses.
- Implement authorized corrections or deliver the requested research/brief.
- Recheck the changed behavior, identify the tested environment, and report remaining gaps.
Prioritize crawl/index defects before cosmetic metadata changes. Page titles, headings and content structure follow the page's purpose and reader intent. Descriptive non-brand terms help category discovery; brand-led portfolio and product pages can be appropriate. Neither a fixed title character count nor question-shaped headings are ranking requirements.
Original evidence, useful comparisons and honest product limitations earn their place ahead of manufactured keyword permutations. Research likely reader questions; do not present invented query fan-outs as engine telemetry or create a page for every variation.
References
| File | Read when |
|---|---|
| references/audit.md | Crawling, diagnosing or prioritizing a site audit |
| references/indexing-policy.md | Canonicals, redirects, exclusions, duplicate or programmatic pages |
| references/nextjs-implementation.md | Implementing App Router metadata, sitemaps, rendering, status codes, Markdown twins, or schema; verify APIs against the installed Next.js docs |
| references/answer-engines.md | AI visibility, crawler policies, Markdown alternatives or llms.txt |
| references/internationalisation.md | Language/region variants and hreflang |
| references/technical-hardening.md | CDN access, response headers, errors or preview environments affect discovery |
| references/validation-evidence.md | Verifying findings, a built page or a deployed correction |
| references/research-protocol.md | Keyword/prompt metrics, opportunity selection and question maps |
| references/brief-template.md | Producing a writer brief |
| references/monitoring.md | Search/AI performance, attribution, anomalies or recurring work |
| references/sources.md | A claim depends on current engine behavior, supported reports, or vendor research |
Delivery
Findings go in chat unless a file is requested. Writer briefs go to the requested project destination; retain prior dated briefs when producing a new revision. Keep scratch crawls and exports out of the repository. No em dashes in authored reports or briefs.
Report what changed, why, exact verification evidence, and what remains unmeasured. A successful local build, ready deployment, public URL probe, Google index record and measured conversion are different evidence. Name the strongest state actually verified.
Sending recaps to others, scheduling recurring work, spending on tools and production deployment follow the user's authorization and host rules. Reuse an existing matching monitor rather than creating another owner or schedule.
Gotchas
- A sitemap can parse while listing
/studiothat intentionally returns 404. Check its URLs, not just XML validity. - A canvas gated on mounted state can leave the homepage and category hubs with only navigation in initial HTML. Inspect those hubs as well as deep pages;
use clientalone does not imply missing server-rendered content. lastModified: new Date()or a build timestamp describes generation, not necessarily a significant page update. Use content dates or omit the field.- A canonical tag on each URL does not resolve two copies that both self-canonicalize. Compare content and choose the preferred URL.
- Two consistent JSON-LD scripts are not an error. Verify entity identity, eligible properties and visible supporting content instead of script count.
- DNS verification needs no invented meta token. Confirm scoped data access separately.
- A crawler user-agent probe does not authenticate a bot IP or establish index inclusion. Treat CDN logs and engine inspection as separate evidence.
- Prompt demand, measured citations, mentions, AI impressions and referral sessions are different quantities. Preserve engine, source, match type, scope and window.
- A vendor Search Console connector may under-report. Reconcile property, filters and aggregation against native Search Console before diagnosing a drop.
Maintenance only: evals/evals.json holds behavioral scenarios and routing prompts. It is loaded when changing the skill, not during ordinary SEO work.
Files (agent-skills)
-
evals
-
evals.json 5.8 KB
{ "skill_name": "seo", "evals": [ { "id": 1, "prompt": "Brief an article on Things 3 for Windows. The keyword tool reports volume 900 for Australia, last month. The prompt tool supplies Phrase 400 but no Exact data.", "expected_output": "Produce a sourced writer brief with the missing Exact metric explicit.", "files": [], "assertions": [ "Retains keyword scope and date", "Writes No data for Exact prompt volume", "Does not write the article or claim Phrase is Exact" ] }, { "id": 2, "prompt": "Review SEO monitoring for https://app.example.test. The connected Search Console export is for https://www.example.test and a matching monitor already exists.", "expected_output": "Identify the property mismatch and use the existing monitor when updating.", "files": [], "assertions": [ "Does not report the other property as app traffic", "Does not create a duplicate recurring job", "Does not send a recap to an unapproved channel" ] }, { "id": 3, "prompt": "Verify SEO in a local Next.js checkout. Port 3000 is occupied by another project; the page has two JSON-LD scripts describing distinct consistent entities.", "expected_output": "Use a free owned port and check served metadata without falsely rejecting multiple blocks.", "files": [], "assertions": [ "Does not kill the existing listener", "Verifies the served build identity", "Does not flag block count alone" ] }, { "id": 4, "prompt": "Add Search Console verification. The domain property is already verified through DNS and no meta token was supplied.", "expected_output": "Preserve DNS verification and avoid invented metadata.", "files": [], "assertions": [ "Does not invent a token", "Does not demand meta verification in addition to DNS", "Separates property access from ownership verification" ] }, { "id": 5, "prompt": "Audit these verified served-page facts and give only justified fixes: portfolio homepage H1 Matthew Blode; DNS-verified GSC domain with no meta token; two consistent JSON-LD blocks sharing stable @ids; a category page has only navigation until JS runs; sitemap lists /studio which returns 404; all lastmod values are set to build time; /docs and /docs/introduction show identical content and self-canonicalize; French/German alternates reciprocate without x-default. The owner wants to opt out of GPTBot training but appear in ChatGPT search. Do not use external tools.", "expected_output": "Prioritized evidence-based recommendations with explicit limits and no false-positive requirements.", "files": [], "assertions": [ "Flags JS-dependent hub content, unavailable sitemap URL, synthetic lastmod and duplicate canonicals", "Accepts DNS verification, consistent multiple JSON-LD blocks and reciprocal hreflang without x-default", "Separates GPTBot training from OAI-SearchBot search access" ] }, { "id": 6, "prompt": "Diagnose search performance for https://app.example.test. Only connected GSC export is https://www.example.test. Existing monitor targets app and must be reused. A prior report alleges a 20% drop from 5 clicks to 4, but no completed matching comparison window or conversion data is available. Explain what is unknown and the next measurement steps. Tool capability snapshot: Google generative AI performance provides impressions by page/country/device/date; Bing AI Performance provides citations and cited pages. Vendor prompt volumes are demand estimates. No messages to others are authorized.", "expected_output": "Prioritized evidence-based recommendations with explicit limits and no false-positive requirements.", "files": [], "assertions": [ "Rejects mismatched property data and avoids diagnosing a one-click movement as a material incident", "Separates native AI visibility, prompt demand and conversion outcomes", "Reuses the existing monitor and does not send an unauthorized recap" ] } ], "routing": { "should_trigger": [ "Audit blode.co and fix crawlability issues.", "Why is our category page invisible to AI search?", "Add a sitemap that only lists available pages.", "Investigate a drop in organic clicks.", "Research the search demand for Things 3 on Windows.", "Write a sourced SEO content brief.", "Measure our visibility in AI Overviews and Copilot.", "Consolidate duplicate documentation URLs.", "Check the French and German hreflang tags.", "Fix canonical URLs and JSON-LD in Next.js." ], "near_miss": [ { "prompt": "Write the finished article from this approved brief.", "expected": "ghostwriter" }, { "prompt": "Rewrite this welcome email.", "expected": "ghostwriter" }, { "prompt": "Make this button label clearer.", "expected": "copywriting" }, { "prompt": "Redesign the homepage visual style.", "expected": "ui-design" }, { "prompt": "Set up tenant isolation for custom domains.", "expected": "multi-tenant-architecture" }, { "prompt": "Review keyboard focus in this dialog.", "expected": "ui-verification" }, { "prompt": "Add a new onboarding animation.", "expected": "ui-animation" }, { "prompt": "Create a skill for release management.", "expected": "agent-skills-creator" }, { "prompt": "Write a Diataxis tutorial from this API.", "expected": "docs-writing" }, { "prompt": "Change the pricing page CTA wording.", "expected": "copywriting" } ] } }
-
-
references
-
answer-engines.md 3.6 KB
# Answer Engines AI discovery has several surfaces: search retrieval, model training, user-triggered fetching and browser agents. Identify which one the request concerns before changing access or interpreting a metric. ## Access policy | Purpose | Examples | Decision | |---|---|---| | Search retrieval | OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot | Permit discovery where the owner wants search visibility; verify current vendor rules and published IP ranges | | User-triggered fetching | ChatGPT-User, Claude-User, Perplexity-User | May have different robots behavior; check current vendor documentation rather than assuming search-bot semantics | | Training | GPTBot, ClaudeBot, CCBot | Preserve the owner's training decision independently of search access | | Usage controls | Google-Extended, Applebot-Extended | Consult current vendor scope; these are not separate HTTP crawlers | OpenAI explicitly separates OAI-SearchBot search access from GPTBot training permission. Do not claim that allowing training earns citations or that blocking training removes ChatGPT search visibility. Avoid generalizing one vendor's controls to all engines. Inspect the served robots file and applicable group selection. A specifically named user-agent group can supersede wildcard rules, so carry forward intended private-path exclusions. Check origin, CDN/WAF challenges and published verified-bot rules separately. Spoofing a user-agent string tests a response path; it does not establish real crawler identity or successful bot access from vendor IPs. Google's AI search uses ordinary search foundations. Verify current Search Console inclusion settings and snippet controls against official documentation before advising an opt-out; do not hard-code a claim that one robots directive is the only control forever. ## Content and distribution Make substantive text and links available in the served page. Summaries and question headings are useful when they help readers, not required AI markup. Answer real evaluator questions, show evidence and limitations, and keep public product facts consistent across the site and documentation. Seek useful independent reviews, demonstrations, research and community contributions when they fit the audience. Do not prescribe fabricated mentions or a quota of backlinks or videos. Correlation studies are dated hypotheses with selection criteria, not causal recipes or promised visibility gains. Identify engine, sample and outcome before applying a study to a small project. ## Optional machine-readable surfaces `llms.txt` and Markdown alternatives can help tools that use them. They are not Google ranking requirements or evidence of citations. Add them for a real consumer and keep them aligned with the visible source rather than duplicating a second content system. Mintlify Agent Score, AFDocs, and Is Agentic scorecards belong to `agent-ready`; this file is crawler policy, canonicals, and how Next.js should cache the twin. Prefer an explicit Markdown URL when content negotiation adds unnecessary cache complexity. If negotiation is required, honor Accept quality values, including `q=0`, preserve required Vary fields on both representations, and verify actual CDN behavior in both request orders. Next may replace Vary on framework-generated HTML; do not claim cache safety from a header set only on the Markdown response. Keep canonical and indexing policy intentional for alternate URLs. Measure native AI visibility and referral/conversion outcomes using `monitoring.md`. A successful fetch, an `llms.txt` file or an agent-friendly demo does not establish that an engine cited the site. -
audit.md 3.5 KB
# Audit Start with the actual property and public host. Record the environment, URL sample and coverage so a sitemap crawl is not described as a complete index audit. ## Triage | Area | Inspect | Avoid false positives | |---|---|---| | Discovery and access | robots groups, sitemap indexes and children, response statuses, CDN challenges, internal links | robots permission is not proof of successful crawling; footer links are crawlable, though contextual links improve discovery and meaning | | Index intent | meta/header noindex, canonical destination, duplicate bodies, redirects, missing paths | self-canonicals do not consolidate duplicates; sitemap inclusion is not index inclusion | | Rendering | initial HTML versus rendered DOM, main content, headings, anchors, mobile parity | `use client` can still prerender; a JavaScript-dependent page is not automatically absent from Google | | Metadata and entities | meaningful titles/descriptions, canonical, social images, JSON-LD consistency and eligibility | no fixed title length or one-script rule; valid JSON is not rich-result eligibility | | Experience | field LCP, INP, CLS where available; lab diagnostics and interactions | lab scores cannot substitute for missing field data; low word count alone is not a defect in a functional tool | | Content and demand | reader intent, original evidence, comparison accuracy, overlapping pages, conversion path | do not infer demand from a keyword in a title or invent product facts | | Measurement | native search reports, engine-specific AI reporting, qualified conversions | search impressions, prompt volume, citations and sessions are not interchangeable | ## Crawl scope Follow sitemap indexes recursively, deduplicate URL entries and preserve which sitemap advertised each URL. Fetch listed destinations with bounded concurrency. Sample every route pattern, host/proxy boundary and locale; expand when a defect affects a pattern. Crawl navigational links as needed to find non-sitemap URLs and compare against the intended route inventory for orphans. Record requested and final URL, redirect chain, status, MIME type, robots directives, canonical, title, main content and structured-data parse results. Collect HTML metadata from HTML elements, not SVG `title` elements or escaped React payload strings. Inspect actual anchors for discovery, not only strings in JavaScript. Prioritize systemic exclusions, wrong canonicals and broken destinations before lower-impact duplication. Unknown paths should return genuine missing-page behavior. Check both initial HTML and the rendered page before attributing missing content to rendering. ## Findings contract Each material finding names the affected URL/pattern, observation, evidence, impact, correction and verification method. Mark inference and missing evidence explicitly. Separate existing baseline failures from regressions introduced by the fix. A checked item can be pass, fail, not applicable or not measured, with the reason. Prioritization follows business impact, affected scope, confidence and correction cost. Avoid fake numerical precision, fixed finding quotas and reports padded with irrelevant checks. For a healthy site, say which checks passed and which performance questions remain unanswered. Separate verified defects, optional enhancements and unmeasured state. An owner requesting a crawler policy does not establish the current robots rules; inspect them before claiming they are missing or permissive. Recommend an optional annotation only when the observed site needs its behavior. -
brief-template.md 2.4 KB
# Writer Brief Adapt this shape to the requested page. Keep the decisions and evidence; omit irrelevant sections rather than manufacturing content to fill them. This is a brief, not the article. A target keyword is not a product claim. Identify our product separately from the competitor named in the keyword. If our product is unnamed, use `<product>` rather than inventing a competitor edition or download. A brief for "Things 3 for Windows" can answer the platform question and evaluate our Windows-capable alternative; it must not claim that Things has a Windows version. Mark missing comparison facts for verification while completing the brief. ```markdown # Brief: <reader's topic or decision> Date: <YYYY-MM-DD> ## Why this page Audience and intent: <who and what they need> Decision: <create, update, consolidate or validate; why> Distinct value: <original evidence, useful comparison or experience> Existing coverage: <page to improve or overlap to avoid> Desired outcome: <reader action and measurable product outcome> ## Search decisions Primary query: <intent-led, modifier only if useful> Secondary terms and evaluator questions: <relevant supporting demand> Title and H1 direction: <accurate page purpose; non-brand discovery terms where appropriate> Description: <specific value and accurate limits> Canonical: <preferred URL> <Research evidence table: metric, source, match definition, scope/engine, window, pull date; No data with reason for gaps.> ## Editorial direction North star: <what the reader should understand or decide> Ideas to land: <only the substantive ideas needed> Proof and limitations: <what the writer must demonstrate and qualify> Questions worth answering: <natural questions; note existing coverage> ## Sources and validation Public sources: <URLs the writer can actually cite> Facts to verify: <product behavior, comparisons, dates, research limitations> Success measurement: <outcome, baseline/window or No data, next check> ``` Use public product pages, docs and original research for citeable claims. Do not transfer private feature dumps, roadmap promises or internal wiki links into public copy. No invented statistics, quotes or functionality. Leave narrative order and section breaks to the writer unless the user requests an outline. Save a requested brief at the project/user destination. For a new dated revision, preserve the earlier brief and explain what changed; follow an explicit request to edit an existing document in place. -
indexing-policy.md 2.1 KB
# Indexing Policy For changed route patterns, record index intent, preferred URL and reason. Expand to per-URL rows where exceptions matter. - Index useful public pages that satisfy distinct reader needs. A sitemap should advertise preferred, available URLs intended for search, including eligible non-HTML resources where appropriate. - For equivalent public URLs, select a canonical and align internal links and sitemaps. Redirect an obsolete copy when it no longer needs to remain accessible. Canonicals are signals, not guaranteed engine choices. - Keep locale equivalents self-canonical and connect them with hreflang instead of canonicalizing every language to English. - For previews, private utilities and deliberate exclusions, use appropriate access control and/or crawlable `noindex`. Robots blocking alone does not reliably remove a URL from results. Do not combine conflicting exclusion/consolidation signals as a default duplicate strategy. - Return 404 or 410 for permanently missing content, 503 for temporary unavailability, and a real server redirect for moved content. Do not funnel unrelated deleted pages to the homepage. - Do not list unavailable studio, login or app-shell routes merely because they exist in source. Share the availability decision with the sitemap generator. - `lastmod` reflects significant content, structured-data or link changes. Build/request time is not a substitute; omit an unknown date. Check current sitemap limits before partitioning large inventories. ## Programmatic pages Validate demand, product fit and a distinct useful result before indexing a new pattern. Reuse, merge or improve an existing page when it already serves the intent. Original data, meaningful local differences, worked examples and genuine comparisons can justify separate pages; swapping a location or adjective alone does not. Define the indexability gate and lifecycle for empty results, out-of-stock resources and retired entities. Do not generate fan-out permutations primarily to manipulate search or AI answers. See the current spam policy in `sources.md` when a proposed pattern approaches scaled content abuse. -
internationalisation.md 1.5 KB
# Internationalisation Use hreflang for equivalent language or regional pages, not unrelated content that happens to target different countries. - Use supported language codes with optional region codes and fully qualified URLs. A region by itself is invalid. - Include self-reference and reciprocal links among the variants being declared. Missing reciprocity affects those annotations; it does not necessarily invalidate every correctly reciprocal subset on the site. - Keep translated pages self-canonical unless they truly duplicate another preferred URL. Do not canonicalize all languages to the source-language page. - `x-default` is optional. Its absence alone is neither a defect nor a reason to add it. Recommend it when an actual selector or unmatched-locale destination needs declaring. - HTML, HTTP headers and XML sitemaps are equivalent implementation methods. Prefer one maintainable source; using more than one is allowed, but keep them consistent. - Translate meaningful titles, descriptions, headings, alt text and user-facing schema values. Preserve the identity of shared organizations and people. - Keep locale URLs independently accessible. Avoid mandatory IP/language redirects that prevent a reader or crawler from reaching another language. Validate representative reciprocal pairs and an unmatched-language visit. Record missing annotations and canonical conflicts precisely rather than reporting the whole set as broken. Check Google's current localized-version documentation in `sources.md` for supported codes and exceptions. -
monitoring.md 4.2 KB
# Measurement and Monitoring Bind each metric to the actual property, hostname and project path. Verify native report access, analytics filters and conversion-event meaning before interpreting a trend. ## Separate the measurements | Question | Evidence | Limit | |---|---|---| | Are pages indexed and receiving search traffic? | Native Google/Bing indexing and performance reports | Ownership verification or sitemap submission alone proves neither | | Is the site visible in Google's generative AI features? | Search Console generative AI performance, including available impression/page/country/device/date dimensions | Verify current report access and supported dimensions; do not invent AI-specific clicks or CTR from impression-only data | | Is Bing/Copilot citing it? | Bing Webmaster AI Performance, available citations, cited pages and grounding-query/topic dimensions | Needs Bing Webmaster verification first, otherwise `No data`; availability and sampling vary; citation counts are not ranking positions or referral visits | | Is a tracked prompt producing mentions/citations? | Repeated, documented engine-specific prompt panel or connected visibility tool | Preserve prompts, engine/model, search mode, locale, date, repetitions, sample size and citation URL; a panel is not population-wide demand | | How often do people ask the topic? | Vendor Exact prompt demand metric | Demand is not the site's share of visibility | | Does discovery produce useful outcomes? | Analytics landing sessions, qualified visits, signups, activation or revenue | Preserve attribution definitions and windows; missing/referrer-stripped visits prevent complete AI attribution | | Do the agent-readable surfaces answer? | Scanner scorecards and `agent-ready`'s `check-surfaces.sh` output | Says whether `llms.txt`, markdown twins and headers work, not whether any engine cites them; agent readership itself needs server logs, and without a log drain it is `No data` | Inspect current native capabilities using `sources.md`, not a frozen vendor checklist. Google generative AI reports may expose different dimensions for Search and Discover. Where a connector omits a native report, use an available browser/export or report that gap rather than silently substituting overall search data. ## Diagnose a change Use complete, comparable windows with matching filters, data freshness and aggregation. Check reporting lag, weekdays/seasonality, campaigns, releases, migrations and tracking changes before attributing movement to ranking. Segment by brand/non-brand, page group, country, device and search appearance where supported and relevant. Do not average positions across incompatible populations. Report absolute counts alongside percentage changes. Moving from 5 clicks to 4 is a one-click change, not sufficient evidence of a material incident by itself. Set alert thresholds from baseline volume, normal variance, persistence and business impact; no universal 20% threshold. For sparse data, extend the observation window or report uncertainty rather than inventing significance. Distinguish loss of visibility, lower click-through, fewer sessions and weaker activation. Verify conversion instrumentation before concluding that SEO traffic quality changed. If authentic scope or outcome data is absent, mark it `No data` and name the smallest next check. ## Recurring checks Use an existing matching owner/schedule when recurring work is authorized. A proposed cadence is not a configured monitor. Preserve the configured destination and notification preferences; do not send an unapproved recap elsewhere. - Anomaly checks report new, material changes supported by the baseline, plus actionable access or delivery failures. - Digests summarize completed comparable periods, leading page/query movements, engine-specific AI visibility, conversion outcomes and the next decision. - Deduplicate previously reported incidents. An unchanged refresh does not need another notification. - Repeated authentication failures should be surfaced through the host's supported reauthentication flow rather than retried indefinitely. Keep monitoring reads separate from mutations. Store durable reports and alert state in the mapped project system, not inside the installed skill folder. -
nextjs-implementation.md 6.2 KB
# Next.js Implementation Read the installed version's documentation under `node_modules/next/dist/docs` (possibly at the workspace root) before changing APIs. The checks below name observed failure modes; they are not a permanent version compatibility table. ## Metadata - Set `metadataBase` for the production origin and emit the page's preferred canonical. Verify basePath behavior in a production build, especially generated versus static Open Graph images. - Preserve DNS ownership verification. Use `metadata.verification` only for a supplied token and the selected verification method. - Choose descriptive titles and descriptions for the page purpose. Check truncation and redundancy as presentation concerns, not fixed 50/60/44-character validity gates. Title templates apply to child routes; inspect the resolved title and social title separately. - Nested metadata objects such as `openGraph` can replace parent values rather than deep-merge. Restate or share the fields that should survive. Avoid an inherited homepage `openGraph.url` on every route. - Set preview controls deliberately. `max-image-preview:large` permits larger previews; `max-snippet:-1` permits unrestricted snippet length. These are permission controls, not ranking boosts or guaranteed excerpt lengths. Preserve intentional restrictions and check current engine controls. - Use author/entity attribution where it describes the content. A person, product, organization and website are distinct entities; `sameAs` identifies the same entity, not every associated organization. ## Sitemaps and rendering Implement sitemaps from the authoritative public route inventory. Use content modification dates or omit them; availability-gated pages must follow the same gate as their routes. Fetch emitted XML and its URLs after building. A generated sitemap collection may need an explicit index or discovery entries. Verify the installed version's `generateSitemaps` parameters and output paths instead of reconstructing them from memory. Sitemap caches and upstream CDNs can outlive the app deploy; verify the public response. Server-render the principal text and navigational anchors on indexable hubs and detail pages. Client Components can prerender; mounting guards, viewport-dependent state and effect-only fetching can still remove the useful initial HTML. Keep a useful visible fallback for readers without JavaScript and enhance it after hydration. Verify the visual transition, not just raw text counts. Cache Components changes available route configuration and caching APIs. Verify support before adding `dynamic`, `revalidate` or `fetchCache` exports. Choose content-aware invalidation and account for CDN caching separately. ## Status codes and redirects A `notFound()` or redirect after streaming starts may produce a 200 shell with metadata or a client redirect. For routes that require a true 404 or 3xx, validate existence or redirect before streaming using a supported routing boundary. Test the actual status with an invented path and a migrated URL. Redirect specificity and basePath prefixing affect matching. Check bare roots, trailing slashes, query strings and Markdown twins. Preserve legitimate deep paths, avoid loops, and verify the final destination's status and canonical. For Next versions that use `proxy.ts`, use the documented exported handler, runtime and matcher format. Check the compiled behavior for exact versus descendant matches. Do not migrate unrelated middleware solely because an SEO file changed. ## Markdown twins and llms.txt Inspect existing `llms.txt` and `*.md` handlers before adding another. Typical App Router shape: a route handler or `proxy.ts` rewrite that serves the markdown source at the HTML path with `.md` appended (directory URLs use `index.md`). On `Accept: text/markdown`, return that body with `Content-Type: text/markdown; charset=utf-8` and `Vary: Accept`; HTML Accept stays on the existing page. Confirm the matcher does not exclude `.md` or `llms.txt`. Honor Accept `q=0` and verify CDN `Vary` on both representations, as in `answer-engines.md`. AFDocs pass/fail for `llms.txt` shape, in-page directives, and coverage is `agent-ready`, not this file. ## Structured data Use types appropriate to the visible page and current supported search features. Stable `@id` references can connect entities across consistent JSON-LD blocks; one `@graph` is an optional organization convention. Script count alone is not an error. Derive markup from the same data as the rendered content. Check claims, links, dates, prices, reviews and author identities against what the page actually provides. Some schema properties need no literal visible label; the underlying claim still needs to be accurate and supported. Validate rich-result eligibility separately from JSON syntax and schema vocabulary validity. Escape `<` when embedding serialized JSON-LD in a script: ```tsx <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data).replaceAll('<', '\\u003c'), }} /> ``` Check the current feature documentation before promising FAQ, Article, Product or other rich results. A schema.org type can remain valid after a Google presentation feature is retired. ## Images, headers and performance Read generated social image URLs from the built output and fetch them. Do not infer extensions, host or basePath resolution from filenames. A declared OG URL whose response is HTML or 404 is a defect. Metadata may stream for one user agent and block in the head for another. Exercise the framework's HTML-limited bot path as well as browser/Google-style requests, especially for pages that read build-only filesystem assets. Verify server behavior, not a grep that counts escaped RSC metadata twice. A nonce CSP may require dynamic rendering and reduce caching. Do not add it solely to silence an SEO scanner. CORP is a browser response policy, not proof that a server-side social scraper cannot fetch an image. Diagnose the real request, MIME type and delivery failure. Keep the LCP resource discoverable early, reserve layout space and measure interaction delays. Use supported image priority/loading APIs for the installed version. Field measurements and lab diagnostics belong in separate evidence columns. -
research-protocol.md 3.6 KB
# Research Protocol Produce a decision about demand and product fit, not a table of plausible numbers. Use supplied exports as supplied evidence; for a request for fresh research, pull current data or label the access/freshness gap. ## Demand and intent Confirm the audience, product capability and outcome before selecting queries. Keep the promoted product distinct from a competitor named in a query: a Windows-capable alternative can legitimately target demand for a competitor that has no Windows app. Missing comparison details become verification items in the brief, not an invented contradiction. Inspect the actual results and existing site coverage to distinguish definitions, comparisons, implementation and purchase intent. Add a modifier when it disambiguates; do not force one onto an already-specific query or declare every broad noun unwinnable. Default to global scope unless the request or established market specifies a country. Preserve a tool's actual scope; an Australian figure is not global. Record the reported time window and pull date, including whether volume is a monthly average or a particular month. Query the primary and relevant secondary terms in the connected keyword tool. Use property-scoped Search Console queries, public discussions, support/sales evidence and product usage as additional demand signals. Lack of vendor volume for a niche term is not proof of no demand. Prefer improving an existing relevant page over creating a competing one. ## Prompt metrics House reporting uses the vendor's **Exact** prompt match figure. Match definitions vary by vendor; record the definition, engine, locale, sampling/estimation method and date window where available. Do not define Phrase or Exact universally by word order, or substitute keyword volume for prompt demand. When Exact is absent, report `No data (Exact unavailable)` rather than substituting Phrase, broad or a related prompt. A Phrase figure may be separately labeled as context, never placed in the Exact column. Distinguish a measured zero from missing data. Vendor-estimated demand and repeated prompt-panel visibility are separate measurements. ## Evidence table | Query or prompt | Metric and value | Source and match definition | Scope/engine | Window and pull date | |---|---|---|---|---| | <actual term> | <keyword volume, Exact prompt volume, or No data with reason> | <tool/export and metric definition> | <country/global, engine where applicable> | <reported window; retrieved date> | Do not merge unlike populations into one metric or fill blanks from memory. If sources disagree, preserve both scopes and reconcile definitions before selecting an authoritative number. Historical exports can inform context when labeled; they are not a current pull. ## Question map and decision Use natural evaluator questions: what it is, when to use it, alternatives, implementation, evidence and limitations. Mark questions already covered and identify material gaps. Hypothesized fan-out queries are brainstorming, not observed engine behavior; do not manufacture separate pages for every wording. Recommend create, update, consolidate, defer or validate based on demand evidence, attainable intent, differentiated value and the conversion path. State confidence and the next evidence needed. Quantitative evidence can be `No data`; a small validation may still be justified by explicit qualitative evidence. Treat vendor correlation studies as dated, sample-dependent research. Preserve engine, sample selection and non-causal limitations. Branded searches, independent mentions and videos can be tracked where useful, but none is a universal strongest predictor or a guaranteed lever. -
sources.md 2.5 KB
# Sources and Freshness This registry was checked on 2026-09-08. Treat the date as provenance, not a promise that vendor behavior remains unchanged. Reopen the relevant official page when deciding a volatile feature, API, policy or reporting capability. Record the source and access date beside consequential claims. ## Primary guidance | Topic | Source | |---|---| | Google AI search foundations, formatting myths and measurement | https://developers.google.com/search/docs/fundamentals/ai-optimization-guide | | Google generative AI report availability and dimensions | https://developers.google.com/search/blog/2026/06/gen-ai-performance-reports | | Bing AI reporting | https://blogs.bing.com/webmaster/February-2026/Introducing-AI-Performance-in-Bing-Webmaster-Tools-Public-Preview | | OpenAI search versus training and crawler identity | https://developers.openai.com/api/docs/bots | | Anthropic crawlers | https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler | | Google robots and preview directives | https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag | | Sitemaps and meaningful lastmod | https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap | | Canonical consolidation | https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls | | Localized versions and optional x-default | https://developers.google.com/search/docs/specialty/international/localized-versions | | Structured-data eligibility | https://developers.google.com/search/docs/appearance/structured-data/sd-policies | | Scaled content abuse and other spam policies | https://developers.google.com/search/docs/essentials/spam-policies | | Core Web Vitals | https://web.dev/articles/vitals | | Next.js implementation | Installed `next/dist/docs` first; https://nextjs.org/docs/app as fallback | ## Research, not ranking contracts https://ahrefs.com/blog/ai-brand-visibility-correlations/ reports associations from a selected established-brand population, not causal effects or universal coefficients. Use the study's current methodology, engine and sample restrictions rather than copying an undated strongest-predictor claim into instructions. Distinguish official engine guidance, vendor observational research, a site-specific experiment and house preferences. Official Google guidance describes Google, not every answer engine. An industry study can motivate a test; it cannot establish that a specific action will improve this site's visibility. -
technical-hardening.md 1.6 KB
# Delivery and Access Load this when response handling interferes with discovery. Security/privacy work unrelated to the SEO defect belongs to the relevant project workflow. - Check both the public proxy host and origin where permitted. Correct source code can still serve an auth page, WAF challenge or cached error at the public URL. - Verify robots directives in HTML and HTTP headers, including CDN-added fields. Preview deployments on custom domains need an explicit indexing policy; do not assume the platform adds noindex on every hostname. - Use 503 plus an appropriate Retry-After for temporary unavailability. A long outage can still affect search visibility; the header does not guarantee retention. - Distinguish browser-enforced CSP/CORP/CORS restrictions from server-to-server fetches. Verify the failing consumer and actual resource response before weakening headers. - Check static files, redirects and generated metadata under the deployed basePath. Inspect image MIME type and actual content rather than trusting a 200 response. - For robots changes, verify group precedence and private-route exclusions. Do not disable the WAF globally to accommodate a crawler; use verified identity and the narrow affected rule. - Do not write real credentials, verification tokens or private analytics exports into public artifacts. Preserve existing ownership verification and request the required scoped access through the host's supported authentication flow. Legal consent and retention requirements vary by property and jurisdiction. Do not turn a generic SEO checklist into a blanket legal compliance assertion or change consent settings to improve measured conversions. -
validation-evidence.md 2.3 KB
# Validation Evidence Choose probes for the changed behavior, not a fixed command quota. Record commands, timestamp, exact requested/final URLs, environment/build identity and relevant results. Preserve unrelated processes and edits; use an available port owned by this task for local serving. ## Built-page checks 1. Run the repository's applicable lint/type/build checks. Use a production build when metadata, static generation or prerendering is involved. 2. Fetch the actual HTML response and parse title, canonical, meta/header directives, headings, anchors and JSON-LD. Do not count SVG titles, escaped payloads or script string matches as HTML elements. 3. For rendering changes, compare raw HTML with the browser DOM and inspect the visual result with and without JavaScript. Check the affected route pattern, a detail route and a missing path. 4. For sitemap changes, parse emitted XML, verify advertised URLs and compare lastmod to the content source. For redirects, inspect the complete chain and terminal status/canonical. 5. For AI access, probe relevant user-agent paths, then distinguish those results from authenticated crawler logs or engine URL inspection. For content negotiation, test both representations and cache request orders. 6. Check JSON-LD syntax, entity consistency and current rich-result eligibility separately. Multiple consistent blocks are valid; DNS ownership does not require a duplicate meta token. ## Completion evidence Report each applicable check as passed, failed, not applicable or not measured. A local pass supports local behavior only. After an authorized deployment, wait for readiness, verify deployment identity and repeat the material probes through the real public host/CDN. A deployed source change with an unchanged cached public response remains unverified. Use Search Console/Bing inspection where available for engine-observed indexing. State `No data` if unavailable; neither sitemap submission nor a crawler 200 response establishes index inclusion. Report field Core Web Vitals independently of lab diagnostics. Verify current thresholds when assessing performance; conventional good thresholds are LCP <=2.5s, INP <=200ms and CLS <=0.1 at the 75th percentile. Specify URL/origin aggregation, device and date window. Missing field data is not a pass.
-
-
SKILL.md 7.7 KB
--- name: seo description: Audits and fixes technical SEO, researches search demand, creates content briefs, and measures SEO/AEO performance. Use when asked to "audit SEO", "fix indexing", "improve AI visibility", "check keyword volume", "write an SEO brief", or "why did organic traffic drop". For Mintlify Agent Score, AFDocs, or Is Agentic reports use agent-ready. For writing the article use ghostwriter; for visual redesign use ui-design. --- # SEO - **IS:** one entry point for search visibility: evidence-led audits, implementation, demand research, writer briefs, and performance measurement across search and answer engines. - **IS NOT:** writing the article (`ghostwriter`), standalone marketing copy (`copywriting`), visual redesign (`ui-design`), tenant infrastructure (`multi-tenant-architecture`), or implementing AFDocs / Is Agentic / Is It Agent Ready scorecards (`agent-ready`). Fix SEO copy and markup when they are part of the requested implementation. ## Route the task | Request | Load | Deliverable | |---|---|---| | Audit a site, diagnose indexing, review a migration | `references/audit.md` and `references/validation-evidence.md` | Prioritized findings with URLs, observed evidence, impact, and correction | | Fix or implement SEO | Audit references, then applicable implementation references below | Code changes, scoped checks, and served-page evidence for the changed behavior | | Research demand, choose a target, brief a page | `references/research-protocol.md`; `references/brief-template.md` for a brief | Sourced demand table and decision, or a durable writer brief | | Explain traffic movement, measure AI visibility, monitor SEO | `references/monitoring.md` | Property-scoped diagnosis or configured monitoring with explicit data gaps | For a combined request, reuse one property and URL inventory across modes. An audit request produces findings; a request to fix them proceeds through implementation and verification within the user's authorized scope. A research-only request does not require crawling every URL or changing code. ## Establish the evidence boundary Identify the exact public host, URL-prefix or domain property, production environment, project/subpath, audience, and business outcome. On a shared domain, filter each project's path separately. In analytics, verify hostname, path, conversion event and attribution window before interpreting a number. Discover connected tools and existing project bindings first. Prefer the established reporting source, then an available equivalent, then a signed-in browser. No vendor is required. Ownership verification, API consent and a successful scoped query are separate states. An export for a neighboring property is not a fallback. Use `No data` with its reason for inaccessible, missing, unsupported or unmeasured metrics; distinguish these from a measured zero. Label historical exports by their actual dates. Do useful public checks while an authenticated metric is unavailable. ## Working sequence For substantial mixed work, track only the applicable steps: - [ ] Confirm property, scope, baseline and intended outcome. - [ ] Inspect live evidence and map affected route patterns or research questions. - [ ] Prioritize blocking defects and high-value opportunities; separate observations from hypotheses. - [ ] Implement authorized corrections or deliver the requested research/brief. - [ ] Recheck the changed behavior, identify the tested environment, and report remaining gaps. Prioritize crawl/index defects before cosmetic metadata changes. Page titles, headings and content structure follow the page's purpose and reader intent. Descriptive non-brand terms help category discovery; brand-led portfolio and product pages can be appropriate. Neither a fixed title character count nor question-shaped headings are ranking requirements. Original evidence, useful comparisons and honest product limitations earn their place ahead of manufactured keyword permutations. Research likely reader questions; do not present invented query fan-outs as engine telemetry or create a page for every variation. ## References | File | Read when | |---|---| | [references/audit.md](references/audit.md) | Crawling, diagnosing or prioritizing a site audit | | [references/indexing-policy.md](references/indexing-policy.md) | Canonicals, redirects, exclusions, duplicate or programmatic pages | | [references/nextjs-implementation.md](references/nextjs-implementation.md) | Implementing App Router metadata, sitemaps, rendering, status codes, Markdown twins, or schema; verify APIs against the installed Next.js docs | | [references/answer-engines.md](references/answer-engines.md) | AI visibility, crawler policies, Markdown alternatives or `llms.txt` | | [references/internationalisation.md](references/internationalisation.md) | Language/region variants and hreflang | | [references/technical-hardening.md](references/technical-hardening.md) | CDN access, response headers, errors or preview environments affect discovery | | [references/validation-evidence.md](references/validation-evidence.md) | Verifying findings, a built page or a deployed correction | | [references/research-protocol.md](references/research-protocol.md) | Keyword/prompt metrics, opportunity selection and question maps | | [references/brief-template.md](references/brief-template.md) | Producing a writer brief | | [references/monitoring.md](references/monitoring.md) | Search/AI performance, attribution, anomalies or recurring work | | [references/sources.md](references/sources.md) | A claim depends on current engine behavior, supported reports, or vendor research | ## Delivery Findings go in chat unless a file is requested. Writer briefs go to the requested project destination; retain prior dated briefs when producing a new revision. Keep scratch crawls and exports out of the repository. No em dashes in authored reports or briefs. Report what changed, why, exact verification evidence, and what remains unmeasured. A successful local build, ready deployment, public URL probe, Google index record and measured conversion are different evidence. Name the strongest state actually verified. Sending recaps to others, scheduling recurring work, spending on tools and production deployment follow the user's authorization and host rules. Reuse an existing matching monitor rather than creating another owner or schedule. ## Gotchas - A sitemap can parse while listing `/studio` that intentionally returns 404. Check its URLs, not just XML validity. - A canvas gated on mounted state can leave the homepage and category hubs with only navigation in initial HTML. Inspect those hubs as well as deep pages; `use client` alone does not imply missing server-rendered content. - `lastModified: new Date()` or a build timestamp describes generation, not necessarily a significant page update. Use content dates or omit the field. - A canonical tag on each URL does not resolve two copies that both self-canonicalize. Compare content and choose the preferred URL. - Two consistent JSON-LD scripts are not an error. Verify entity identity, eligible properties and visible supporting content instead of script count. - DNS verification needs no invented meta token. Confirm scoped data access separately. - A crawler user-agent probe does not authenticate a bot IP or establish index inclusion. Treat CDN logs and engine inspection as separate evidence. - Prompt demand, measured citations, mentions, AI impressions and referral sessions are different quantities. Preserve engine, source, match type, scope and window. - A vendor Search Console connector may under-report. Reconcile property, filters and aggregation against native Search Console before diagnosing a drop. Maintenance only: `evals/evals.json` holds behavioral scenarios and routing prompts. It is loaded when changing the skill, not during ordinary SEO work.
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.