Notes From the Box

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

  1. Runs with citations. If the engine answered without sources, "it didn't cite us" isn't informative.
  2. Runs answered. Refusals and errors are rows, not gaps.
  3. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.org

    Expect: citation_rate = runs citing target / runs with citations; answer_citation_rate = … / runs answered; prompt_coverage = prompts with ≥1 citing run / prompts.

  7. 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.

  8. 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.

  9. 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.

Failure signatures
If you seeIt meansNext
A single percentage with no denominatorUnreproducible; can't tell 1/2 from 50/100.Report num/den/interval from the scorer.
Rows missing for refusals or uncited answersSilently inflates citation rate.Log them; answered=0 or empty cited_urls.
Prompts edited after the first runCherry-picking risk.Freeze a new version and restart, or report both.
Zero citations everywhereOften eligibility: pages not indexed, or a search crawler blocked in robots.txt (S2).Step 3 before concluding anything.
Look-alike domains counted as hitsSubstring matching on URLs.Match hostnames exactly or as subdomains (the scorer does).
Before/after difference reported as caused by the changeEngines, 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Related packs