optbrew 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.claude-plugin/marketplace.json +6 -0
  2. package/.claude-plugin/plugin.json +6 -0
  3. package/.codex-plugin/plugin.json +13 -0
  4. package/CHANGELOG.md +20 -0
  5. package/LICENSE +21 -0
  6. package/README.ko.md +73 -0
  7. package/README.md +72 -2
  8. package/THIRD_PARTY_NOTICES.md +10 -0
  9. package/bin/optbrew.mjs +4 -0
  10. package/docs/platforms.md +31 -0
  11. package/docs/release.md +14 -0
  12. package/lib/cli.mjs +103 -0
  13. package/lib/doctor.mjs +44 -0
  14. package/lib/install.mjs +158 -0
  15. package/lib/paths.mjs +30 -0
  16. package/lib/records.mjs +44 -0
  17. package/lib/transaction.mjs +205 -0
  18. package/lib/update.mjs +181 -0
  19. package/package.json +39 -4
  20. package/plugin.json +13 -0
  21. package/skills/optbrew/LICENSE +21 -0
  22. package/skills/optbrew/SKILL.md +17 -0
  23. package/skills/optbrew/THIRD_PARTY_NOTICES.md +10 -0
  24. package/skills/optbrew/agents/openai.yaml +4 -0
  25. package/skills/optbrew/bundle-manifest.json +663 -0
  26. package/skills/optbrew/licenses/firecrawl-seo-audit.txt +15 -0
  27. package/skills/optbrew/licenses/magnus-seo.txt +21 -0
  28. package/skills/optbrew/licenses/marketing-search.txt +21 -0
  29. package/skills/optbrew/licenses/mblode-seo.txt +21 -0
  30. package/skills/optbrew/licenses/naver-searchadvisor.txt +29 -0
  31. package/skills/optbrew/licenses/seranking-seo.txt +21 -0
  32. package/skills/optbrew/modules/firecrawl-seo-audit/GUIDE.md +64 -0
  33. package/skills/optbrew/modules/magnus-seo/GUIDE.md +79 -0
  34. package/skills/optbrew/modules/magnus-seo/README.md +45 -0
  35. package/skills/optbrew/modules/magnus-seo/assets/audit-report-template.md +76 -0
  36. package/skills/optbrew/modules/magnus-seo/references/aeo-methodology.md +105 -0
  37. package/skills/optbrew/modules/magnus-seo/references/agent-readable-content.md +28 -0
  38. package/skills/optbrew/modules/magnus-seo/references/content-and-entity-architecture.md +100 -0
  39. package/skills/optbrew/modules/magnus-seo/references/content-strategy-seo.md +142 -0
  40. package/skills/optbrew/modules/magnus-seo/references/discovery-and-freshness.md +47 -0
  41. package/skills/optbrew/modules/magnus-seo/references/evidence-boundaries.md +75 -0
  42. package/skills/optbrew/modules/magnus-seo/references/ghost-metadata.md +204 -0
  43. package/skills/optbrew/modules/magnus-seo/references/implementation-playbook.md +114 -0
  44. package/skills/optbrew/modules/magnus-seo/references/measurement-and-experimentation.md +47 -0
  45. package/skills/optbrew/modules/magnus-seo/references/onpage-seo.md +154 -0
  46. package/skills/optbrew/modules/magnus-seo/references/platform-guidance.md +30 -0
  47. package/skills/optbrew/modules/magnus-seo/references/schema-markup.md +244 -0
  48. package/skills/optbrew/modules/magnus-seo/references/source-index.md +36 -0
  49. package/skills/optbrew/modules/magnus-seo/references/structured-data.md +56 -0
  50. package/skills/optbrew/modules/magnus-seo/references/technical-seo.md +99 -0
  51. package/skills/optbrew/modules/magnus-seo/scripts/aeo_audit.py +158 -0
  52. package/skills/optbrew/modules/magnus-seo/scripts/build_prompt_matrix.py +52 -0
  53. package/skills/optbrew/modules/magnus-seo/templates/aeo-implementation-plan.md +53 -0
  54. package/skills/optbrew/modules/magnus-seo/templates/citation-observation-log.md +16 -0
  55. package/skills/optbrew/modules/magnus-seo/templates/llms.txt.template +15 -0
  56. package/skills/optbrew/modules/magnus-seo/templates/question-cluster.md +27 -0
  57. package/skills/optbrew/modules/magnus-seo/templates/robots-ai-crawlers.txt +23 -0
  58. package/skills/optbrew/modules/marketing-search/skills/ai-seo/GUIDE.md +483 -0
  59. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/agent-readiness.md +57 -0
  60. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/citations-vs-recommendations.md +85 -0
  61. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-patterns.md +287 -0
  62. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/content-types.md +71 -0
  63. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/format-volatility.md +98 -0
  64. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/okf.md +104 -0
  65. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/platform-ranking-factors.md +154 -0
  66. package/skills/optbrew/modules/marketing-search/skills/ai-seo/references/youtube-ai-citations.md +60 -0
  67. package/skills/optbrew/modules/marketing-search/skills/analytics/GUIDE.md +303 -0
  68. package/skills/optbrew/modules/marketing-search/skills/analytics/references/event-library.md +260 -0
  69. package/skills/optbrew/modules/marketing-search/skills/analytics/references/ga4-implementation.md +300 -0
  70. package/skills/optbrew/modules/marketing-search/skills/analytics/references/gtm-implementation.md +390 -0
  71. package/skills/optbrew/modules/marketing-search/skills/content-strategy/GUIDE.md +432 -0
  72. package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/content-distribution.md +83 -0
  73. package/skills/optbrew/modules/marketing-search/skills/content-strategy/references/headless-cms.md +194 -0
  74. package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/GUIDE.md +231 -0
  75. package/skills/optbrew/modules/marketing-search/skills/programmatic-seo/references/playbooks.md +308 -0
  76. package/skills/optbrew/modules/marketing-search/skills/schema/GUIDE.md +172 -0
  77. package/skills/optbrew/modules/marketing-search/skills/schema/references/schema-examples.md +398 -0
  78. package/skills/optbrew/modules/marketing-search/skills/seo-audit/GUIDE.md +492 -0
  79. package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/ai-writing-detection.md +200 -0
  80. package/skills/optbrew/modules/marketing-search/skills/seo-audit/references/international-seo.md +230 -0
  81. package/skills/optbrew/modules/marketing-search/skills/site-architecture/GUIDE.md +350 -0
  82. package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/mermaid-templates.md +216 -0
  83. package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/navigation-patterns.md +305 -0
  84. package/skills/optbrew/modules/marketing-search/skills/site-architecture/references/site-type-templates.md +293 -0
  85. package/skills/optbrew/modules/mblode-seo/GUIDE.md +74 -0
  86. package/skills/optbrew/modules/mblode-seo/references/answer-engines.md +58 -0
  87. package/skills/optbrew/modules/mblode-seo/references/audit.md +78 -0
  88. package/skills/optbrew/modules/mblode-seo/references/brief-template.md +47 -0
  89. package/skills/optbrew/modules/mblode-seo/references/monitoring.md +56 -0
  90. package/skills/optbrew/modules/mblode-seo/references/nextjs-implementation.md +65 -0
  91. package/skills/optbrew/modules/mblode-seo/references/research-protocol.md +37 -0
  92. package/skills/optbrew/modules/mblode-seo/references/sources.md +47 -0
  93. package/skills/optbrew/modules/mblode-seo/references/validation-evidence.md +21 -0
  94. package/skills/optbrew/modules/naver-searchadvisor/GUIDE.md +75 -0
  95. package/skills/optbrew/modules/naver-searchadvisor/NOTICE.md +59 -0
  96. package/skills/optbrew/modules/naver-searchadvisor/references/INDEX.md +97 -0
  97. package/skills/optbrew/modules/naver-searchadvisor/scripts/audit.mjs +714 -0
  98. package/skills/optbrew/modules/naver-searchadvisor/scripts/robots.mjs +77 -0
  99. package/skills/optbrew/modules/seranking-seo/skills/seo-ai-search-share-of-voice/GUIDE.md +94 -0
  100. package/skills/optbrew/modules/seranking-seo/skills/seo-api/GUIDE.md +186 -0
  101. package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/api-surface-map.md +207 -0
  102. package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/auth-and-keys.md +182 -0
  103. package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/integration-patterns.md +283 -0
  104. package/skills/optbrew/modules/seranking-seo/skills/seo-api/references/rate-limits-and-credits.md +235 -0
  105. package/skills/optbrew/modules/seranking-seo/skills/seo-competitor-gap-analysis/GUIDE.md +117 -0
  106. package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/GUIDE.md +155 -0
  107. package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/cite.md +84 -0
  108. package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/references/core-eeat.md +147 -0
  109. package/skills/optbrew/modules/seranking-seo/skills/seo-content-audit/templates/verdict.md +63 -0
  110. package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/GUIDE.md +141 -0
  111. package/skills/optbrew/modules/seranking-seo/skills/seo-firecrawl/references/preflight.md +73 -0
  112. package/skills/optbrew/modules/seranking-seo/skills/seo-geo/GUIDE.md +159 -0
  113. package/skills/optbrew/modules/seranking-seo/skills/seo-google/GUIDE.md +393 -0
  114. package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/cwv-audit-report.md +48 -0
  115. package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/gsc-performance-report.md +44 -0
  116. package/skills/optbrew/modules/seranking-seo/skills/seo-google/assets/templates/indexation-status-report.md +43 -0
  117. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/auth-setup.md +160 -0
  118. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/cross-skill-integration.md +187 -0
  119. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/ga4-data-api.md +184 -0
  120. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/indexing-api.md +109 -0
  121. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/keyword-planner-api.md +66 -0
  122. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/nlp-api.md +55 -0
  123. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/pagespeed-crux-api.md +204 -0
  124. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/rate-limits-quotas.md +75 -0
  125. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/search-console-api.md +156 -0
  126. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/supplementary-apis.md +99 -0
  127. package/skills/optbrew/modules/seranking-seo/skills/seo-google/references/youtube-api.md +49 -0
  128. package/skills/optbrew/modules/seranking-seo/skills/seo-keyword-niche/GUIDE.md +174 -0
  129. package/skills/optbrew/modules/seranking-seo/skills/seo-page/GUIDE.md +174 -0
  130. package/skills/optbrew/modules/seranking-seo/skills/seo-plan/GUIDE.md +220 -0
  131. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/GUIDE.md +135 -0
  132. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/references/google-rich-results.md +89 -0
  133. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/article.json +23 -0
  134. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/breadcrumb-list.json +18 -0
  135. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/faq-page.json +22 -0
  136. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/local-business.json +32 -0
  137. package/skills/optbrew/modules/seranking-seo/skills/seo-schema/templates/product.json +25 -0
  138. package/skills/optbrew/modules/seranking-seo/skills/seo-sitemap/GUIDE.md +128 -0
  139. package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/GUIDE.md +235 -0
  140. package/skills/optbrew/modules/seranking-seo/skills/seo-technical-audit/references/severity-mapping.md +133 -0
  141. package/skills/optbrew/references/api.md +45 -0
  142. package/skills/optbrew/references/check-registry.json +28 -0
  143. package/skills/optbrew/references/evidence.md +9 -0
  144. package/skills/optbrew/references/intake.md +9 -0
  145. package/skills/optbrew/references/measurement.md +29 -0
  146. package/skills/optbrew/references/policies.md +7 -0
  147. package/skills/optbrew/references/profiles.json +13 -0
  148. package/skills/optbrew/references/remediations.json +12 -0
  149. package/skills/optbrew/references/report.md +25 -0
  150. package/skills/optbrew/references/routing.md +15 -0
  151. package/skills/optbrew/references/schemas/contract.schema.json +51 -0
  152. package/skills/optbrew/references/scoring.md +62 -0
  153. package/skills/optbrew/scripts/adapters/anthropic.mjs +116 -0
  154. package/skills/optbrew/scripts/adapters/imports.mjs +81 -0
  155. package/skills/optbrew/scripts/audit.mjs +145 -0
  156. package/skills/optbrew/scripts/cli.mjs +41 -0
  157. package/skills/optbrew/scripts/core/bootstrap.mjs +31 -0
  158. package/skills/optbrew/scripts/core/bundle.mjs +73 -0
  159. package/skills/optbrew/scripts/core/capabilities.mjs +19 -0
  160. package/skills/optbrew/scripts/core/collector.mjs +236 -0
  161. package/skills/optbrew/scripts/core/compare.mjs +47 -0
  162. package/skills/optbrew/scripts/core/contracts.mjs +144 -0
  163. package/skills/optbrew/scripts/core/cost-ledger.mjs +95 -0
  164. package/skills/optbrew/scripts/core/findings.mjs +54 -0
  165. package/skills/optbrew/scripts/core/metrics.mjs +97 -0
  166. package/skills/optbrew/scripts/core/protocol.mjs +125 -0
  167. package/skills/optbrew/scripts/core/report.mjs +652 -0
  168. package/skills/optbrew/scripts/core/scope.mjs +52 -0
  169. package/skills/optbrew/scripts/core/score.mjs +71 -0
  170. package/skills/optbrew/scripts/core/weights.mjs +139 -0
  171. package/skills/optbrew/source-lock.json +2686 -0
  172. package/source-lock.json +2686 -0
