VisibleDiagnostic Run the check

Methodology: what we measure, and where the numbers come from.

Last verified 2026-11-02 · Sources: VisibleDiagnostic method note and pilot data set, checked 2026-11-02 · Report an error

Four sources, eight steps and three limits. Every result number in the research page traces to this site's own pipeline or to the pilot CSV linked on this page.

Every number on the research page comes from one of two places: our own sampling pipeline, or the pilot data file we publish. This page names both, lists the steps that turn an answer into a row, and states the three limitations we know about.

Sources

The table lists the sources used by the pages that carry a “Last verified” line. The first three are this site's own records; the fourth is the model documentation for the API used by the free check and the pilot.

SourceURLUsed forLast checked
VisibleDiagnostic method notevisiblediagnostic.com/method/Sampling rules, stability labels, free-check proxy, disclosure2026-11-02
Pilot data set (raw CSV)visiblediagnostic.com/assets/data/ai-visibility-variance-pilot-2026-11-01.csvEvery set, Jaccard value, top-1 and count on the research page2026-11-02 · shipped with this build
VisibleDiagnostic privacy pagevisiblediagnostic.com/privacy/180-day contact retention and 120-day event counters quoted on the homepage2026-11-02
Perplexity API model documentationdocs.perplexity.ai/docs/agent-api/modelsModel id and API surface for the free check and the pilot2026-11-02

The CSV is a new file in this build, so its URL starts returning 200 when this build is live; the other three URLs returned 200 on 2026-11-02. No external publication is used to produce a number: the data is first-party by design, and the research page says so.

How it works

  1. Free check. api/check.js turns the brand, category, audience and up to two competitors into three questions, sends each to perplexity/sonar through OpenRouter once, and scores the result with 100 × (0.65 × mentionRate + 0.15 × citationRate + 0.2 × positionScore). The answers are rendered in the browser and are not written to the lead store.
  2. Paid diagnostic. Ten buying questions are agreed at kickoff and asked three times each in logged-out sessions over three days: 30 dated answers. Mentions, positions and citations are read and classified, then the same questions are re-run at day 60. The method note lists the labels and the things the report will not claim.
  3. Pilot sampling. 5 categories × 3 question types = 15 queries; each query is run three times, giving 45 answers. The sampling script and the answers are the internal record; the published CSV is the derived table, and the research page is generated from it.
  4. Brand-set extraction. For each category the run script holds a fixed six-name candidate list. Each answer is searched case-insensitively for those names; a brand joins the set once if it appears at least once, and its first character position determines order. Brands outside the list are not counted. This is the step that makes the sets reproducible and the step that limits them.
  5. Jaccard and top-1. For each query, the three run sets produce three pairs. Each pair scores |A ∩ B| / |A ∪ B|; empty-versus-empty is 1.0 and empty-versus-non-empty is 0.0. The per-query mean is the mean of the three pair scores. Top-1 is the candidate with the smallest first-character position; it is “stable” only when all three runs return the same top-1.
  6. Publication check. scripts/build-eeat-pages.py reads the CSV, recomputes every set, Jaccard value, top-1 and count, and compares them with the CSV's own jaccard_mean, top1_stable, identical_set and brands_count columns. A mismatch stops the build; the page is never allowed to drift from the file it links.
  7. Route registration. The same builder appends the new URL to sitemap.xml and llms.txt once. npm run verify (scripts/check-static.mjs) then checks title, description, canonical, one H1, JSON-LD, internal links and sitemap coverage.
  8. Retention. worker/worker.js writes lead records with an expirationTtl of 180 days and event counters with 120 days. Free-check answers are not in either record. The homepage and privacy page quote those values.

Step 2's reading and classification is manual. Step 4's matching is scripted. Neither is presented as more than a dated record of what the sampled surface said.

Known limitations

Corrections go through /corrections/. The pilot's numbers and their limits are on the research page.