A tool that reports “no match” has said one of two very different things. We looked for your words and did not find them. Or: we could not have found your words.
Both are true sentences. Only the first is a result. This page is the list of every way the second one can happen, because a tool that blurs them is more dangerous than one that finds nothing at all — it turns a limit of the software into a reassurance about the world.
A shared 10-gram — ten identical words in a row — between a benchmark and a corpus is a fact you can display side by side. Authorship is a statistical claim about a distribution. Both are worth building; only one of them can be handed to a skeptic who then agrees.
Index the benchmark, stream the corpus once, show every match with its surrounding text. 7.0 MB/sec end to end on real gzipped corpus shards, in the browser or on the command line.
Human-authored or machine-generated, measured against named reference corpora. Honest detection floor is 50% contamination, and the four reasons are known.
Which benchmarks appear in which public corpora, reproducible from the same files, growing more discriminating with every corpus added.
Every one of these is a limit Ingot knows about and reports. The failure
this project actually fears is the limit nobody wrote down. Full detail, with the
measurements, in docs/coverage.md.
Ingot matches word n-grams, and finding a word means knowing where it ends. Chinese, Japanese, Thai, Lao, Khmer, Burmese and Tibetan are written without spaces between words, so that rule does not apply to them. The consequence is not degraded accuracy, it is total: a several-hundred-character Japanese essay tokenizes to one token, produces no 10-gram, and cannot be matched against anything. Reports name these items separately from short ones, and say the scan could not look rather than that it looked and found nothing. Korean is not affected — modern Korean puts spaces between words.
A text shorter than n tokens produces no n-gram at all. At the
default n=10, a nine-word sentence cannot be matched by construction. Every report
names these items rather than counting them as checked.
The tokenizer keeps the ASCII apostrophe inside a word and treats the typographic one as a separator, and over 126,578 C4 documents, 39.1% use a word-internal curly apostrophe, 30.0% an ASCII one. Normalising smart quotes is what every CMS and scraper does. The damage is local, so length decides it: verbatim copies still found after re-quoting are 68.0% at 10–24 tokens and 100% above 25.
C4 is not the April 2019 web crawl. It is what survived a documented cleaning pass over it — a blocklist, a rule discarding any page containing a curly brace as code, a terminal-punctuation requirement, a five-line minimum. Text that was crawled and then discarded is absent for reasons that have nothing to do with who trained on it, and a report that stayed quiet about that would be lying with a true sentence.
A page CommonCrawl never collected cannot be in any corpus derived from it. Two rules learned the hard way: a domain check can rule a platform out but can never clear a person, because a crawled host is not a crawled writer. And the index is sorted by URL, so sampling only its first page is biased toward whatever sorts first.
The exact tier finds verbatim overlap. A paraphrase is not verbatim and it will not be found. A second tier exists for edited copies, needs the source text, and reports why it is unavailable rather than reporting zero. Its measured recall is published, and it is not 100%.
The rule this exists to enforce: before any report goes out, its null results have to survive one question — could this scan have found the thing it says it did not find? If the answer is no, the report says so in the same place and the same size as the result. A caveat in a footnote under a green checkmark is a way of being technically honest and practically misleading.
Each of these was a bug first, caught by running the experiment and reading the output instead of trusting it.