@@ -0,0 +1,147 @@
1
+ # E-E-A-T scoring rubric (60 items)
2
+
3
+ > **Sept-2025 QRG generalisation.** Updated for the September 2025 Quality Rater Guidelines and December 2025 core update — E-E-A-T applies broadly, not only to YMYL topics. The dimension definitions below, the 4 vetoes, and the AI-content-markers checklist are framed as defaults across all topics; the YMYL-specific calibrations are called out where they differ.
4
+
5
+ 15 items per dimension × 4 dimensions = 60 total. Score each: ✓ (full credit), ~ (partial), ✗ (fail). Dimension score = ✓ ÷ 15 × 100%. E-E-A-T composite = average of dimension scores.
6
+
7
+ ## Veto items (any one triggers automatic NO PUBLISH)
8
+
9
+ 1. **Anonymous authorship on a YMYL topic** (Your Money or Your Life: medical, financial, legal, safety). Author bylines required for these.
10
+ 2. **Factual claims with no sources cited.** A piece that asserts statistics, study findings, or expert positions without inline citations.
11
+ 3. **Undisclosed affiliate / sponsored relationships.** Required by FTC and Google's Helpful Content guidelines.
12
+ 4. **AI-generated YMYL content with no human-review markers.** Trips when ≥4 of the 8 AI-content markers below are present *and* the topic is YMYL *and* the page lacks all of: a named human editor byline, a "reviewed by" credit, a "last reviewed" or "fact-checked on" date. AI assistance is fine; AI assistance on health/finance/legal/safety with no human accountability surface is not.
13
+
14
+ ---
15
+
16
+ ## 1. Experience (15 items)
17
+
18
+ First-hand engagement with the topic. Did the author actually do this?
19
+
20
+ 1. The author has personally used / tested / experienced the product / service / process being discussed.
21
+ 2. The piece includes original photos, screenshots, or video the author captured.
22
+ 3. Original data the author collected (survey, A/B test, log analysis) is presented.
23
+ 4. Specific, verifiable details only an experienced practitioner would know (numbers, edge cases, quirks).
24
+ 5. Process documentation (step-by-step accounts) reflects real execution, not hypothetical steps. (see Word-count floors by page type — automatic ✗ if materially below floor without explicit auditor justification)
25
+ 6. Comparative observations across multiple instances (e.g., "across 12 client engagements, 8 saw…").
26
+ 7. The piece acknowledges trade-offs and failure modes the author encountered.
27
+ 8. Specific dates, locations, or contexts ground the experience claims.
28
+ 9. Hands-on demonstrations (live code, working artifacts, before/after evidence).
29
+ 10. Customer / user / patient quotes attributed to a real source (with permission).
30
+ 11. Time-based observations (e.g., "after 6 months of using X, the result was…").
31
+ 12. Process improvements or tweaks the author made along the way.
32
+ 13. Tools / specific configurations / version numbers mentioned (signals real use).
33
+ 14. Pricing / cost specifics from real engagements (not a price list).
34
+ 15. Failures or rejected approaches described, not just successes.
35
+
36
+ ## 2. Expertise (15 items)
37
+
38
+ Author's qualifications and depth on the topic.
39
+
40
+ 1. Author byline visible with full name, not "Admin" or pseudonym.
41
+ 2. Author bio includes credentials relevant to the topic (degree, certification, professional title).
42
+ 3. Author bio includes years of experience in the topic domain.
43
+ 4. Author has a linkable profile (LinkedIn, professional homepage, ORCID for academic).
44
+ 5. Author publishes consistently in this topic area (link to other articles).
45
+ 6. Citations to authoritative primary sources (peer-reviewed papers, government data, original research).
46
+ 7. Industry-specific terminology used correctly and consistently.
47
+ 8. Counter-arguments addressed and engaged, not strawmanned.
48
+ 9. Methodology section if the piece presents data or analysis. (see Word-count floors by page type — automatic ✗ if materially below floor without explicit auditor justification)
49
+ 10. Disclosure of limitations of the analysis or recommendations.
50
+ 11. Up-to-date with current developments in the field (recent references, current best practices).
51
+ 12. Distinguishes correlation from causation when discussing data.
52
+ 13. Avoids absolute claims where the field is genuinely contested.
53
+ 14. Editorial review credit (e.g., "reviewed by Dr. X").
54
+ 15. Author responds to comments / corrections (signals ongoing engagement).
55
+
56
+ ## 3. Authoritativeness (15 items)
57
+
58
+ Reputation of the author and publishing entity in the topic domain.
59
+
60
+ 1. The publisher has an "About" page describing its mission, history, team.
61
+ 2. Editorial guidelines / standards page is publicly available.
62
+ 3. The publisher is referenced or cited by other authoritative sources in the same field.
63
+ 4. Wikipedia or industry-association mentions of the publisher (a strong signal).
64
+ 5. The author has spoken at industry events, been quoted in trade press, or published in authoritative venues.
65
+ 6. Awards or recognitions from peer institutions (with verifiable links).
66
+ 7. The publisher's contact information is real and discoverable (physical address, named team).
67
+ 8. Domain age and consistency (publishing in this topic for years, not weeks).
68
+ 9. Other articles by this author cluster around the same topic (topical authority).
69
+ 10. Internal links from cornerstone content on this site point to this piece (it's part of a hub).
70
+ 11. External backlinks to this piece from authoritative sites (assess via `seo-backlink-gap` or `seo-backlinks-profile`).
71
+ 12. The publisher is a recognised authority for its topic per industry consensus (not just self-description).
72
+ 13. Press release / news coverage of the publisher's research or position on this topic.
73
+ 14. Citations from peer publications to the publisher's previous work.
74
+ 15. Inclusion in expert lists, "best of" roundups, awards lists by external bodies.
75
+
76
+ ## 4. Trustworthiness (15 items)
77
+
78
+ Signals that the page and publisher are honest, accurate, and accountable.
79
+
80
+ 1. HTTPS, valid certificate, no mixed-content issues.
81
+ 2. Privacy policy and terms of service accessible from the page footer.
82
+ 3. The publisher's name, registered business address, and contact route published.
83
+ 4. Last-updated date visible and recent (within freshness window for the topic).
84
+ 5. Original publish date visible.
85
+ 6. Editorial standards / fact-check policy linked.
86
+ 7. Corrections / updates log (visible if substantive corrections were made).
87
+ 8. Comment moderation visible (no spam, signs of engagement).
88
+ 9. Affiliate / sponsored / paid-content disclosures clear and prominent (if applicable).
89
+ 10. Author bio prevents impersonation (recognisable photo, social proof links).
90
+ 11. Schema.org `Article` (or sub-type) with `author` (Person), `publisher` (Organization), `datePublished` valid.
91
+ 12. Site-wide trust signals: customer reviews, testimonials linked to real names/orgs.
92
+ 13. The piece doesn't contain known misinformation about the topic (cross-check with authoritative sources).
93
+ 14. Sources cited are themselves trustworthy (not Wikipedia → Wikipedia → Wikipedia chains).
94
+ 15. Pricing, claims, and guarantees are clearly stated and not buried.
95
+
96
+ ---
97
+
98
+ ## AI-content markers (8 items — feeds veto #4)
99
+
100
+ A 2025-09 Search Quality Rater Guidelines update made "low-effort AI-generated content" an explicit demotion signal. These markers don't ban AI use — they identify pieces where AI was clearly the *only* hand on the page. Score each marker as **fired** or **not-fired** during the audit (record the decision and the evidence in `03-eeat-scoring.md`); count how many fire and combine with the YMYL + human-review-credit check in veto #4.
101
+
102
+ 1. **Generic LLM phrasing without specificity.** Multiple instances of formulaic transitions and filler. Examples: "in today's world", "it's important to note that", "let's dive in", "navigating the landscape of", "in conclusion", "when it comes to", "at the end of the day". Detection: keyword-search the body for the phrase set; **three or more matches = fired**.
103
+ 2. **Repetitive structural template across the site.** Five or more recently published pieces on the same domain share the identical H2 → H2 → H2 → H2 → FAQ structure with similar word counts and identical section labels (e.g., every post has "What is X?", "Benefits of X", "How to use X", "FAQ"). Smells like a single prompt template. Detection: spot-check 5 sibling posts via `WebFetch` or `seo-firecrawl` site map; **identical skeleton on ≥4 of 5 = fired**.
104
+ 3. **No original insight or first-hand evidence.** Every claim paraphrases something already on the SERP top-10; no original photo, no proprietary data, no specific anecdote. A 0/15 or 1/15 score on the Experience dimension is a strong corroborator. Detection: pick 3 non-trivial claims and check whether each appears (often verbatim or near-verbatim) in the SERP top-10 for the target keyword; **3/3 paraphrased without attribution = fired**.
105
+ 4. **Em-dash density + bolded-phrase peppering.** Heavy use of em-dashes mid-sentence + every 2–3 paragraphs has a bolded summary phrase. Common output of GPT-4-class models. Detection: count em-dashes per 1,000 words; **>15 em-dashes per 1,000 words combined with bolded-phrase pattern in ≥30% of paragraphs = fired**.
106
+ 5. **Hallucinated or unverifiable citations.** Inline citations exist but the linked source doesn't contain the cited claim, or the URL 404s, or the cited "study" can't be located via Google Scholar / publisher's site. Detection: spot-check 3 random inline citations; **≥1 of 3 fails verification = fired**.
107
+ 6. **AI-shaped author byline.** Byline reads "Editorial Team", "Staff Writer", "{SiteName} Team" with no linked profile; OR the byline links to a profile page with no other articles, no LinkedIn, no real-world footprint. Detection: click the byline; check for a real bio with linked social or LinkedIn profile; **generic-team byline OR ghost profile = fired**.
108
+ 7. **No "reviewed by" or "fact-checked on" credit.** Especially for YMYL topics, absence of any human-accountability surface is itself a signal — combined with markers 1–6, suggests AI-only authorship. Detection: search the page for "reviewed by", "fact-checked", "medically reviewed", "edited by", "last reviewed"; **none found = fired**.
109
+ 8. **Suspiciously round publishing cadence.** Same site shipped 20+ pieces on different topics in a week with no obvious editorial arc, or a brand-new domain published 50+ articles in its first month. Use `site:domain.com` search or `seo-content-brief`-style topic clustering on the domain to corroborate. Detection: list the most recent 30 published-date timestamps on the domain; **≥20 articles within a 7-day span across unrelated topics = fired**.
110
+
111
+ **Counting rule:** mark each marker as fired (1) or not-fired (0); record the evidence inline. **≥4 fired = AI-content suspected.** Combine with veto #4's YMYL + missing-human-review check before triggering the veto.
112
+
113
+ ---
114
+
115
+ ## Word-count floors by page type
116
+
117
+ Detect the page type from URL pattern, H1 phrasing, and JSON-LD `@type`, then apply the floor below.
118
+
119
+ | Page type | Floor | Rationale |
120
+ |---|---|---|
121
+ | Ultimate guide / pillar | 2,500 | Comprehensive coverage of a topic |
122
+ | How-to | 1,200 | Step-by-step depth |
123
+ | Listicle / best-of | 1,500 | Per-item description depth |
124
+ | Comparison (X vs Y) | 1,800 | Feature matrix + verdict + rationale |
125
+ | Explainer | 1,200 | Concept depth + examples |
126
+ | Review (single product) | 1,500 | Pros / cons / verdict + evidence |
127
+ | Landing page (commercial) | 600 | Conversion-led, less depth-driven |
128
+
129
+ These are floors, not targets. A 1,000-word how-to that's deeply original outperforms a 2,000-word how-to padded with generic intro/conclusion. Use the floors as a thin-content tripwire — anything materially below the floor for its page type fails the "depth" E-E-A-T item by default unless the auditor explicitly justifies the exception.
130
+
131
+ ---
132
+
133
+ ## How to score
134
+
135
+ For each item, mark ✓ (1), ~ (0.5), or ✗ (0). Dimension score = sum / 15 × 100%. E-E-A-T composite = average of 4 dimensions.
136
+
137
+ ## Threshold
138
+
139
+ - E-E-A-T composite ≥ 75% AND no veto = pass.
140
+ - 60–74% = "publish with fixes" (top 5 fixes from lowest-scoring items).
141
+ - < 60% OR any veto = no publish.
142
+
143
+ ## Calibration tips
144
+
145
+ - For YMYL topics, raise the bar: composite ≥ 85%, individual dimensions ≥ 75%.
146
+ - For purely informational content (e.g., a how-to on a hobby), Authoritativeness can be slightly lower if Experience and Expertise are strong.
147
+ - For brand / product content, Buyer-relevant Trust items dominate (transparent pricing, clear claims, social proof).
@@ -0,0 +1,63 @@
1
+ # Content Audit: {URL or title}
2
+
3
+ > Audited {YYYY-MM-DD} · Target keyword: "{keyword}" · Country: {country}
4
+
5
+ ## Verdict: {PUBLISH | PUBLISH WITH FIXES | NO PUBLISH}
6
+
7
+ {One sentence summary of why}
8
+
9
+ ## Scores
10
+
11
+ | Dimension | Score | Threshold | Status |
12
+ |---|---|---|---|
13
+ | Experience | {n}% | 75% | {✓/✗} |
14
+ | Expertise | {n}% | 75% | {✓/✗} |
15
+ | Authoritativeness | {n}% | 75% | {✓/✗} |
16
+ | Trustworthiness | {n}% | 75% | {✓/✗} |
17
+ | **E-E-A-T composite** | {n}% | 75% | {✓/✗} |
18
+ | Clear answer | {n}% | 70% | {✓/✗} |
19
+ | Include stats | {n}% | 70% | {✓/✗} |
20
+ | Timestamp | {n}% | 70% | {✓/✗} |
21
+ | Entity authority | {n}% | 70% | {✓/✗} |
22
+ | **CITE composite** | {n}% | 70% | {✓/✗} |
23
+
24
+ ## Veto checks
25
+
26
+ - Anonymous authorship on YMYL topic: {triggered / not triggered}
27
+ - Factual claims without sources: {triggered / not triggered}
28
+ - Undisclosed affiliate/sponsored relationships: {triggered / not triggered}
29
+ - AI-generated YMYL with no human review: {triggered / not triggered} ({n}/8 AI-content markers fired)
30
+ - Answer in first 300 words: {present / missing}
31
+ - Datestamp on time-sensitive content: {present / missing}
32
+ - Entity disambiguation for proper nouns: {present / missing}
33
+
34
+ ## AI Search readiness
35
+
36
+ - AIO present for "{keyword}": {yes/no}
37
+ - Top citation patterns observed: {bullet list of patterns}
38
+ - Candidate URL cited in any sampled AIO: {yes/no}
39
+ - Specific gaps vs cited sources:
40
+ - {gap 1}
41
+ - {gap 2}
42
+ - {gap 3}
43
+
44
+ ## Top 5 fixes (impact-ranked)
45
+
46
+ 1. {Specific fix linked to a low-scored item or veto}
47
+ 2. {Specific fix}
48
+ 3. {Specific fix}
49
+ 4. {Specific fix}
50
+ 5. {Specific fix}
51
+
52
+ ## Detailed scoring
53
+
54
+ See:
55
+ - `03-eeat-scoring.md` — item-by-item E-E-A-T (60 items)
56
+ - `04-cite-scoring.md` — item-by-item CITE (30 items)
57
+ - `05-aio-winner-comparison.md` — gap analysis vs cited sources
58
+
59
+ ## Recommended next step
60
+
61
+ - If PUBLISH: ship; capture a `seo-drift` baseline so you can track post-publish performance.
62
+ - If PUBLISH WITH FIXES: hand the top-5 fix list to the writer; re-audit after fixes.
63
+ - If NO PUBLISH: rework the piece against the failing dimensions; re-audit before re-considering publication.
@@ -0,0 +1,141 @@
1
+ > Example output: examples/seo-firecrawl-stripe-com-20260514/scrape/FIRECRAWL.md (upstream-only reference; route through optbrew)
2
+
3
+ # Firecrawl Orchestrator
4
+
5
+ A direct interface to Firecrawl MCP for tasks that fall outside the data-driven SE Ranking skills. Use when:
6
+
7
+ - You need raw HTML, `<head>` metadata, JSON-LD, or post-JS DOM that WebFetch's markdown conversion strips.
8
+ - You need a list of all URLs on a domain without pulling each one.
9
+ - You need to crawl a site and audit each page's metadata.
10
+ - You need to search within a known domain.
11
+ - A higher-level skill (`seo-page`, `seo-schema`, `seo-content-audit`, etc.) called you as a sub-step.
12
+
13
+ ## Prerequisites
14
+
15
+ - **Required:** the `firecrawl-mcp` MCP server. If `mcp__firecrawl-mcp__firecrawl_scrape` is unavailable, abort with the install command — `optbrew capability setup (see top-level routing)` from this plugin repo, plus the firecrawl.dev signup URL (free tier 500 credits/month). Don't attempt fallbacks; this skill exists for the cases WebFetch can't cover.
16
+ - User provides: a target URL or domain, plus optionally a mode (`scrape` / `map` / `crawl` / `search`). If mode unspecified, infer from input shape (single URL → `scrape`, single domain → `map`).
17
+
18
+ ## Process
19
+
20
+ 1. **Preflight.** Confirm `firecrawl-mcp` is connected. If not, surface the install command and stop.
21
+ 2. **Mode selection.** Resolve user intent into one of:
22
+ - `scrape` — single URL, full data (default if user supplies one URL).
23
+ - `map` — single domain, list of URLs only (cheap reconnaissance).
24
+ - `crawl` — single domain, fetch each discovered page (expensive; require explicit confirm).
25
+ - `search` — query within a domain.
26
+ 3. **Cost estimation + confirmation.**
27
+ - `scrape` (1 credit), `map` (~0.5 credit per discovered URL — estimate using a `map` first if scope unclear), `crawl` (1 credit per page crawled), `search` (1 credit per result returned).
28
+ - For `crawl` and for `map` of >50 expected URLs, surface the estimate and require explicit go-ahead before calling.
29
+ - Always read remaining credits implicitly via Firecrawl's response metadata (`creditsUsed` / `creditsRemaining` in `metadata`).
30
+ 4. **Execute.** Call the matching `mcp__firecrawl-mcp__firecrawl_*` tool.
31
+ - `scrape`: pass `formats: ["markdown", "html"]` by default (markdown for prose, html for `<head>` + JSON-LD). Add `formats: ["screenshot"]` only if the deliverable visibly uses one. SPAs: pass `waitFor: 2000` (or a CSS selector) so the JS-rendered DOM is captured. Default `onlyMainContent: true` to drop nav/footer noise — override only on explicit request.
32
+ - `map`: default `limit: 500` (hard cap). Pass `excludePaths: ["/admin/*", "/api/*", "/wp-admin/*", "/feed/*"]` as a sane default.
33
+ - `crawl`: default `limit: 50` (default cap), hard cap `limit: 200`. Always pass `excludePaths` to prune. Poll `firecrawl_check_crawl_status` if the job returns asynchronously.
34
+ - `search`: default `limit: 20`.
35
+ 5. **Parse + structure output.** Don't dump the raw API response. Per-mode:
36
+ - `scrape` → `RAW.md` (markdown body), `META.md` (og / twitter / canonical / robots / headers + parsed JSON-LD `@type` list with hashes), `links.csv`, optional `screenshot.png`.
37
+ - `map` → `URLS.md` with pattern-grouped list (e.g., `/blog/* — 128 (37%)`, `/products/* — 84 (24%)`), plus `urls.csv`.
38
+ - `crawl` → folder per page under `pages/{slugified-url}/` with `RAW.md` + `META.md`, plus a top-level `INDEX.md` summarising every page (URL, status, key signals).
39
+ - `search` → `MATCHES.md` with hit excerpts + URLs ranked by relevance.
40
+ 6. **Synthesise** `FIRECRAWL.md` at the root: target, mode, credits used, key findings (5 bullets max), open loops, recommended next skill.
41
+
42
+ ## Output format
43
+
44
+ Folder `seo-firecrawl-{slug}-{YYYYMMDD}/`:
45
+
46
+ ### Mode = scrape
47
+ ```
48
+ seo-firecrawl-{slug}-{YYYYMMDD}/
49
+ ├── RAW.md (markdown body)
50
+ ├── META.md (og / twitter / canonical / robots / headers + parsed JSON-LD)
51
+ ├── links.csv (every <a href> on the page)
52
+ ├── screenshot.png (optional; only if requested)
53
+ └── FIRECRAWL.md (synthesis + handoff payload)
54
+ ```
55
+
56
+ ### Mode = map
57
+ ```
58
+ seo-firecrawl-{slug}-{YYYYMMDD}/
59
+ ├── URLS.md (pattern-grouped URL list)
60
+ ├── urls.csv (every URL with discovery depth, if available)
61
+ └── FIRECRAWL.md
62
+ ```
63
+
64
+ ### Mode = crawl
65
+ ```
66
+ seo-firecrawl-{slug}-{YYYYMMDD}/
67
+ ├── INDEX.md (every page + status code + key signals)
68
+ ├── pages/
69
+ │ ├── {slug-1}/RAW.md
70
+ │ ├── {slug-1}/META.md
71
+ │ ├── {slug-2}/RAW.md
72
+ │ └── ...
73
+ └── FIRECRAWL.md
74
+ ```
75
+
76
+ ### Mode = search
77
+ ```
78
+ seo-firecrawl-{slug}-{YYYYMMDD}/
79
+ ├── MATCHES.md (hit excerpts + URLs ranked by relevance)
80
+ └── FIRECRAWL.md
81
+ ```
82
+
83
+ `FIRECRAWL.md` follows this shape:
84
+
85
+ ```markdown
86
+ # Firecrawl: {target}
87
+
88
+ > Run dated {YYYY-MM-DD} · Mode: {scrape | map | crawl | search} · Credits used: {n}
89
+
90
+ ## Summary
91
+
92
+ {One-paragraph what-came-back. Example: "Scraped https://example.com/article. og:title and og:image present, JSON-LD Article schema with author + datePublished. 12 outbound links. Page is server-rendered (no JS-render divergence). Robots: index,follow."}
93
+
94
+ ## Key findings
95
+
96
+ 1. {Finding anchored in concrete data}
97
+ 2. ...
98
+ 5. ...
99
+
100
+ ## Open loops
101
+
102
+ - {What this run did NOT answer}
103
+ - ...
104
+
105
+ ## Recommended next step
106
+
107
+ {One of: `seo-page` (when a single URL was scraped and now wants performance analysis) | `seo-schema` (when JSON-LD audit needs follow-up generation) | `seo-technical-audit` (when crawl revealed broken pages) | `seo-content-audit` (when crawl produced a corpus to audit) | `seo-drift baseline` (when the user wants to track this URL over time) | "this completes the user's ask".}
108
+
109
+ ## Handoff payload
110
+
111
+ - **Produced by:** seo-firecrawl
112
+ - **Target:** {url or domain}
113
+ - **Mode:** {scrape | map | crawl | search}
114
+ - **Credits used:** {n}
115
+ - **Key findings:** {5 bullets — e.g., "twitter:card present (summary_large_image)", "JSON-LD types: Article + Organization + BreadcrumbList", "robots: index,follow", "canonical self-referencing", "404s: 0 of 50 pages crawled"}
116
+ - **Open loops:** {what this didn't answer}
117
+ - **Recommended next skill:** {seo-page | seo-schema | seo-technical-audit | seo-content-audit | …} — {one-line why}
118
+ ```
119
+
120
+ ## Tips
121
+
122
+ - **Free tier 500 cr/month.** `map` is 0.5 cr/URL; `scrape` is 1 cr each; `crawl` 1 cr/page. Surface cost up front; warn when a single run will eat >100 credits.
123
+ - **Default `onlyMainContent: true`** for `scrape` to drop nav/footer noise. Override only if the user explicitly asks for full-page DOM.
124
+ - **Use `waitFor`** (CSS selector or ms) for SPAs that lazy-load content. 2000ms is a sensible default; selectors are more reliable than time waits.
125
+ - **`firecrawl_map` before `firecrawl_crawl`** when crawl scope is unclear — discover first, decide what to crawl, then crawl. Saves credits.
126
+ - **`includePaths` / `excludePaths`** dramatically cut crawl cost. Always pass `excludePaths: ["/admin/*", "/api/*", "/wp-admin/*", "/feed/*"]` as a default.
127
+ - **Don't request `formats: ["screenshot"]`** unless the deliverable visibly uses it. It doubles per-page cost.
128
+ - **Don't use `firecrawl_extract` or `firecrawl_deep_research`.** Both overlap with our own LLM analysis; `firecrawl_extract` has opaque pricing on the free tier; both are explicitly out of scope for `seo-skills`.
129
+ - **Cloudflare / anti-bot:** some sites (especially e-commerce, banking) block Firecrawl's scraper. Surface the error cleanly; defeating WAFs is not a goal of this skill.
130
+ - **Sub-step usage.** When invoked from another skill (`seo-page`, `seo-schema`, etc.), drop the `FIRECRAWL.md` synthesis — the caller wants the raw `META.md` / `RAW.md`. Skip mode-2's `URLS.md` summary too if the caller wants the raw `urls.csv`.
131
+ - **This is the entry point** when you need raw HTML and don't have a more specific skill in mind. If you do — `seo-page` for keyword/traffic verdicts on one URL, `seo-schema` for JSON-LD work, `seo-technical-audit` for crawl-wide issues — use those instead. They orchestrate Firecrawl plus SE Ranking data automatically.
132
+
133
+ ## Works well with
134
+
135
+ - **Predecessors:** none (entry point) or invoked as a sub-step from another skill.
136
+ - **Successors:**
137
+ - `seo-page` — when a single URL was scraped and now wants keyword/traffic verdicts.
138
+ - `seo-schema` — when JSON-LD audit produced gaps that need generation.
139
+ - `seo-technical-audit` — when a crawl revealed broken pages or noindex issues at scale.
140
+ - `seo-content-audit` — when a crawl produced a corpus to E-E-A-T-audit.
141
+ - `seo-drift baseline` — when the user wants to track this URL or domain over time.
@@ -0,0 +1,73 @@
1
+ # Shared preflight contract for analysis skills
2
+
3
+ > Shared preflight contract for analysis skills. v2.7.1+. Mirror this pattern; don't reimplement.
4
+
5
+ Every analysis skill in this catalogue runs the same 3-stage preflight at the start of its Process section. This file is the single source of truth — skills should reference it from their step 1 (or Prerequisites) rather than inlining the full prose.
6
+
7
+ The pattern was duplicated 6+ times across GUIDE.md files until v2.7.0; centralised in v2.7.1 so a doc fix lands in one place.
8
+
9
+ ## The 3-stage preflight
10
+
11
+ ### Stage A — SE Ranking credit balance (`DATA_getCreditBalance`)
12
+
13
+ Call `DATA_getCreditBalance` before running anything that costs SE Ranking credits. Surface the result and the per-skill estimate to the user before continuing, in this canonical shape:
14
+
15
+ ```
16
+ Remaining: {n} credits. Estimated cost: ~{n} credits. Continue? (y/N)
17
+ ```
18
+
19
+ The estimate is skill-specific — each skill cites its own figure in its step 1 reference (see "How to reference this from a skill" below).
20
+
21
+ If the remaining balance is below the estimate, surface the shortfall and stop — don't run a partial pass.
22
+
23
+ ### Stage B — Firecrawl availability (`mcp__firecrawl-mcp__firecrawl_scrape`)
24
+
25
+ Check whether `mcp__firecrawl-mcp__firecrawl_scrape` is connected. The branch is the same in every skill that uses Firecrawl:
26
+
27
+ - **If available → enriched path.** Run the Firecrawl-using steps as documented in the skill. Surface the projected Firecrawl cost (typically 1 credit per URL scraped, varies by mode — see `seo-firecrawl/GUIDE.md` § "Cost estimation").
28
+ - **If unavailable → degraded path.** The skill still runs on WebFetch + SE Ranking data. The Firecrawl-only deliverable lines emit `(skipped — Firecrawl not installed)` notes; skill-specific caveats (lower-confidence schema detection, missing canonical/robots/og:* recovery, etc.) are documented in the skill's own step descriptions.
29
+ - **`--no-firecrawl` flag.** User may pass `--no-firecrawl` to force the degraded path even when Firecrawl is available — useful for credit conservation.
30
+
31
+ When unavailable, also surface the install hint: `optbrew capability setup (see top-level routing)` (free tier 500 credits/month — see `seo-firecrawl/GUIDE.md`).
32
+
33
+ ### Stage C — Google APIs (`upstream script excluded; use optbrew capability routing`)
34
+
35
+ Run `upstream script excluded; use optbrew capability routing` and parse the result.
36
+
37
+ - **If `tier >= 0`** (any creds present): the skill branches into the per-tier enrichment recipes documented in `skills/seo-google/references/cross-skill-integration.md`. Each enrichment-aware skill has its own section there listing which tier unlocks which step.
38
+ - **If `tier == -1`** or the file is missing: the skill proceeds without Google enrichment and notes `Google enrichment: not configured (run `optbrew capability setup (see top-level routing)`)` in the deliverable.
39
+
40
+ This stage **defers entirely** to `skills/seo-google/references/cross-skill-integration.md` for per-tier branches, failure handling, and the per-skill enrichment recipes — don't duplicate that contract here.
41
+
42
+ ## Failure-mode table
43
+
44
+ Mirror the cross-skill-integration table for the Google stage; the Firecrawl + credit-balance rows are this skill's own additions.
45
+
46
+ | Failure | Detection | Skill response |
47
+ |---|---|---|
48
+ | Credit balance call fails | `DATA_getCreditBalance` returns error or non-200 | Note "SE Ranking credit balance unavailable — proceeding without preflight cost estimate; surface actual cost in deliverable" and continue. **Never** fail the run on this — credit data is a courtesy, not a gate. |
49
+ | Credit balance below estimate | `remaining < estimated_cost` | Surface the shortfall; ask the user whether to proceed with a reduced scope (e.g. lower URL cap, lite mode) or top up credits before re-running. |
50
+ | Firecrawl MCP not installed | `mcp__firecrawl-mcp__firecrawl_scrape` not in available tools | Note "Firecrawl not installed — degraded path active; install via `optbrew capability setup (see top-level routing)`" and run the WebFetch-only path. |
51
+ | Firecrawl rate-limit hit | Firecrawl response 429 | Note "Firecrawl rate-limit reached — falling back to WebFetch for remaining URLs" and continue degraded for the rest of the run. Do not retry in a tight loop. |
52
+ | Firecrawl Cloudflare/anti-bot block | Firecrawl response 403 / "blocked by WAF" | Note the affected URL and the block reason in the deliverable, then continue. Defeating WAFs is out of scope. |
53
+ | Google config file missing | `google_auth.py --check` exits non-zero | Note "Google field data: not configured" and skip enrichment. |
54
+ | Google API key invalid | Script returns `{"error": "API_KEY_INVALID"}` | Note "Google API key rejected — re-check `~/.config/seo-skills/google-api.json`" and skip. |
55
+ | GSC property not verified | `gsc_query.py` returns `{"error": "PROPERTY_NOT_VERIFIED"}` | Note "GSC property `{x}` not verified for this account" and skip GSC enrichment only. |
56
+ | GA4 property not configured | `ga4_property_id` empty in config | Note "GA4: property ID not configured (Tier 2 setup required)" and skip GA4 only. |
57
+ | Insufficient CrUX data | `pagespeed_check.py --crux-only` returns `{"crux": null}` | Note "CrUX: insufficient field data for `{url}` (low traffic)" and skip CrUX only. |
58
+ | Google API rate-limit hit | Script returns HTTP 429 | Note "Google API rate-limit reached — try again in 1h" and skip the affected enrichment. |
59
+
60
+ A skill **never** fails the run because preflight enrichment failed. Enrichment is optional uplift; the SE Ranking-based deliverable always ships.
61
+
62
+ ## How to reference this from a skill
63
+
64
+ In the skill's Prerequisites or Process step 1, replace the verbose 3-block preflight prose with this canonical reference:
65
+
66
+ ```
67
+ 1. **Validate target & preflight.** See `skills/seo-firecrawl/references/preflight.md` for the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:
68
+ - Estimated SE Ranking cost for this skill: ~{N} credits ({describe scope}).
69
+ - Firecrawl: {required | optional with WebFetch fallback | not used}, ~{N} credits if available.
70
+ - Google APIs: {tier required for which enrichment step, or "not used"}.
71
+ ```
72
+
73
+ Skill-specific notes preserve the bits that vary per skill (cost figures, Firecrawl scope, Google API tier) — the verbose preflight prose is centralised here.
@@ -0,0 +1,159 @@
1
+ > Example output: examples/seo-geo-notion-share-pages-20260514/GEO.md (upstream-only reference; route through optbrew)
2
+
3
+ # Page-Level GEO (Generative Engine Optimization)
4
+
5
+ For one URL, surface its AI-search citation footprint and recommend the page-level changes that would improve citability across AI Overview, Perplexity, ChatGPT, and other LLM-powered search engines. Different from the domain-level brand-vs-brand share-of-voice — this is page-level diagnosis.
6
+
7
+ ## Prerequisites
8
+
9
+ - SE Ranking MCP server connected.
10
+ - Claude's `WebFetch` tool available.
11
+ - User provides: a target URL. Optional: target country (default `us`), specific keywords to focus on (defaults: the URL's top-5 traffic-weighted keywords from SE Ranking).
12
+
13
+ ## Process
14
+
15
+ 1. **Validate target & preflight.** See `skills/seo-firecrawl/references/preflight.md` for the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:
16
+ - Confirm URL is fetchable before continuing.
17
+ - Estimated SE Ranking cost for this skill: ~10–20 credits typical (URL keyword footprint, AIO presence + leaderboard for top 5 keywords).
18
+ - Firecrawl: optional, ~3 Firecrawl credits if available. When available, the JSON-LD parse in step 7 and the AI-protocol-files step 8 use it. Without it, those steps emit `(skipped — Firecrawl not installed; install via optbrew capability setup (see top-level routing))` notes in `GEO.md` rather than failing the run. Pass `--no-firecrawl` to skip Firecrawl even when available (saves credits).
19
+ - Google APIs: not used.
20
+
21
+ 2. **URL keyword footprint** `DATA_getUrlOverviewWorldwide` and `DATA_getDomainKeywords` (URL-filtered)
22
+ - Pull URL's overview (keywords, traffic).
23
+ - Pull all keywords the URL ranks for. Sort by traffic-weighted score.
24
+ - Take the top 5 as the GEO investigation set (or use user-supplied keywords).
25
+
26
+ 3. **AIO presence per keyword** `DATA_getAiOverview`
27
+ - For each keyword, query AIO presence + citation list.
28
+ - Flag: AIO present? Is the candidate URL cited?
29
+ - Capture the AIO answer text — it tells you what passage shape Google's models prefer.
30
+
31
+ 4. **AIO leaderboard per keyword** `DATA_getAiOverviewLeaderboard`
32
+ - Full ranked list of cited sources per AIO query.
33
+ - Identify patterns: domain-level (which sites consistently cited?), passage-level (what structure?).
34
+
35
+ 5. **Page passage-level audit** `WebFetch`
36
+ - Pull the page HTML.
37
+ - Identify "passages" — paragraphs that could be extracted standalone (TL;DR boxes, definition paragraphs, summary sentences after H2s).
38
+ - For each passage, score citability:
39
+ - Has it a complete thought in 1–3 sentences?
40
+ - Does it answer a specific question (i.e., the question its parent H2 implies)?
41
+ - Has it a stat / number / named entity?
42
+ - Has it a clear timestamp or freshness signal?
43
+ - This is the citability layer.
44
+
45
+ 6. **Compare candidate to cited sources**
46
+ - For each AIO query where candidate is NOT cited, identify the cited sources.
47
+ - WebFetch 2–3 of them.
48
+ - Extract the cited passage (often a snippet from the AIO answer).
49
+ - Compare passage shape: candidate vs cited. Surface specific structural / content / freshness gaps.
50
+
51
+ 7. **Schema check** `mcp__firecrawl-mcp__firecrawl_scrape`
52
+ - WebFetch in step 5 returned markdown — JSON-LD blocks were stripped before parsing. The schema check requires Firecrawl to recover them.
53
+ - **If Firecrawl available:** scrape the target URL once (1 Firecrawl credit), parse the returned `html` for every `<script type="application/ld+json">` block. Specifically check for: `Article`/`BlogPosting` with valid `author` + `datePublished` + `dateModified`; `FAQPage` if Q&A blocks present; `BreadcrumbList`; `mainEntityOfPage` self-canonical.
54
+ - **If Firecrawl unavailable:** write `Schema check: skipped — Firecrawl required to parse JSON-LD blocks (WebFetch returns markdown only).` into `evidence/06-schema-check.md`, mirror the same line in the GEO.md "Schema check" section. Don't infer from markdown — that's the bug this section closes.
55
+ - Schema isn't a direct citation signal but it correlates strongly with citation rates in Google's AIO.
56
+
57
+ 8. **AI-protocol files** `mcp__firecrawl-mcp__firecrawl_scrape`
58
+ - **If Firecrawl available:** scrape `https://{domain}/llms.txt` and `https://{domain}/.well-known/rsl.json` (and the legacy `/RSL.txt` location as a fallback). Cost: 2 Firecrawl credits (one per file).
59
+ - For each file: capture HTTP status (200 / 404 / other), full body if present, and a parsed summary (declared content categories, allow/deny scope, attribution requirements).
60
+ - Surface in `evidence/07-ai-protocol-files.md` and in GEO.md as a new "AI-protocol files" section. These signal the domain's stance on LLM training and citation — present-and-permissive correlates with higher AIO citation rates.
61
+ - **If Firecrawl unavailable:** write `AI-protocol files: skipped — Firecrawl not installed.` Don't fall back to WebFetch (it would work for plain text but the integration stays uniform; runtime savings are negligible).
62
+
63
+ 9. **Synthesise** `GEO.md`
64
+
65
+ ## Output format
66
+
67
+ Create a folder `seo-geo-{target-slug}-{YYYYMMDD}/` with:
68
+
69
+ ```
70
+ seo-geo-{target-slug}-{YYYYMMDD}/
71
+ ├── GEO.md (synthesised report + recommendations — primary deliverable)
72
+ ├── 04-page-passages.md (extracted passages + citability scores — load-bearing reference editors consult)
73
+ ├── 05-cited-source-comparison.md (gap vs cited sources — load-bearing reference)
74
+ └── evidence/
75
+ ├── 01-url-keyword-footprint.md (URL overview + top keywords — raw step output)
76
+ ├── 02-aio-by-keyword.md (AIO presence + citation per keyword)
77
+ ├── 03-leaderboards.md (full leaderboards per keyword)
78
+ ├── 06-schema-check.md (JSON-LD audit for GEO-relevant types — requires Firecrawl)
79
+ └── 07-ai-protocol-files.md (llms.txt + RSL status and content — requires Firecrawl)
80
+ ```
81
+
82
+ Top-level: `GEO.md` + `04-page-passages.md` + `05-cited-source-comparison.md`. The other step files preserve raw API/scrape outputs in `evidence/` for reproducibility — editors and writers don't open them in the normal flow.
83
+
84
+ `GEO.md` follows this shape:
85
+
86
+ ```markdown
87
+ # GEO Analysis: {URL}
88
+
89
+ > Snapshot dated {YYYY-MM-DD} · Country: {country} · Keywords analysed: {n}
90
+
91
+ ## Citation footprint
92
+
93
+ | Keyword | AIO present | Candidate cited | Citers |
94
+ |---|---|---|---|
95
+ | {keyword 1} | ✓ | ✗ | {3 cited sources} |
96
+ | {keyword 2} | ✓ | ✓ | {includes candidate + 2 others} |
97
+ | ... |
98
+
99
+ **Citation rate: {n}/{checked} ({%}) of AIOs where candidate could appear actually cite it.**
100
+
101
+ ## Where the candidate IS cited
102
+ - {keyword X} — passage cited: "{passage text}"
103
+ - ...
104
+
105
+ ## Where the candidate is NOT cited (and AIO is present)
106
+ - {keyword Y} — cited sources tend to share these patterns:
107
+ - {pattern 1: short definitive answer in first 100 words}
108
+ - {pattern 2: numbered stat with date}
109
+ - {pattern 3: schema-marked Article with author bio}
110
+ - The candidate is missing: {specific gap}.
111
+
112
+ ## Page passage-level audit
113
+
114
+ Top-scoring passages on the candidate (by citability score):
115
+ 1. {passage at H2 "X" — score 8/10. Strong: definitive sentence, named stat. Weak: no date.}
116
+ 2. ...
117
+
118
+ Lowest-scoring passages (refresh candidates):
119
+ 1. {passage at H2 "Y" — score 3/10. Weak: vague generalities, no specific data.}
120
+ 2. ...
121
+
122
+ ## Schema check
123
+ - `Article` (or sub-type) present and valid: {✓/✗ | skipped — Firecrawl required}
124
+ - `author` populated with `@type: Person` and `url`: {✓/✗}
125
+ - `datePublished` + `dateModified` ISO 8601: {✓/✗}
126
+ - `FAQPage` for visible Q&A: {✓/✗/N-A}
127
+ - `BreadcrumbList`: {✓/✗}
128
+
129
+ ## AI-protocol files
130
+ - `/llms.txt` present: {✓ status 200 / ✗ status {n} / skipped — Firecrawl required}
131
+ - `/.well-known/rsl.json` (or `/RSL.txt`) present: {✓ / ✗ / skipped}
132
+ - Stance summary: {permissive / restrictive / mixed / unknown — based on declared categories and allow/deny scope}
133
+
134
+ ## Recommendations (top 5 to improve citability)
135
+
136
+ 1. {Specific change — e.g., "Add a 60-word TL;DR after the H1 that directly answers '{primary keyword}' — current page buries the answer below 800 words of preamble"}
137
+ 2. {Specific change}
138
+ 3. {Specific change}
139
+ 4. {Specific change}
140
+ 5. {Specific change}
141
+
142
+ ## Recommended next step
143
+ Re-run `seo-geo` on this URL in 30 days after applying the recommendations. AIO indexes update on a monthly cadence — citation changes show up there first.
144
+ ```
145
+
146
+ ## Tips
147
+
148
+ - Respect rate limit. ~5 keywords × 2 AIO calls = ~10 calls; plus 2–3 WebFetch on cited sources. Easy.
149
+ - Cost: ~10–20 SE Ranking credits typical, plus ~3 Firecrawl credits when the extension is installed (1 for target-URL JSON-LD, 2 for AI-protocol files). The skill degrades gracefully without Firecrawl — the schema and AI-protocol sections emit explicit "skipped" notes rather than silently dropping.
150
+ - **Citation isn't ranking.** A page can rank well organically and still not be cited in AIO. The opposite happens too — cited pages often rank below their citation rate.
151
+ - The biggest GEO levers are usually:
152
+ 1. Definitive answer in the first 200 words.
153
+ 2. Specific stats with dates and sources.
154
+ 3. Schema with author + dates.
155
+ 4. Passage-level structure (each H2 is a question; first paragraph after H2 is the answer).
156
+ - Pair with `seo-ai-search-share-of-voice` for domain-level brand-vs-brand visibility (this skill is page-level).
157
+ - Pair with `seo-content-audit` to apply the CITE rubric to the page (which has more citation-readiness items).
158
+ - Pair with `seo-schema` to fix schema issues identified in step 7.
159
+ - Don't optimize for AIO at the expense of human readability. The two reinforce each other when done right.