Two samples, fifteen signals, one gap.
Every model leaves habits in its output: how long its sentences run, how much it hedges, how it formats a list, whether it reaches for a dash. Put two samples side by side and this bench measures each habit and reports how far apart they are. It measures style. It does not identify a model, and it says so everywhere it matters.
Mean divergence 62 per cent. The two samples differ across most signals. That is consistent with different models, and also with the same model under a very different prompt or system instruction.
Signal by signal
Largest gap first. The bar is the gap as a share of that signal's own scale, so a gap of one hundred per cent means the two samples are as far apart as that signal can read.
| Signal | A | Gap | B | Higher |
|---|---|---|---|---|
Words per sentenceMean sentence length, which is the single most stable style signal there is. | 21.00 | 100% | 6.52 | A |
HedgingPhrases like it depends, generally, typically, may and might, per 100 words. | 7.41 | 100% | 0.00 | A |
Importance phrasingPhrases like it is important to note, keep in mind and note that, per 100 words. | 3.70 | 100% | 0.00 | A |
Closing offerClosers like let me know, feel free and happy to help. Counted, not rated. | 3 | 100% | 0 | A |
Words per paragraphHow much it writes before breaking. Block writers differ from list writers. | 63.00 | 69% | 21.43 | A |
Conjunction openersSentences that begin with And, But or So, as a share of all sentences. | 0% | 17% | 4% | B |
Lexical diversityDistinct words over the first 300 words. Repetitive text scores low. | 60% | 9% | 62% | B |
Characters per wordVocabulary weight. Formal and technical writing uses longer words. | 4.54 | 4% | 4.59 | same |
| Absent from both samples. These carry no evidence of a difference, so they are listed for completeness and left out of the reading. | ||||
Bold spansMarkdown bold spans per 100 words. Emphasis habits are very distinctive. | 0 | 0% | 0 | none |
List itemsList items per 100 words, counting both bullets and numbers. | 0 | 0% | 0 | none |
HeadingsMarkdown headings per 100 words, so a long answer is not penalised. | 0 | 0% | 0 | none |
Dash rateEm dashes and en dashes per 100 words. A loud signal when it is present. | 0 | 0% | 0 | none |
SemicolonsSemicolons per 100 words. Most writing uses none at all. | 0 | 0% | 0 | none |
Exclamation marksExclamation marks per 100 words. | 0 | 0% | 0 | none |
Curly quotesShare of quotation marks that are typographic rather than straight. A formatting habit, not a style one. | 0 | 0% | 0 | none |
What separates them
top four- Words per sentenceA shows longer sentences.
- HedgingA shows more hedging.
- Importance phrasingA shows more signposting.
- Closing offerA shows more offers to continue.
Where they agree
closest three- Characters per word4 per cent apart.
- Lexical diversity9 per cent apart.
- Conjunction openers17 per cent apart.
What this measures, and what it cannot
Fifteen signals, each measured from the text alone, each judged against its own scale so no signal dominates. Deterministic: the same two samples always give the same reading.
What it cannot see
- It cannot identify a model. Style is evidence, not identification, and the same model under a different system prompt can look further apart than two different models on the same prompt.
- It cannot see tokenizer behaviour, log probabilities, sampling parameters, or anything about the weights. Those are inside the provider, not in the text.
- It cannot separate a model change from a prompt change, because the prompt is not part of the sample. Run the same prompt on both sides to make the comparison mean something.
- It cannot read a short sample. Below about 120 words the text is mostly topic rather than style, and the reading says so instead of guessing.
What would actually settle a substitution claim
- Read the response payloadMost APIs name the model and the version that served the request. That is a fact rather than an inference, so check it before measuring anything.
- Compare log probabilitiesIf the provider returns token logprobs, run one prompt and compare the distributions. Sampling settings move the mean; a different model moves the shape.
- Repeat one request at temperature zeroA provider that routes between models shows more spread across repeated identical calls than one that does not. Compare the spread, not the individual outputs.
- Probe the tokenizerWhere the API reports token counts, send a string that different tokenizers split differently and compare the count it returns.
- Ask, and get it in writingA substitution claim is a contractual question. The answer is in writing or it is not an answer, and no amount of stylometry substitutes for it.
The specimens that ship with this bench were written for calibration. They are not captured outputs from named models, and no entry here claims to be.