Notizen
The top-ranked watermark checker’s “strategy report” is a hardcoded string
A confidence figure of 85%, a repeating pattern of “1, 1”, and a paragraph verdict that is the same sentence every time — read from the shipped bundle, and what a spacing statistic could actually support.
Veröffentlicht · 6 Min. Lesezeit
What the page shows you
Search for a way to check text for AI watermarks and the first organic result gives you a paste box, an Analyze button, and a report. The report has a real part and a confident part. The real part is a count of hidden characters and a breakdown by type — that is a measurement, and you can verify it yourself by looking at the codepoints. The confident part is a per-paragraph “strategy report”, a combined confidence percentage, and a note about a repeating pattern.
The per-paragraph lines read like this: Paragraph 1: Paragraph 1 has unusually consistent spacing (low variance). The confidence figure reads Combined Confidence: 85%. The pattern line reads Repeating pattern detected: 1, 1.
Three things are worth noticing before opening anything. The paragraph line prints its own label twice, which is what a template does when it interpolates a heading into a sentence that already contains it. The percentage is a round number. And the pattern 1, 1 is the least informative pattern a list of integers can contain.
What is in the shipped bundle
The page is a client-side application, so the code that produces those lines is downloaded to your browser and can be read. These strings appear in it as literal children:
<li>Paragraph 1: Paragraph 1 has unusually consistent spacing (low variance)</li>
<li>Paragraph 2: Paragraph 2 has unusually consistent spacing (low variance)</li>
Combined Confidence: {t.confidence||85}%
Repeating pattern detected: {t.patterns?.join(", ")||"1, 1"}Two of those are JavaScript expressions with fallbacks, and the fallbacks are the part worth reading carefully.
{t.confidence||85} uses the logical OR operator. It renders t.confidence when that value is truthy, and renders the literal 85whenever it is missing, undefined, or zero. So a report can display “Combined Confidence: 85%” without any confidence having been computed for your text — and a genuinely computed confidence of zero would also display as 85, because zero is falsy.
{t.patterns?.join(", ")||"1, 1"} does the same thing with optional chaining in front: if there is no patterns array at all, the expression short-circuits to undefined and the literal string “1, 1”is printed after “Repeating pattern detected:”.
The two <li>strings have no expression in them at all beyond the paragraph number. “has unusually consistent spacing (low variance)” is fixed text: it is the same sentence whatever you paste.
What this establishes, and only this: the interface can print a confidence figure, a repeating pattern and a per-paragraph spacing verdict that were not derived from your text. It does not establish that it always does — some code path may compute a value — and it says nothing about why the code is written that way. Fallback values are an ordinary defensive pattern. The problem is not the fallback; it is that the surface presents it as a measurement.
What “unusually consistent spacing” would have to mean
Set the code aside and take the claim at face value. Suppose a tool really did measure the variance of spacing within a paragraph. What would it find?
In ordinary digital prose, exactly one U+0020 between words, every time. Word processors collapse runs. Keyboards produce one space per press. Web forms strip the rest. The variance of that distribution is zero, or as close to zero as makes no difference, for essentially every text that has been typed by a person on a computer in the last thirty years — and for every text produced by a language model, for the same reason.
A statistic that takes the same value for almost every input cannot separate inputs. To be evidence for a conclusion, a measurement has to come out differently for the cases you are trying to tell apart. “Unusually consistent spacing” describes the normal condition of written text, which is why it can be printed for any paragraph without embarrassment: it will not be visibly wrong.
Notice too what is absent. No variance figure is shown, no threshold for “unusually”, no statement of what was measured — space-run lengths, sentence lengths, line lengths. A number you cannot check is not a finding.
What spacing analysis can honestly show
There is real, checkable signal in spacing. It is just not about who wrote the text — it is about whether something was encoded into it. Three published steganography schemes use spacing as the carrier, and all three are detectable exactly, with a count and a position rather than a percentage:
- Trailing whitespace (the SNOW scheme). Spaces and tabs at the end of a line encode bits — one bit per character, eight per line. It is invisible in every renderer and completely obvious to a counter: report the trailing whitespace on each line and the pattern is either there or it is not.
- Single versus double space. One space for a zero, two for a one. The measurement is the count of double spaces inside lines and where they fall. A document typed by someone who learned two spaces after a full stop looks different from a payload — and you can see the difference, because the positions are shown.
- No-break space versus ordinary space. U+00A0 for a one, U+0020 for a zero. These are different codepoints, so this is not statistics at all: it is a lookup, and the answer is exact.
Each of those produces a claim that can be falsified by looking. And each of them stops short of the thing the confidence percentage implies: even a perfectly detected payload tells you that data was hidden in a text, not who or what produced the words around it.
How Ghostchars reports instead
This site takes the position that if a number cannot be shown to you, it should not be printed. So there is no score, no confidence percentage and no verdict about authorship anywhere in the product.
What you get instead is the evidence:
- Every finding as a row: 1-based line and column, the codepoint, its Unicode name, its category, and what happened to it — removed, replaced, kept because it is load-bearing, or found but not targeted by the options you chose.
- A summary that is three counts and nothing else. Counts of rows you can scroll through.
- A prose-habits report that measures the editable habits behind “this reads as generated” — sentence-length variation, tell words, stock transitions, em-dash density, the absence of specifics — and emits no probability, because the habits are worth editing whoever wrote them.
- A page that says what the tool cannot do, next to the page that says what it can. Statistical watermarks live in word choice; stylometry lives in vocabulary and rhythm; neither is a character, and no character tool touches either.
That is a narrower product than a confidence percentage. It is also the only version of it that survives someone checking.
Notes
1. The result described is the first organic result for 'AI watermark detector' on that date (2026-08-17). The strings quoted above were read from the client bundle that page served on that date. Sites change; if you are reading this later, check the bundle yourself before repeating the claim.
2. No conclusion is drawn here about intent. The observation is about what the code can render, and about what a spacing statistic can support.
Korrekturen
Wenn hier etwas falsch ist, eröffne ein Issue im öffentlichen Repository – es wird an Ort und Stelle korrigiert, und die Änderung bleibt in der Historie sichtbar.