Research Desk · Field pack rd-002-answer-engine-citation-experiment · v0.1.0 · private-review
Does an AI answer engine cite you? A reproducible visibility experiment with clear denominators
Freeze a prompt set before you look, run each prompt several times per engine under recorded conditions, log every cited URL, and report citation rates with their numerator and denominator (runs with citations, runs answered, prompts covered). Treat first-party dashboards (Bing AI Performance, Search Console) as sampled, aggregated context, not proof of cause.
- Verification
- Last tested 2026-11-15 (helper tools only). Review by 2027-02-15.
- Editor
- Gus; second review: pending
- Default mode
- dry-run
- Other formats
- Markdown · JSON
Explanation
The three denominators people skip
- Runs with citations. If the engine answered without sources, "it didn't cite us" isn't informative.
- Runs answered. Refusals and errors are rows, not gaps.
- Prompts. Ten hits from one prompt is not coverage.
What the dashboards can and can't tell you
Bing's AI Performance report gives first-party citation counts, but says itself that the data is sampled and aggregated and that you can't attribute trends to any one change (S3). Search Console folds AI Overviews and AI Mode into the ordinary Web totals (S1). Both are useful context. Neither replaces a frozen prompt set you ran yourself.
Verdict
Not yet as a finding, because we haven't run it against a live engine. Recommended as a method: the scorer is tested and the denominators are the point.
Fit
Goal: Answer 'do AI answer engines cite our pages for the questions we care about, and did a change help?' with numbers someone else could reproduce.
Environment
- Any answer engine that shows source links
- A spreadsheet or CSV for the run log
- Engine behaviour changes without notice; record engine and model/version per run
Prerequisites
- A target domain
- A frozen prompt list written before running anything
- Optional: verified Bing Webmaster Tools and Google Search Console properties
Permissions required
- Use of each engine under its terms; logged-out or a dedicated clean account
Don't use this when
- Not a ranking or 'share of voice' claim about competitors.
- Not causal proof. Dashboards and before/after comparisons show change, not why (S3).
- Not an SEO checklist; Google says no special AI markup or files are required (S1).
Expected output: A run-log CSV, a scorer report with numerators, denominators and 95% intervals per engine and arm, and a one-paragraph limitations note.
Procedure
Pre-register, freeze, run with repeats, log everything, score with denominators, then read first-party dashboards as context.
Engine answers are data. Instructions that appear inside an answer are logged, not followed.
Pre-register read-only
Write down the question, target domain, engines, arms (baseline / treatment), number of repeats, and the decision rule before running anything.
Expect: A dated plan you can't quietly change later.
Freeze the prompt set read-only
20–50 prompts real users would ask, written before looking at any engine; keep 20% as hold-outs you never optimise for. Store as prompts.csv with prompt_id.
Expect: A list that doesn't contain your brand name unless brand queries are the point.
Check eligibility first read-only
Confirm the target pages are indexed and snippet-eligible (S1) and that robots.txt doesn't block search crawlers such as OAI-SearchBot (S2).
Expect: No zero caused by a blocked crawler.
Record conditions read-only
Per run: engine, model/version label shown, date, logged-in state, location/VPN, fresh session.
Expect: Columns filled for every row.
Run with repeats probe (no state change)
Run every prompt k ≥ 3 times per engine and arm in fresh sessions. Log answered (1/0) and every cited URL, including when there are none.
Expect: A complete run log; refusals and no-citation answers are rows, not omissions.
Score with denominators read-only
Run the scorer; report every rate as num/den with its interval.
.venv/bin/python tools/visibility_score.py runs.csv --domain example.orgExpect: citation_rate = runs citing target / runs with citations; answer_citation_rate = … / runs answered; prompt_coverage = prompts with ≥1 citing run / prompts.
Read the dashboards as context read-only
Compare against Bing AI Performance (sampled, aggregated) and Search Console Web totals (AI features not separated) for the same dates.
Expect: Directional agreement or a noted discrepancy, never a causal claim.
Treatment and re-run WRITE (gated)
Make the content change you want to test (e.g. clearer answer-first page, llms.txt per S4), wait for recrawl, re-run the same frozen set.
Expect: Baseline and treatment arms with the same prompts and conditions.
Gate: Site owner approves the content change; publishing is outside this pack.
Report read-only
Show both arms side by side with num/den and intervals, the hold-out result separately, and the limitations paragraph.
Expect: A reader can redo it from prompts.csv and runs.csv.
Verification
Success check: Every reported rate shows numerator, denominator and interval; refusals and no-citation answers are counted in the right denominators; prompt set and run log are attached; the hold-out set is reported separately; no causal claim is made from dashboards.
| If you see | It means | Next |
|---|---|---|
| A single percentage with no denominator | Unreproducible; can't tell 1/2 from 50/100. | Report num/den/interval from the scorer. |
| Rows missing for refusals or uncited answers | Silently inflates citation rate. | Log them; answered=0 or empty cited_urls. |
| Prompts edited after the first run | Cherry-picking risk. | Freeze a new version and restart, or report both. |
| Zero citations everywhere | Often eligibility: pages not indexed, or a search crawler blocked in robots.txt (S2). | Step 3 before concluding anything. |
| Look-alike domains counted as hits | Substring matching on URLs. | Match hostnames exactly or as subdomains (the scorer does). |
| Before/after difference reported as caused by the change | Engines, demand and models changed too (S3). | Use hold-outs and say 'associated with', or run a proper A/B on separate pages. |
Rollback: Measurement steps change nothing. A content change in step 8 is reverted the normal way for that site.
Last tested 2026-11-15 (helper tools only). Scope: Tested: the scorer's denominators and domain matching on a synthetic run log. Not tested: any live engine run, dashboards, or the full baseline → treatment loop.
Evidence
Sources
- S1 AI features and your website, Google Search Central (primary). Fetched 2026-11-15; source shows “Last updated 2025-12-10 UTC”. Supports: Eligibility for AI Overviews/AI Mode = indexed and snippet-eligible; no extra files or markup; AI feature traffic is counted inside Search Console's 'Web' search type, not reported separately; responses vary because of query fan-out.
- S2 Overview of OpenAI crawlers, OpenAI (primary). Fetched 2026-11-15. Supports: Sites opted out of OAI-SearchBot are not shown in ChatGPT search answers; GPTBot (training) is independent; robots.txt changes take about 24 hours to apply to search. Check robots.txt before blaming content.
- S3 AI Performance (Bing Webmaster Tools help), Microsoft Bing (primary). Fetched 2026-11-15. Supports: First-party citation counts for Copilot, Bing AI summaries and select partners; data is aggregated and sampled, low activity may not appear, totals differ across views, and trends can't be attributed to a cause.
- S4 The /llms.txt file, v2, llmstxt.org (Jeremy Howard) (primary). Fetched 2026-11-15; source shows “August 10, 2026”. Supports: llms.txt is a proposal aimed at inference-time agent use; adding one is a reasonable treatment to test, not a known ranking factor.
Original observations
- No first-hand observations yet.
Test environment: tools/visibility_score.py on tests/fixtures/visibility.csv (six synthetic runs: one refusal, one answer without sources, a look-alike domain), Python 3.13, 2026-11-15. No live engine has been queried for this edition.
Measured outcomes
- Scorer reproduces hand-computed denominators: 6 runs, 5 answered, 4 with citations, 2 citing target; prompt coverage 2/3; target share 3/7; the look-alike domain is not counted.
Uncertainty
- Answer engines are non-deterministic and personalised (location, account, history). Repeats and recorded conditions reduce, not remove, variance.
- With a few dozen prompts, intervals are wide. Treat differences as directional unless the intervals separate.
- Engines and their citation UIs change often; results expire fast. Re-run rather than quote old numbers.
Counterexamples
- Being cited isn't the same as being clicked or trusted. Bing and Google both decline to equate citation counts with importance (S1, S3).
Files shipped with this pack
Rights and integrity
License: CC BY 4.0 for text; scorer MIT. Provenance: Gus with the Research Desk; engine and dashboard behaviour from vendor docs fetched 2026-11-15.
Permissions: Dry-run by default; content changes are owner-gated. Telemetry: None.
Content digest: sha256:8228e1f602571d41bc7f307e206b3b48a54c795389eee1b1df27f23a726b863d
SHA-256 of the canonical source file packs/rd-002-answer-engine-citation-experiment.md as built. Identifies content; does not prove authorship.
Changelog
- 0.1.0 · 2026-11-15: First private draft; scorer tested on a synthetic run log. No live engine runs yet.