# AI rank tracking: 15 of 31 brand mentions carried no rank, and the answer shape decided

> Lantad read position and answer shape out of the 55 answers committed at core/fixtures/tracker-golden/goldens.json on 24 October 2026, using the stored labels and the recorded judge replies. 31 of the 55 name the brand. 16 of those 31 carry a position and 15 carry none. All 12 of the list answers that named the brand carried a rank, against 4 of the 17 prose answers, so the shape of the answer rather than the brand's standing decided whether there was a rank to report at all.

- Canonical page: https://lantad.co/blog/ai-rank-tracking-15-of-31-mentions-carried-no-rank
- This file: https://lantad.co/blog/ai-rank-tracking-15-of-31-mentions-carried-no-rank.md
- Last substantive update: 2026-10-24

## Key facts

- **Published:** 2026-10-24
- **Category:** Findings
- **Author:** Lantad
- **Length:** 3833 words
- **Takeaway 1:** AI rank tracking has nothing to report on most answer shapes: of the 31 answers naming the brand in core/fixtures/tracker-golden/goldens.json, read on 24 October 2026, 16 carried a position and 15 carried none.
- **Takeaway 2:** The judge contract in core/src/tracker.ts defines position as the brand's 1-based rank among the entities the answer recommends, and null when the answer is not a ranked or listed recommendation or the brand is absent, so an unranked mention is the designed outcome rather than a failed extraction.
- **Takeaway 3:** Answer shape decided it across the fixture set: 12 of the 12 list answers naming the brand carried a rank, against 4 of the 17 prose answers, and the one table answer and the one comparison answer carried none.
- **Takeaway 4:** Of the 51 judge replies stored as objects, 19 returned a number for position and sanitising kept 15, dropping a 0, a -3, and two ranks attached to answers the pipeline reads as no mention at all.
- **Takeaway 5:** Lantad weights the position factor at 0.20 of its Visibility Score in core/src/config.ts, and positionFactor in core/src/tracker.ts holds an unranked mention in the denominator at zero, which over these 55 fixtures comes to 0.281.

## Summary

A buyer shopping for AI rank tracking is usually carrying one mental model across from search, where a page sits at a numbered place in a list and a tool reports the number. Every product in this category, including this one, ships something that looks like that number. What the chart cannot tell you is how often the number exists at all. A ranked list of tools puts a brand third and the arithmetic is obvious. A paragraph that recommends two companies in passing puts nobody third, and whatever a dashboard draws for that answer is a decision somebody made about how to render an absence. This post opens Lantad's own position handling, runs it over the 55 answers committed to this repository as golden fixtures, and reports how many of them yielded a rank. Where that fits the rest of the measurement is set out under [AI visibility](https://lantad.co/glossary/ai-visibility).

