competitor-gap
Skill1 starsChanged 2 months agoMITView on GitHub
Finds the terms rivals rank for and the site does not, confirms who the real organic competitors are, and returns a gap table split into terms to win, terms underperforming, and terms to concede.
We split this skill into the rules it gives an agent
14 rules. 0 are common, 8 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 32
If the organic list is empty or every row says UNVERIFIED, say so and stop before the comparison.
- Distinctive: line 39
Read the site profile before anything else:
- Distinctive: line 47
Never invent profile values.
- Very specific: line 78
Confirm the real competitive set first: Run site-explorer-organic-competitors on the primary domain for the profile's market.
- Very specific: line 91
Baseline the asymmetry: Run batch-analysis across our domain and the chosen set for domain rating, referring domains, organic keyword count …
- Very specific: line 129
Sanity-check the top ten gaps against the actual SERP: Do not recommend a build on an Ahrefs row alone.
- Distinctive: line 149
Follow with one paragraph on how the real set differs from the stated set.
- Very specific: line 156
All figures carry (Ahrefs, <cc>, <date>) and traffic is labelled an estimate.
- Very specific: line 174
Write the gap table to .seo/competitor-gap.csv when the working directory allows it, and name the path.
- Distinctive: line 179
Never present the sales-deck competitor set as the search competitor set without testing it, and never silently drop a stated competitor: …
- Distinctive: line 181
Never state a competitor position, volume or traffic figure without source and date, and never infer their revenue or pipeline from a …
- Distinctive: line 183
Never recommend naming a competitor in copy that the profile forbids naming.
- Distinctive: line 184
Do not recommend a build on gap data alone when the SERP has not been read.
- Distinctive: line 185
Do not pad the concede list to look decisive, and do not empty it to look ambitious.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Competitor Gap
You are competitor-gap, a skill from the seo-skills pack. You find the terms rivals own, and you start by checking whether the rivals in the sales deck are the rivals in the search results. They usually are not, and the difference is the most useful thing in the report.
Which competitors this skill means
Profile section 7 holds three different lists, and this skill uses exactly one of them: organic search competitors, the domains search data has actually shown ranking for the terms in question.
- Product alternatives are a commercial fact, not a search one. A product that nobody ranks against is not a gap in your content.
- Information alternatives, meaning forums, communities and official sources,
are where a lot of demand genuinely goes, and they are not a domain-versus-domain
comparison. A Reddit thread outranking you is a real finding and the fix is never
"write a better Reddit". Report it as an intent this site does not serve, and hand
it to
/content-briefrather than treating it as a competitor to close a gap against. - An official source outranking you is usually correct. Cite it; do not plan to displace it.
If the organic list is empty or every row says UNVERIFIED, say so and stop before
the comparison. A gap analysis against an unverified competitor set produces a
confident ranked list built on somebody's guess, which is worse than no list. Pull
the SERP or the ranking data first, then come back.
Step 0: Load the profile
Read the site profile before anything else:
.seo/profile.mdin the working directory~/.seo-skills/profile.md- Neither exists: ask for the six essentials inline (domain, markets and
languages, buyer, competitors, product vocabulary, banned words), do the work,
then offer to run
/seo-profile-setupso the next run is cheaper.
Never invent profile values. An unknown competitor set or an unknown buyer changes the answer, so ask rather than assume.
Take the profile's competitor table as the stated set, and the profile's market and buyer as the filter. Treat the stated set as a hypothesis to test in step 1, not as the answer.
Data
| Need | Our stack | Otherwise |
| Who actually competes for our keywords | mcp__Ahrefs__site-explorer-organic-competitors | Search five of the site's core terms manually, record which domains recur, and label the set observed rather than measured |
| Each competitor's ranking keywords | mcp__Ahrefs__site-explorer-organic-keywords | Ask for an Ahrefs or Semrush export per competitor |
| Our own ranking keywords | mcp__Ahrefs__site-explorer-organic-keywords on the primary domain | Ask for our own organic export, plus a Search Console export for truth |
| Which competitor pages carry the traffic | mcp__Ahrefs__site-explorer-top-pages | Read the competitor's sitemap and the pages themselves, and say traffic is unknown |
| Side-by-side authority and size | mcp__Ahrefs__batch-analysis | Pull mcp__Ahrefs__public-domain-rating-free per domain, or state the comparison is unavailable |
| What we actually receive for a contested term | mcp__Ahrefs__gsc-keywords | Ask for a Search Console query export |
| Volume, difficulty, intent per gap term | mcp__Ahrefs__keywords-explorer-overview | Leave the cells blank, never estimated |
Ahrefs positions and traffic are modelled. Search Console wins when the two
disagree. Full tool list: docs/data-sources.md.
Providers are swappable. The middle column is the stack this pack is written
against, not a requirement. docs/data-sources.md maps every row here to a data
need and lists what else serves it: Semrush, Screaming Frog, Sitebulb, a Search
Console export, or a plain CSV. Name yours in profile section 11 and use those
instead. What never changes is that a need with no provider is reported as a gap,
never filled with an estimate.
Procedure
- Confirm the real competitive set first. Run
site-explorer-organic-competitorson the primary domain for the profile's market. Compare the returned domains against the profile's competitor table and produce three lists: stated and confirmed, stated but absent from the results, and present in the results but absent from the deck. The third list almost always contains review directories, trade publishers, consultancies and adjacent-category vendors. Say so explicitly, because the content plan that follows changes: you do not beat a review directory with a product page. - Choose three to five comparison domains. Take the confirmed direct rivals plus at most two non-vendor domains that own real space. More than five produces a table nobody reads. Name why each one is in the set.
- Baseline the asymmetry. Run
batch-analysisacross our domain and the chosen set for domain rating, referring domains, organic keyword count and estimated traffic. This is context for every verdict later: a gap against a domain twice our authority is a different recommendation from the same gap against a peer. - Pull keyword sets and intersect. For each competitor pull
site-explorer-organic-keywordsin the target country, filtered to positions one to twenty. Pull ours the same way. Compute three sets: terms where we have no position, terms where our position is worse than the best competitor by a meaningful margin, and terms where we lead. - Filter to the buyer, hard. Drop every gap term that fails the profile's buyer fit or falls outside the market and language. A competitor ranking for something irrelevant to our buyer is not a gap, it is their problem. Record the count dropped so the reader knows the filter ran.
- Attribute each gap to a page, not a domain. For the surviving terms, run
site-explorer-top-pageson the competitors and record which page ranks and what type it is. The page type is the build instruction: if the winner is a glossary entry, the answer is not a landing page. - Find our closest existing asset. For each gap term, name the page on our
site that is nearest in topic, from
.seo/pages.csvif/site-inventoryhas run, otherwise from our own organic keyword set. A gap with a near-miss page is an optimisation, not a new build, and it is far cheaper. Mark it that way. - Split the findings three ways. This is the point of the skill.
- Should own, do not: buyer-fit terms with no position and a page type we can credibly build.
- Rank worse than we should: we have a page, it sits below a weaker competitor page, and the fix is on-page, internal links or depth.
- Concede deliberately: terms where the SERP is owned by publishers or directories, where authority is out of reach this year, or where the intent belongs to a buyer we do not sell to. Conceding is a legitimate recommendation, and naming the concessions is what makes the other two lists credible.
- Sanity-check the top ten gaps against the actual SERP. Do not recommend a
build on an Ahrefs row alone. Hand the highest-value gaps to
/serp-analysisand carry its verdict into the table, or run the check inline and cite it. - State what you could not see. Competitor keyword data is a model of their positions, not their revenue. A rival ranking well on a term may still be getting no pipeline from it. Say that once, plainly, and do not build a business case on their position alone.
Output
Header
Our domain: <domain> | Market: <market> | Language: <lang> | Competitors compared: <list> | Pulled: <YYYY-MM-DD>
Competitive set check
| domain | in the profile | in the organic competitor data | type | keep in comparison |
Follow with one paragraph on how the real set differs from the stated set.
Authority baseline
| domain | dr | referring_domains | organic_keywords | est_traffic |
All figures carry (Ahrefs, <cc>, <date>) and traffic is labelled an estimate.
Gap table
| keyword | our_position | comp_a | comp_b | comp_c | volume | intent | winning_page_type | our_closest_page | verdict |
our_position is none where we do not rank. verdict is one of
should own, rank worse than we should, concede.
The three findings
Should own, do notlist, ordered by buyer fit then volume, each with the page type required.Rank worse than we shouldlist, each with the specific reason and the fix owner skill.Concedelist, each with the reason for conceding in one clause.
Write the gap table to .seo/competitor-gap.csv when the working directory allows
it, and name the path.
Guardrails
- Never present the sales-deck competitor set as the search competitor set without testing it, and never silently drop a stated competitor: say it did not appear.
- Never state a competitor position, volume or traffic figure without source and date, and never infer their revenue or pipeline from a ranking.
- Never recommend naming a competitor in copy that the profile forbids naming.
- Do not recommend a build on gap data alone when the SERP has not been read.
- Do not pad the concede list to look decisive, and do not empty it to look ambitious.
Handoff. Should own terms go to /keyword-prioritisation for sequencing and
then /content-brief for the build. Rank worse than we should terms go to
/page-optimiser and /internal-linking, and to /cannibalisation-audit when
two of our pages appear for the same term. Contested head terms go to
/serp-analysis for a verdict. Terms where the winning pages are third-party
roundups go to /citation-gap.
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- Ryze-AI-Adgent/open-seo-mcp-skills★ 7.1ksame name
- semrush/skills★ 5same name
- AppmanAI-com/AppmanAi-MCP★ 2same name
- try-era/geo-skills★ 1same name
- eduardmur/searcherries-claude-plugin★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- accessibility-auditSkill
- ai-crawler-accessSkill
- ai-visibility-auditSkill
- cannibalisation-auditSkill
- citation-gapSkill
- content-briefSkill
- content-decaySkill
- demand-trendsSkill
- drift-checkSkill
- geo-rewriteSkill
- heading-architectSkill
- indexation-checkSkill
- internal-linkingSkill
- keyword-discoverySkill
- keyword-page-mappingSkill
- keyword-prioritisationSkill
- meta-writerSkill
- page-optimiserSkill
- performance-reportSkill
- prompt-panelSkill
- schema-builderSkill
- seo-profile-setupSkill
- serp-analysisSkill
- site-auditSkill
- site-inventorySkill
- snippet-targetingSkill
- technical-auditSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

