AI visibility auto citation-gap
Where competitors get cited and you do not
No receipt. This lab has not run this loop. This lab has no citation engine configured. Ahrefs was cut on 2026-09-17 and Perplexity Sonar by decision, so running it here would mean inventing citation data. Everything in the catalog has run here and published what it found. This has not, so judge it on the prompts rather than on our word.
The file
take it and run it.
The full loop as one markdown file: what it needs, the goal prompt, the verifier prompt, and the stopping condition. MIT licensed, no account.
curl -fsSL https://vibemarketers.ai/templates/citation-gap.md -o .claude/loops/citation-gap.md You cannot fix citation gaps you cannot see. This loop reads a fixed set of queries on an answer engine, records which domains get cited in each answer, and ranks the queries where a competitor appears and you do not.
Use it when you want to know which questions your market asks AI where someone else is the answer.
You need an engine you can query programmatically and read citations from, a query set you have frozen, and a list of competitors by domain.
You get a ranked list: the queries you lose, who wins them, and the raw response per query so anyone can check the ranking.
The gate is nothing, because it publishes nothing. It reports.
Freeze the query set first
This matters more than the loop. Write the query set in four buckets before you build or change any page, and freeze it with a version and a date. Enough queries per bucket that one odd answer does not move the result:
- Brand: your company name, your product name, name plus a qualifier
- Problem: what a buyer types when they have the problem and do not know you exist
- Comparison: you versus a competitor, and category-versus-category
- Category: the definitional questions your category owns
Freeze it because a query set edited after you build pages is a set written to the pages. That makes any improvement unfalsifiable, which is the most common way this measurement goes wrong.
Goal prompt
Read <query-set-file> and <competitor-list>. For every query in the set, send
it to <engine> and store the complete raw response, including every citation
and the date it was collected.
For each query, record: which domains were cited, in what order, whether
<your-domain> appears at all, and whether any domain in <competitor-list>
appears.
Rank the queries where a competitor is cited and <your-domain> is not. Rank by
how many competitors appear, then by the position of the first competitor
citation.
Write the result to <output-file> with the raw response stored per query, the
engine name, and the collection date. Never substitute a ranking, a traffic
estimate, or any other metric for a citation. If the engine returns an error
for a query, record the error against that query rather than skipping it.
Verifier prompt
Open the output file and the raw responses.
FAIL if any ranked query has no raw response stored.
FAIL if the ranking cannot be reproduced from the stored responses alone.
FAIL if any citation count has no collection date or no engine name.
FAIL if any query in the input set is missing from the output without a
recorded error.
FAIL if any metric other than a citation appears as evidence of a gap.
FAIL if the query set file changed during the run.
Otherwise PASS. Print the verdict and, on FAIL, the query and the reason.
Stopping condition
Every query in the frozen set has either a stored response or a recorded error, the ranking is derived from those responses alone, and the verifier printed PASS.
What it may and may not do
May: read the query set, query the engine, store raw responses, write a ranked report.
May not: edit the query set, substitute a proxy metric for a citation, publish anything, or report a gap for a query it could not actually run.
What this will not tell you
A citation gap is not a traffic gap and not a revenue gap. It tells you an engine cited someone else for a question on one day. Answer engines vary run to run and reindex without warning, so a single reading is a snapshot rather than a measurement.
Read the same set on a schedule and compare against your own earlier readings, not against a competitor’s claims. Two readings a week apart on different days will differ for reasons that have nothing to do with anything you did.
This becomes a published loop the day it runs here and passes its checker. Until then it stays on the templates shelf.