The read was done on 24 October 2026 against core/fixtures/tracker-golden/goldens.json, taking the brand verdict and position from each row's stored label and the answer shape from each row's recorded judge reply. Nothing was fetched, no engine was asked anything, and no live tracked prompt was run. Those 55 answer texts are hand authored test inputs written to pin the behaviour of the citation judge, so the mix of shapes in the file is a property of the test suite and not a measurement of what assistants emit. What does carry past the fixtures is the rule that decides whether a rank exists, because that rule lives in the contract rather than in the input, and the same distinction between a setting and a finding governs the [methodology page](https://lantad.co/methodology).

## What can AI rank tracking actually report?

It helps to be exact about what the word rank carries over from search and what it does not. In Google Search Console the position metric is defined, present on every row, and documented: the Search Analytics API describes the field as [average position in search results](https://developers.google.com/webmaster-tools/v1/searchanalytics/query) and leaves the averaging to the report documentation. There is always a number because there is always an ordered results page underneath it. A page is somewhere in that order even when it is somewhere terrible, and a tool that reports nothing for a query is telling you the query did not happen rather than that order did not exist.

An AI answer has no equivalent guarantee. Order is a property of some answers and not of others. When an assistant writes a numbered list of five tools, the brand's place in that list is a fact about the answer, and two tools reading the same answer should agree on it. When the assistant writes three sentences of prose that name two companies without preferring either, there is no order to read, and a position reported for that answer has to have come from somewhere other than the answer. This is the gap between [generative engine optimization](https://lantad.co/glossary/geo) as a practice and search rank as a metric, and it is why the vocabulary of the field keeps reaching for words like presence and share rather than place. The same fork runs through [answer engine optimization](https://lantad.co/glossary/aeo), where the thing being optimised is whether you appear in a composed answer rather than where you sit in a list of ten.

Google has published its own version of this distinction without commenting on it. When it launched the Search Generative AI performance reports in Search Console on 3 June 2026, it listed what the reports show, and the list is impressions, pages, countries, devices and dates. The announcement says the reports give site owners [dedicated views of impressions within generative AI features](https://developers.google.com/search/blog/2026/06/gen-ai-performance-reports) such as AI Overviews and AI Mode, that they are rolling out to a subset of websites, and that additional metrics may be added over time. Average position, which the ordinary performance report carries as a matter of course, is not among them. That is Google declining to report a position for its own AI surfaces, which is a stronger signal about the metric's availability than anything a third party tool can claim about it. The answers Lantad stores and the verdicts it draws from them are visible on [what AI says](https://lantad.co/what-ai-says) and in the public [tracked prompts feed](https://lantad.co/prompts).

## Where a rank comes from in an AI answer

Lantad does not count list items with a regular expression. Each stored answer goes to a judging step that returns a small JSON object, and the instruction for the position key is written out in core/src/tracker.ts as the brand's 1-based rank among the entities the answer recommends, null when the answer is not a ranked or listed recommendation, or the brand is absent. That single clause is the whole of the product's position policy, and the important half is the second one. A null is not an error path or a parsing miss. It is the contract's own answer for an answer that does not rank anything, which means a tracker built on this contract will report no rank for a large class of perfectly good answers, by design.

The reply then passes through a sanitiser before anything is stored, and the rules there are narrow and worth naming because each one exists for a defect the fixtures hold a row for. A position must be a number or the whole reply is rejected. A float is truncated rather than rejected, on the stated reasoning that a clamped number is evidence and a discarded reply is not. The value must be at least 1 and at most 100, a bound held in the JUDGE_POSITION_MAX constant, and a 0 or a negative becomes null on the grounds that rank is 1-based and a zero is not a rank but the absence of one. Last, a position is forced to null whenever the mention verdict is false, with the code's own reason being that rank is the brand's place among recommended entities and an absent brand has no place.

That last rule is the one that connects to a defect this blog has already reported. The mention verdict and the judge's own claim about a mention are not the same thing, and when they disagree the verdict wins. The cost of getting that identity test wrong was measured here before: a first live run reported a 12.6 percent mention rate where [the truth was nearer 1 percent, with eight of nineteen counted mentions being an engine defining a Tagalog adjective](https://lantad.co/blog/nineteen-counted-mentions-about-two-were-the-company). Position inherits that test wholesale, so every improvement or regression in mention identity moves the rank column with it. The same fixture file has been used to audit the neighbouring column, where [a word list graded 3 of these 55 answers non-neutral and all three were wrong](https://lantad.co/blog/ai-brand-sentiment-3-of-55-all-three-wrong).

## What was read on 24 October 2026, and what was not

The population is every row in core/fixtures/tracker-golden/goldens.json, which holds 55. Each row carries an answer text, a list of cited URIs, a recorded judge reply and a hand written label stating whether the brand was mentioned, whether it was cited and at what position. The labels are the expected result after sanitising, which is what makes them the right field to read for this question: they are what the pipeline should store, and the CLI runs the file as a gate against live models to check that it does. The judge replies are the raw material those labels are derived from, and reading both is how the two layers below can be separated.

Four limits apply to everything that follows, and the first is the largest. The 55 answers were written by hand to exercise the judge rather than captured from an engine, so the proportion of list answers to prose answers in this file is a test design choice. Nothing here says prose is more common than lists on the live web, and no figure in this post should be quoted as though it did. What survives the fixture problem is the conditional finding rather than the marginal one: given a list answer that names the brand, a rank appeared, and given a prose answer that names the brand, usually it did not. That conditional is a property of the contract, and the contract ships.

Second, 31 rows is a small base, and the shape cells below are smaller still: one table answer and one comparison answer are single observations and are reported as such rather than as rates. Third, one brand is involved, lantad.co and its aliases, so none of this is a cross brand comparison. Fourth, no claim here is about stability over repeated runs, which is a different question this blog has measured twice from external evidence, finding that [a tracked prompt needed seven runs before its visibility estimate settled](https://lantad.co/blog/ai-visibility-took-seven-runs-per-prompt-to-settle) and setting out [how many prompts an AI visibility measurement actually needs](https://lantad.co/blog/how-many-prompts-an-ai-visibility-measurement-needs). A rank read once from one answer carries all of that variance and none of its error bars, which is the strongest argument against putting a single number on a dashboard at all. The wider study programme this sits inside is on the [research index](https://lantad.co/research).

## 15 of 31 brand mentions carried no rank at all

Of the 55 rows, 31 carry a label saying the brand was named. Of those 31, sixteen carry a position and fifteen carry none. The sixteen positions are not spread thinly across a long tail either: five of them are 1, four are 2, two are 3, two are 4, two are 5 and one is 7. Nothing in the file ranks the brand below seventh, which is itself a property of fixtures written by somebody who needed a handful of plausible ranks rather than a realistic distribution, and is the kind of detail that stops a reader treating the sixteen as a sample of anything.

The fifteen that carried no rank are the finding. Each of them is an answer that names the brand, which means the mention rate counts them, the citation check runs on them, and the sentiment column grades them. Only the rank column has nothing to say. If a dashboard renders that as a dash, the reader learns something true. If it renders it as a zero, or quietly drops those rows from an average, the reader learns something false, and the two renderings are indistinguishable from the outside. That is the practical question to put to any tool in this category, including this one: of the answers where my brand appeared, how many produced a rank, and what did you do with the rest.

Underneath the sixteen there is a second layer worth separating, because it shows the sanitiser doing work rather than the judge. Across the 51 rows whose judge reply is stored as a JSON object, the judge returned a number for position on nineteen. Sanitising kept fifteen of those nineteen and dropped four. One was a 0 and one was a -3, both clamped to null because rank is 1-based. The other two are more interesting: both were a 1 attached to an answer the pipeline reads as no mention, one where the answer writes a name two edits away from the brand and the judge claimed it anyway, the other a competitor only answer where the judge claimed both a mention and a citation. In both the mention verdict overrode the judge and the rank went with it. The sixteenth stored position comes from the four string replies, where one arrived wrapped in a code fence with prose around it and the brace slice still parsed a 3 out of it. Rank is not the only column this kind of mis-attribution reaches, and the related failure of pointing at the wrong company entirely has been counted too, in a finding that [most AI citations point at other companies](https://lantad.co/blog/ai-citations-mostly-point-at-other-companies).

## The shape of the answer decided whether a rank existed

Splitting the 31 by the answer shape the judge recorded makes the pattern unambiguous. Fifteen rows in the file are shaped as a list, twelve of those name the brand, and all twelve carry a rank. Thirty three rows are shaped as prose, seventeen of those name the brand, and four carry a rank. One row is a table and one is a comparison; each names the brand and neither carries a rank. One row is a refusal and one is a definition, and neither names the brand, so neither could.

Twelve of twelve against four of seventeen is not a marginal difference in extraction quality. It is the contract behaving exactly as written, and it means the rank column is reporting on a subset of answers selected by their format. That has an uncomfortable consequence for anybody reading a rank as a trend. If an engine changes how it formats a class of answers, from numbered lists toward flowing prose or the other way, a brand's average rank can move sharply while its actual standing does not move at all. Nobody optimised anything and nobody lost ground. The denominator changed shape. Format sensitivity of this kind is not hypothetical in this field: a controlled study reported here found that [four factors decided the first citation](https://lantad.co/blog/four-factors-decided-the-first-citation), with list position among the treatments rather than among the controls.

The four prose rows that did carry a rank are worth a sentence, because they are not contradictions. A prose answer can still recommend entities in a stated order, and a sentence that says the strongest option is one company, followed by a second and then a third, ranks three things without using a numbered list. So the honest version of the rule is not that prose never ranks, but that prose ranks when it happens to enumerate, and the judge is being asked to notice the difference. That is a reasonable thing to ask a language model and an unreasonable thing to ask a regular expression, which is the argument for the judging step existing at all. It also means the rank column carries model judgement rather than arithmetic, and should be read with the same caution as any other judged field. How little of the rank question is answered by the crawl side is the point of [the comparison between GEO and SEO](https://lantad.co/blog/geo-vs-seo-same-crawl-four-differences).

## What the Visibility Score does with a mention that has no rank

A missing rank has to be turned into a number somewhere, because the position factor is one of four weighted components of the Visibility Score. The weights are settings rather than findings, and they are in core/src/config.ts: mention rate at 0.45, citation rate at 0.25, position factor at 0.20 and the perception factor at 0.10, the last of which is held fixed at 0.5 until a measured perception score replaces it. Nobody measured that position is worth a fifth of visibility. Somebody chose it, and the published score is the consequence of that choice rather than evidence for it.

What the code does with an absence is the part worth reading, because it is the decision the dashboard question above turns on. The position factor is the mean of 1 over position across mentioned runs, and the function's own comment states the rule plainly: a mentioned run with no rank contributes zero while staying in the denominator, so one lucky list placement never outgrades ten unranked mentions. A brand never mentioned at all scores zero for the factor rather than null, on the reasoning that a brand nobody names has nothing to rank. Treated as runs, the 55 fixtures give a position factor of 0.281, which is the sum of the sixteen reciprocals over all 31 mentions. Had the fifteen unranked mentions been excluded from the denominator instead, the same sixteen ranks would have returned 0.544. That is the whole of the difference between the two renderings, in one pair of numbers, on one small set.

Neither 0.281 nor 0.544 is a measurement of lantad.co's standing in anything, and quoting either as one would be exactly the error this post is about. They are what one arithmetic choice does to one fixture set. The reason to publish them anyway is that the choice is invisible in every product in this category, including this one until this paragraph, and a buyer comparing two tools that both report a rank out of ten has no way to find out which convention produced it. The crawl side of the same scanner has had its own weighting opened up, where [972 of 1,419 corpus sites were graded and prose parity took 60.7 percent of every point they lost](https://lantad.co/blog/ai-visibility-score-972-of-1419-were-graded), and the engine coverage behind the tracker has been counted too, finding that [three of the eight engines we ask cannot search the web](https://lantad.co/blog/ai-visibility-tracking-three-of-eight-engines-cannot-search). Where a measurement has to land before it is worth selling is the subject of [how to measure GEO](https://lantad.co/blog/how-to-measure-geo-final-prompt-held-35-6-percent), and what a run costs is on [pricing](https://lantad.co/pricing).

## Questions and answers

**Can AI rank tracking report a position for every answer?**

No. A position only exists where the answer ranks or lists the entities it recommends. Of the 31 answers naming the brand in Lantad's committed fixture set, read on 24 October 2026, 16 carried a position and 15 carried none, and the judge contract in core/src/tracker.ts defines position as null when an answer is not a ranked or listed recommendation.

**Why does an AI rank move when my site has not changed?**

Because the metric is only defined for some answer shapes. Across the fixture set all 12 list answers naming the brand carried a rank against 4 of 17 prose answers, so a change in how an engine formats a class of answers can move an average rank without any change in standing. Repeated sampling matters as well: external work reported here found a tracked prompt needed seven runs before its estimate settled.

**Does Google report a position for AI Overviews and AI Mode?**

Not in the generative AI performance reports. Google's announcement of 3 June 2026 lists impressions, pages, countries, devices and dates for those reports, and says additional metrics may be added over time. Average position, which the ordinary Search performance report carries, is not among them.

**What should a tool do with a mention that carries no rank?**

State the convention. Lantad keeps an unranked mention in the denominator at zero, so its position factor over the 55 fixtures is 0.281 rather than the 0.544 the same 16 ranks would give if unranked mentions were excluded. Either convention is defensible and they produce different numbers, so the question to ask any vendor is which one it uses.

---

Lantad measures whether AI crawlers can actually read a page: it fetches as a non-rendering
crawler, renders as a browser, and reports the gap. Free scan, one URL, no signup.

Method and weights: https://lantad.co/methodology | All pages as markdown: https://lantad.co/md | Crawler policy: https://lantad.co/bot
