Refactor the monolithic seo-analyzer into two specialist agents orchestrated in parallel by the /seo skill, plus a standalone /geo skill for AI-only audits. Changes - agents/seo-analyzer.md: refocused on classical engines (Google, Bing, DuckDuckGo). Adds Core Web Vitals 2.0 (LCP/INP/CLS + VSI), CSP + full security headers, hreflang audit, video SEO (transcripts), accessibility as ranking signal, image/video sitemaps. - agents/geo-analyzer.md: new agent for AI engines (ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews, Copilot). Covers AI crawler policy, llms.txt/llms-full.txt, Schema.org for AI extraction (QAPage, Speakable, Person+Article, Organization graph), entity SEO (Wikidata, sameAs, Knowledge Panel), content shape (Definition Lead, TL;DR, Q->A, citable stats, freshness), AI visibility testing. - agents/resources/: shared knowledge base referenced by both agents — ai-crawlers-2026.md (25+ bots, training vs retrieval categories, permissive/restrictive templates), llms-txt-template.md, geo-schemas.md (incl. deprecated list: ClaimReview, CourseInfo, etc. removed June 2025), entity-seo.md, content-shape-for-ai.md, ai-visibility-tools.md, automation-catalog.md. - skills/seo/SKILL.md: becomes parallel dispatcher. Collects context once (depth + business), spawns both agents in a single message for concurrent execution, merges envelopes into unified SEO.md. Includes authoritative file-ownership matrix to prevent parallel-edit races. - skills/geo/SKILL.md: new standalone wrapper for GEO-only audits. Scoring - Combined score: GLOBAL = 0.80 * SEO + 0.20 * GEO (local B2C), 0.75 * SEO + 0.25 * GEO (SaaS/national/content). - GEO axis weight raised from 5% (old) to first-class dimension. Policy - AI crawlers: permissive default (maximise AI citations). Restrictive template available for premium/regulated content. - Every user action in SEO.md section 11 must cite automation options from automation-catalog.md. Tools - WebFetch + WebSearch added to allowed-tools of both skills and both agents (needed for live CWV via PageSpeed API, AI visibility testing, Wikidata/Knowledge Panel lookups, competitor analysis). Research basis (2026 state of the art validated via WebSearch): - Core Web Vitals 2.0 (VSI signal, Google core update March 2026) - AI Overviews trigger on ~48% of Google searches - ClaimReview + 6 other schema types deprecated June 2025 - Definition Lead Architecture (CMU KDD 2024, +impression score) - Citations + stats add up to 40% AI visibility (Aggarwal 2024) - Wikidata grounds every major LLM (ChatGPT, Claude, Gemini, Perplexity) Backup - agents/seo-analyzer.md.bak kept for rollback reference. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
11 KiB
Schema.org for GEO — types that matter in 2026
All examples use JSON-LD (the only format Google recommends in 2026).
Place inside <script type="application/ld+json"> in <head> or
before </body>.
DEPRECATED — do not emit
Google deprecated these in June 2025. Stop emitting them and remove existing instances. They no longer produce rich results.
ClaimReview(was a fact-check signal)CourseInfoEstimatedSalaryLearningVideoSpecialAnnouncementVehicleListingBookactions (ReadAction, BuyAction on Book)
TIER 1 — highest GEO impact
QAPage — single Q&A format
Pages cited 58% more often by ChatGPT vs basic Article schema. Use when the page is built around ONE primary question.
{
"@context": "https://schema.org",
"@type": "QAPage",
"mainEntity": {
"@type": "Question",
"name": "What is the best framework for a public website in 2026?",
"text": "Should I use React SPA, Next.js, or Astro for a public-facing website in 2026?",
"answerCount": 1,
"acceptedAnswer": {
"@type": "Answer",
"text": "For public-facing websites, Astro is the 2026 default because it ships static HTML by default, preserves SEO/GEO signals, and allows React/Vue/Svelte islands only where interactivity is needed. React SPAs are only appropriate for authenticated, non-indexed surfaces.",
"dateCreated": "2026-04-21",
"upvoteCount": 0,
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://example.com/about"
}
}
}
}
FAQPage — multiple Q&A
Only valid when the page visibly contains all listed questions and answers. Google will penalise pages with FAQ schema that doesn't match visible content.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 2 to 5 business days in France."
}
},
{
"@type": "Question",
"name": "Do you offer refunds?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes — refunds are available within 30 days of purchase."
}
}
]
}
Speakable — voice + AI extraction marker
62% of searches in 2026 involve voice. Speakable flags the passage best suited for voice readout and AI summary.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article headline",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".article-summary", ".tldr"]
}
}
Or via xpath for non-CSS-targetable content:
"speakable": {
"@type": "SpeakableSpecification",
"xpath": ["/html/head/title", "//div[@class='tldr']"]
}
Article + Person — E-E-A-T backbone
The single most important pattern for non-local content. Couples content to a real author with verifiable credentials.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Exact title of the article",
"description": "One-sentence summary matching meta description.",
"image": ["https://example.com/images/hero-1x1.jpg", "https://example.com/images/hero-4x3.jpg", "https://example.com/images/hero-16x9.jpg"],
"datePublished": "2026-04-15T09:00:00+02:00",
"dateModified": "2026-04-21T14:30:00+02:00",
"author": {
"@type": "Person",
"@id": "https://example.com/about#author-jane",
"name": "Jane Doe",
"url": "https://example.com/authors/jane-doe",
"image": "https://example.com/images/jane-doe.jpg",
"jobTitle": "Senior Plumber",
"description": "Master plumber with 15 years of experience in Paris region.",
"knowsAbout": ["plumbing", "boiler repair", "leak detection"],
"alumniOf": "Lycée Professionnel Diderot",
"award": ["Qualibat RGE certification", "Artisan de l'année 2024 Essonne"],
"worksFor": {
"@type": "Organization",
"@id": "https://example.com/#org"
},
"sameAs": [
"https://www.linkedin.com/in/jane-doe-plomberie",
"https://twitter.com/janedoeplumbing",
"https://www.wikidata.org/wiki/Q123456789"
]
},
"publisher": {
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Business Name",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/article-slug"
}
}
TIER 2 — solid GEO contribution
HowTo — procedural content
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to reset a Chaffoteaux Talia Green boiler",
"description": "Step-by-step reset procedure for the Talia Green combi boiler.",
"totalTime": "PT5M",
"estimatedCost": {"@type": "MonetaryAmount", "currency": "EUR", "value": "0"},
"tool": [{"@type": "HowToTool", "name": "None"}],
"step": [
{
"@type": "HowToStep",
"name": "Locate the reset button",
"text": "The reset button is on the front panel, marked with a flame icon.",
"url": "https://example.com/guides/reset#step1",
"image": "https://example.com/img/step1.jpg"
},
{
"@type": "HowToStep",
"name": "Press and hold for 3 seconds",
"text": "Press the reset button until the red light turns off.",
"url": "https://example.com/guides/reset#step2"
}
]
}
BreadcrumbList — navigation context for AI
Gives AI the hierarchical position of the page. Nearly universal to add, low cost.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Accueil", "item": "https://example.com/"},
{"@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services"},
{"@type": "ListItem", "position": 3, "name": "Dépannage chaudière", "item": "https://example.com/services/depannage-chaudiere"}
]
}
LocalBusiness — local services (required for local SEO)
Must be consistent with GMB. Any divergence is a NAP inconsistency.
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#business",
"name": "Plomberie Dupont",
"image": "https://example.com/img/shopfront.jpg",
"url": "https://example.com",
"telephone": "+33123456789",
"priceRange": "€€",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 rue des Lilas",
"addressLocality": "Évry-Courcouronnes",
"postalCode": "91000",
"addressRegion": "Île-de-France",
"addressCountry": "FR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 48.62939,
"longitude": 2.44199
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "18:00"
}
],
"areaServed": [
{"@type": "City", "name": "Évry-Courcouronnes"},
{"@type": "City", "name": "Corbeil-Essonnes"},
{"@type": "AdministrativeArea", "name": "Essonne"}
],
"sameAs": [
"https://www.facebook.com/plomberiedupont",
"https://www.instagram.com/plomberiedupont",
"https://www.pagesjaunes.fr/pros/12345",
"https://www.wikidata.org/wiki/Q999999999"
]
}
Use the most specific subclass of LocalBusiness available (Plumber,
Dentist, Restaurant, AutoRepair, etc.) — list at
https://schema.org/LocalBusiness under "More specific Types".
Organization — company-level entity
Separate from LocalBusiness when brand > single location.
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Company Name",
"legalName": "Company Name SAS",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"foundingDate": "2015-03-01",
"founders": [{"@type": "Person", "name": "Founder Name"}],
"numberOfEmployees": {"@type": "QuantitativeValue", "value": "12"},
"vatID": "FR12345678901",
"iso6523Code": "0199:123456789",
"sameAs": [
"https://www.wikidata.org/wiki/Q123456",
"https://www.linkedin.com/company/companyname",
"https://www.crunchbase.com/organization/companyname"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+33123456789",
"contactType": "customer service",
"availableLanguage": ["fr", "en"]
}
}
Dataset — factual reference content
Use for data-heavy pages (statistics, research, public-data reports).
{
"@context": "https://schema.org",
"@type": "Dataset",
"name": "French boiler energy consumption by model, 2020-2025",
"description": "Average annual kWh consumption for 47 boiler models installed in France.",
"license": "https://creativecommons.org/licenses/by/4.0/",
"creator": {"@type": "Organization", "@id": "https://example.com/#org"},
"distribution": {
"@type": "DataDownload",
"encodingFormat": "text/csv",
"contentUrl": "https://example.com/data/boilers-2020-2025.csv"
}
}
TIER 3 — niche but high-leverage when applicable
Product— e-commerce (required for Merchant Center)Recipe— food sitesEvent— event listingsJobPosting— job boardsReview/AggregateRating— only when backed by verifiable public reviews (fraud risk otherwise)VideoObject— any embedded video (transcripts are critical for AI)DefinedTerm/DefinedTermSet— glossary pages, taxonomy (great for entity disambiguation)Course/EducationalOccupationalCredential— training/cert providersMedicalBusiness,PhysiologicalFeature,Drug— health (YMYL, demand extra rigour)
Graph linking — @id patterns
Use @id to build a single graph across multiple JSON-LD blocks:
{"@context":"https://schema.org","@graph":[
{"@type":"Organization","@id":"https://example.com/#org","name":"..."},
{"@type":"WebSite","@id":"https://example.com/#website","publisher":{"@id":"https://example.com/#org"}},
{"@type":"WebPage","@id":"https://example.com/page#webpage","isPartOf":{"@id":"https://example.com/#website"}},
{"@type":"Article","mainEntityOfPage":{"@id":"https://example.com/page#webpage"},"author":{"@id":"https://example.com/about#author-jane"}}
]}
This is the pattern Yoast, RankMath, and modern headless-CMS plugins output. It lets AI engines traverse entities without duplicating them.
Validation
- https://validator.schema.org — strict Schema.org validator
- https://search.google.com/test/rich-results — Google Rich Results Test
- https://developers.google.com/search/docs/appearance/structured-data — type-by-type Google docs