What Counts as One Domain? We Audited Our Own AI Citation Index Against Its Own Rule and Found 18 Rows That Break It
Every AI visibility tool reports domains cited. Almost none tells you whether learn.microsoft.com counts as microsoft.com. We ran the audit on our own index: 23,280 published rows, one canonicalisation rule, and 18 rows that contradict it — including a source whose citations are split across two rows, one of them ranked 12th and one of them invisible.
Every AI visibility product you can buy reports a number of domains cited. Almost none of them tells you whether learn.microsoft.com is counted as microsoft.com or as something else, and the answer changes the number.
We publish an index in this category, so we ran the audit on ourselves rather than on a competitor. The result is that our own rule is clear, it is applied correctly 23,262 times out of 23,280, and the 18 rows where it is not applied are worth more attention than the 23,262 where it is.
The rule nobody publishes
Our own glossary already says this is a premise you have to declare before you collect anything. The Citation Rate entry lists, as premise seven of nine, "how redirects, subdomains, syndicated URLs, and third-party articles are matched." The Share of Citation entry says the same thing under "Apply One Citation Rule": define how subdomains are handled before collection, and apply the same rule to every answer in the sample.
That is good advice and we wrote it. Then we checked whether the Machine Relations Index public file states its own answer, and it does not. The release we audited is machine_relations_index_public_view_v2.0, methodology version mri_score_v2.0, generated 2026-09-23, covering 2026-05-10 through 2026-09-23 — 130 observed days, 16,475 answer runs, 129,264 source events, 975 eligible queries, six engines. The file carries a methodology paragraph and a canonical-copy definition. Neither sentence says what happens to a subdomain. A reader holding the machine-readable release can see a field called domain containing 23,280 values and has no published way to know what that field means.
It means the registrable domain. The ingest path lowercases the host, strips a leading www., strips a trailing dot, drops anything on google.com, and then keeps the last two labels — except where the second-to-last label is one of ac, co, com, edu, gov, net, org and the last is a two-character country code, in which case it keeps three. So ncsc.gov.uk survives as itself and learn.microsoft.com is supposed to become microsoft.com.
Two consequences follow immediately, and both are measurable in the published file.
Consequence one: there is no www question, because there is no www
Of 23,280 published rows, the number carrying a www. prefix is zero. The prefix is removed at ingest, before anything is counted. That is almost certainly the right call, and it is the reason this index cannot be used to answer "does www.example.com do better than example.com" — the two were merged before the question could be asked. Any vendor whose index does not do this is reporting two rows for one site; any vendor who does should say so. We had not said so until this paragraph.
Consequence two: the rule is broken in 18 rows, and 15 of them split a source in half
Applying the ingest function to every published value and comparing the result against the value itself is a four-line test. It flags 18 rows. Excluded from the test are the 606 rows of the form youtube.com/@channel, which are not host strings at all: those come from a deliberate platform-resolution step that names the publishing channel on a hosting platform, above a confidence threshold, and they carry 1,434 domain-run citations between them. YouTube itself is the second-ranked row in the index at 1,441 cited runs. Resolving a channel below the host is a design decision, and a defensible one. The 18 are not that.
Fifteen of the 18 are subdomains whose canonical parent is also published as its own separate row. The source's citations are therefore split across two rows, with the reader given no signal that they belong together:
| Published row | Cited runs | Engines | Canonical parent, also published | Cited runs | Engines | Parent's rank |
|---|---|---|---|---|---|---|
| learn.g2.com | 1 | 1 | g2.com | 458 | 6 | 8 |
| learn.microsoft.com | 1 | 1 | microsoft.com | 305 | 6 | 12 |
| news.crunchbase.com | 5 | 1 | crunchbase.com | 271 | 6 | 16 |
| hks.harvard.edu | 1 | 1 | harvard.edu | 150 | 6 | 36 |
| legal.thomsonreuters.com | 1 | 1 | thomsonreuters.com | 85 | 6 | 93 |
| blog.legaltechmg.com | 1 | 1 | legaltechmg.com | 36 | 6 | 381 |
| blog.lexcheck.com | 1 | 1 | lexcheck.com | 21 | 3 | unranked |
| blog.hrflow.ai | 1 | 1 | hrflow.ai | 15 | 4 | unranked |
| techblog.comsoc.org | 1 | 1 | comsoc.org | 6 | 3 | unranked |
| law.unh.libguides.com | 1 | 1 | libguides.com | 5 | 2 | unranked |
| blog.getvirtualadvisory.com | 1 | 1 | getvirtualadvisory.com | 4 | 2 | unranked |
| legal.cioreview.com | 1 | 1 | cioreview.com | 3 | 2 | unranked |
| thesupper.beehiiv.com | 1 | 1 | beehiiv.com | 3 | 2 | unranked |
| pmc.ncbi.nlm.nih.gov | 3 | 2 | nih.gov | 490 | 6 | 6 |
| discover.blueskyitpartners.com | 1 | 1 | blueskyitpartners.com | 2 | 1 | unranked |
The remaining three are a different shape each. google.com appears with 27 cited runs, and the ingest function is written to return null for google.com and anything ending in .google.com — so that row should not exist at all, and it is the largest of the 18. martech.volarisgroup.com is a subdomain whose parent is not separately published, so nothing is split; the row is simply at the wrong grain. And 205.12 is not a domain: it is a fragment of an address string that parsed far enough to be stored.
Fifty cited runs sit inside the 18 rows. Against 129,264 source events that is a rounding error, and we are not going to inflate it. The reason to publish it anyway is in the next section.
Why a 50-citation error is worth a page
Two reasons, and the second is the one that generalises.
The first is that the error is not distributed evenly — it lands on exactly the rows a reader is most likely to look up. NIH is ranked 6th in this release with a published 2.97% citation rate at Confidence A, and three of its citations are sitting in a pmc.ncbi.nlm.nih.gov row that a reader searching for "nih.gov" will never see. Microsoft is 12th. G2 is 8th. Crunchbase is 16th. A defect that is invisible in the aggregate is fully visible to the one person checking their own entry, which is the only use of a leaderboard anybody actually has.
The second reason is the shape of the tail. In this release, the number of sources cited by exactly one of the six engines is 15,798 — that is 67.9% of all 23,280 published rows. Another 3,706 are cited by two. Only 347 rows, one and a half percent of the index, were cited by all six engines:
| Engines that cited the source | Published rows | Share of index |
|---|---|---|
| 1 | 15,798 | 67.9% |
| 2 | 3,706 | 15.9% |
| 3 | 1,843 | 7.9% |
| 4 | 977 | 4.2% |
| 5 | 609 | 2.6% |
| 6 | 347 | 1.5% |
Every one of the 15 split rows above sits in the one-engine or two-engine band, because a row holding a single stray citation always does. Which means a canonicalisation miss and a genuinely thin source are, at the row level, the same object: one line, one or two engines, one or two observed days, graded collecting, below the evidence floor of 10 observations across 7 distinct dates. Our own floor is what stopped these 18 rows from ever being published as rates — none of them clears it, none of them carries a rank — and that is the floor doing its job. But an index without an evidence floor publishes a rate for all of them, and no reader can tell the two cases apart from the outside.
For contrast, the ranked head behaves completely differently. All 514 ranked rows were cited by at least two engines, 234 of them by all six. Breadth is what separates the head from the tail, and a grain error in the tail is invisible precisely because the tail is already made of single sightings.
What we are changing, and what we are not
We are not restating any published rate. The 15 split rows would move four ranked domains by between one and five citations against totals of 85 to 490, which changes no rank and no confidence grade, and a restatement that moves nothing is noise dressed as rigour. The rows are recorded here and in our public correction record, and the grain defect is filed against the ingest path.
What does change is the disclosure. The rule stated in this post — registrable domain, www. stripped, a seven-entry second-level list for country-code domains, platform channels resolved separately — is now published, which is what our own glossary told anyone to do and we had not done. An index whose unit of measurement is undeclared is not a measurement.
The question to ask a vendor
If you buy an AI visibility number from anybody, including us, four questions separate a measurement from a chart:
- What is one row? Host, registrable domain, or brand? Ask specifically what happens to
learn.microsoft.com, because it is the case that distinguishes all three answers. - What happens to
www.? If the answer is "nothing," their index has two rows for your site and both are wrong. - Do you use the Public Suffix List? A hand-maintained list of country-code exceptions — ours has seven entries — is how
state.co.usandcapterra.com.deend up treated as distinct sites. The PSL exists so that nobody has to guess; using it is a cost, not using it is a silent error class. - What is your evidence floor? Ours is 10 observations across 7 distinct dates, which is the only reason none of the 18 defective rows above ever carried a published rate. A tool that reports a percentage for a source seen once is reporting the presence of a crawl, not a market position.
None of this is exotic. Google's own crawler documentation treats hosts, not brands, as the unit; RFC 3986 defines authority at the host level; OpenAI and Perplexity both publish crawler identities per host. The grain is a choice every index makes and most keep private. We just published ours, including the 18 places where we did not follow it.
Methodology and sources
Population: every row in the domains array of the Machine Relations Index public view, release machine_relations_index_public_view_v2.0, methodology version mri_score_v2.0, generated 2026-09-23. Window 2026-05-10 to 2026-09-23, 130 observed days, 16,475 answer runs, 129,264 source events, 975 eligible queries, six engines — ChatGPT, Claude, Gemini, Google AI Mode, Google AI Overviews and Perplexity — over 24 measured subject categories plus a legacy news bucket. Evidence floor is 10 observed runs across 7 distinct run dates; rows below it are graded collecting and carry no published rate. Confidence grades in this release: 14 rows at A, 59 at B, 441 at C, 22,766 collecting.
Test: the ingest canonicalisation function was reimplemented line for line from its source and applied to every published domain value; a row is counted as a violation when the function's output differs from the stored value. The 606 platform-resolved rows containing a path segment were excluded before the test, as they are produced by a separate resolution step rather than by host canonicalisation. Counts of cited runs and the number of engines per row are read from each row's own mri_score_v2.overall fields as published, never re-derived. Ranks are read from the published rank field, which is populated for 514 rows and null elsewhere; "unranked" in the table above means that field is null, not that the source is absent.
Host-shape counts, for anyone reproducing this: 22,570 rows carry two labels, 708 carry three, one carries four and one carries five; of the 708 three-label rows, 694 are consistent with the rule because they are country-code registrations. Zero rows carry a www. prefix.
Limits. This is one release of one index measuring one basket of buying and research questions; a source that our query panel never triggers does not appear here at all, and its absence is a property of the panel, not of the web. The 18 rows are a grain defect in our own pipeline and say nothing about how any engine behaves. Nothing on this page should be read as a claim that a subdomain is cited less often than a root domain: this index merges subdomains into the parent by design, so it is structurally incapable of testing that, and the 15 rows above are the exception that proves it rather than a sample anyone could draw an inference from.