Build1 publisher3 min readPublished
Gemini put a scraping vendor under a CLI that never called it
The CLI does generative engine optimization, but GEO means geographic across most of the indexed web, so a model given only the name picked the wrong sense and then supplied a vendor to fit it. Closing the gap took three files.
The Engineer · Build desk

What happened
- A comparison prompt against Gemini described the CLI its maintainer runs as a "Local SEO & AI Indexing" tool built on top of Scrapeless, a product that appears nowhere in the repository.
- The product uses GEO for Generative Engine Optimization, but most of the indexed web uses GEO for geographic, including repositories that pair the two senses with SEO and AI in one sentence.
- Prompts that already contained open-source, CLI or Python got a correct description of the same product from the same model in the same week.
- The maintainer put the expanded name next to the brand in the hero paragraph, the meta description and two JSON-LD nodes, and nowhere else.
- The expansion already appeared in the README, the package description and llms.txt, so the maintainer's diagnosis is adjacency to the name and not missing coverage.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- exposure A product whose category abbreviation collides can be handed a supplier relationship it never had, and the vendor named in the output has no part in the exchange either.
- cost The disambiguation is paid for out of character budgets that are already full, so whoever owns the templates surrenders copy that was selling something else.
- constraint Surfaces with hard caps cannot carry the expansion at all, so a brand whose full name is much longer can only be disambiguated where there is slack.
- contradiction The score the maintainer tracks barely moved, which means a citability metric will not tell an operator whether the naming failure has stopped.
A model reading a bare GEO with nothing nearby to disambiguate has two live readings, and according to the maintainer's post the geographic one has vastly more mass behind it [6]. Repositories describe themselves with phrases like "SERP monitoring and GEO tracking" and "geographic research and AI indexing", putting GEO and geographic in the same sentence as SEO and AI [5]. Pick the geographic branch and the summary needs a vendor to match, so the model attached whichever product occupies the local-SEO-plus-scraping space [7].
The post's framing is that the cause is an ambiguity you can close in three files [21]. The hero paragraph now carries a full sentence saying what the tool is, in the first block of body text [9]. That also satisfied an entity-disambiguation check, which wants a definition sentence with a subject, a copula and a category; the page did not have one before [10].
In the JSON-LD graph, Organization already carried the full name while WebSite and WebApplication carried the bare brand [12]. A model walking the graph would hit two nodes that reopen the ambiguity the hero paragraph had just closed. Both now carry the expansion [12].
The character budgets decided the rest. The meta description was already at its limit, so the expansion went in only after the list of supported engines came out; it sits at 152 characters against the 160 the project's tests enforce [11], eight characters of slack [18]. Titles sit at 57 characters against a 60-character cap, and the expansion adds nineteen [13]. That is 76 characters, sixteen over. Titles stayed as they were [13].
The before-and-after figure in the post is a citability score measured on the built HTML, and it moved two points; the post says a definition sentence is one signal among many and the page was already reasonable on most of them [15]. The post does not report what the no-context prompt returns after the change [20]. So the evidence that the three files stop Gemini naming Scrapeless is one model's behaviour before the fix, and a two-point score after it.
For this failure to reproduce on someone else's product, two conditions have to hold. The abbreviation has to have a competing sense with more corpus mass than the intended one [6], and that competing sense has to leave a vendor-shaped slot the model can fill [7]. GEO has both, which is why the wrong branch produced a named dependency instead of vague copy [1].
The check the post proposes costs one prompt: ask a model to describe the product with no context beyond the name, and see which sense it resolves to [16]. The output that started this was a "Local SEO & AI Indexing" tool, built on top of Scrapeless, and the repository has no Scrapeless dependency, no API call and no mention of it [1][2].
What to watch
- Whether the no-context prompt now returns the correct category, and no Scrapeless, when re-run against Gemini.
- Whether other assistants resolve the bare brand the same way; the report covers one model in one week.
- Whether the 60-character title cap gets renegotiated if the bare brand keeps resolving to geographic.