fragRoger · Analysis · 15 August 2026

Deutsch

Claude's watermark: statistical word choice & a quick check

Anthropic has been marking Claude's texts invisibly since 2 August 2026. Not a hidden character, but a skewed word choice that is only provable with the secret key. Below you find a detector to try out, then the explanations, and a skill for writing more human text.

green list / red listz-testSynthID familyEU AI Act Art. 50(2)

First, the terminology

Why «watermark» is a misleading word here

The term suggests a physical feature like the one on a banknote, visible to the naked eye. Anthropic describes the opposite: the watermark is entirely indistinguishable for readers and changes neither the meaning nor the quality of the text.

There is no string to search for, no suspicious spacing to measure and nothing a manual inspection could surface. The actual mechanism manipulates the source of randomness the model uses to pick between equivalent candidate words — «fast», «quick» and «rapid» in a context where all three mean the same thing.

Text forensics in the browser

Check a text

The same logic as the Anthropic-style module, executed right here. Please note: without Anthropic's real key this is a methodology demo, not proof of Claude authorship. A genuine Claude text is therefore not detected here — the test only measures bias towards the key set below.

The self-test generates text watermarked with exactly this key — the detector must flag it. That proves the statistics work, and that unremarkable results on foreign texts are not a bug but the consequence of not knowing the key.

Important: in the word-choice test the AI sample also stays unremarkable, and that is correct. This test only measures whether the word choice matches the configured key — not writing style. To see the difference, switch to «Typical AI phrasing». The AI sample also contains invisible characters for the third check.

Three checks, three different traces

Counts phrases that language models use far more often than people do. A stylistic clue, not proof.

Evidence index
No reliable assessment

The text is too short for a reliable assessment. The index becomes meaningful from roughly 150 words.

Reliability: not assessable · 35 words · 0 phrase hits

Index 0–100

Features and evidence points

Sentence-length variation

Low values mean similarly long sentences — a typical model pattern.

Stylometry · value 0.03 · low = machine-like

3/3

Generic phrasing

Share of detected generic or formulaic phrasing.

Discourse patterns · value 0.0 % · high = machine-like

0/3

Standardised transitions

Share of sentences with typical transition or summary formulas.

Discourse patterns · value 0.0 % · high = machine-like

0/3

Repeated sentence openings

Share of sentences starting with the same two words.

Stylometry · value 0.0 % · high = machine-like

0/3

Repeated word sequences

Share of repeated three-word sequences.

Discourse patterns · value 0.0 % · high = machine-like

0/3

Lexical diversity

Low values can indicate a uniform vocabulary.

Stylometry · value 0.83 · low = machine-like

0/3
Stylometry · 12.5Discourse patterns · 0.0

Detected stock phrases

None of the known AI stock phrases from the text-humanizer skill were found. That is a style finding, not proof of origin.

What this result does not say

  • The thresholds are example values from the reference script and are not calibrated against an own reference corpus.
  • The token-statistical features (surprisal, entropy, top-k shares) are missing because they would require a locally run language model.
  • The result describes statistical similarity and proves neither authorship nor a specific model.
  • Stock phrases are a style signal, not proof of origin. People write «in conclusion» or «moreover» too, and a well-edited AI text stays clean here.

Orientation

Three levels of AI traces

«AI watermark» is an umbrella term for three technically unrelated levels. Mixing them up means looking in the wrong place.

Trace 1 · Typical AI phrasing

Formulations and sentence patterns that language models use far more often than people do. A stylistic clue, not proof.

Testable here · indication, not proof

Trace 2 · Biased word choice (the watermark)

While writing, the model favours a secret word list. No special character in the text, only a frequency anomaly.

Methodological only · the key is not public

Trace 3 · Invisible characters in the text

Zero-width characters, control characters, variation selectors and look-alike letters that sit in the text but are never rendered.

Testable here · unambiguous hits

The checker above covers traces 1 and 3 verifiably, and trace 2 only as a method, because Anthropic's key is not public. File metadata is out of scope here and is handled by the text-humanizer skill.

The technical mechanism

Green list and red list

Anthropic confirms that Claude's approach is a variant of Google DeepMind's SynthID Text, which traces back to a design idea proposed by Scott Aaronson in 2022. This family of methods, which also includes the KGW method published in 2023 (Kirchenbauer, Geiping, Wen et al.), works as follows:

  1. 01At every generation step the model holds several candidate tokens with almost identical probability.
  2. 02A secret key is combined with the preceding tokens and hashed pseudorandomly to split the entire vocabulary into a green list and a red list.
  3. 03Green-list tokens receive a small positive bonus on their selection probability before the model draws the next token.
  4. 04That bonus only takes effect where candidates were near-equivalent anyway; it never overrides a strong model preference, which is why grammar and factual content stay unchanged.
  5. 05Across a long text the bias accumulates into a statistically measurable pattern, even though every individual word choice looks unremarkable on its own.

Formally, a watermark-free model samples the next token w_t from a conditional distribution P_t over the vocabulary W. A watermarked model additionally couples that choice to a pseudorandom variable ζ_t known only to the verifier, so that w_t = S(P_t, ζ_t), where S is a deterministic decoder function.

Detection

Nothing but a significance test

Detection runs in reverse: with the same secret key the verifier applies the same hashing scheme to the text under review, counts the share of tokens falling into the green list and compares that share with the value expected under pure chance, typically 50 percent at γ = 0.5. If the observed share deviates significantly upwards, the text is considered likely Claude-generated. The test works without access to the model, but it strictly requires the key.

Factor
Effect on the signal
Copy, paste, reformat
Survives — the words themselves are unchanged
Translation into another language
Signal disappears entirely, the token sequence is rebuilt
Heavy paraphrasing
Usually destroyed, every word choice is made anew
Light copy-editing
Often partially survives
Very short excerpts
Below the detection threshold, unreliable (< ~75–100 words)
Code or literal quotations
Low entropy, barely any usable signal

A positive hit only proves that Claude was involved in producing the text, not who supplied the content or the ideas. A self-written text that Claude merely proofread or translated can trigger exactly the same mark as a fully AI-generated one. Conversely, the absence of a mark is no proof of human authorship.

Current status

Public detection does not exist yet

At the time of the announcement Anthropic had not released a public detection API; the company is working on tools for users and third parties without a binding timeline. Without the real Anthropic key the original procedure cannot be rebuilt or verified externally.

Commercial «AI detectors» that already claim to spot Claude text instead rely on generic stylistic analysis: predictable phrasing, uniform sentence rhythm, recurring structure. Michael Wade's analysis explicitly classifies that as a fundamentally different and far less reliable technique. The regulatory driver behind the measure is Article 50(2) of the EU AI Act, which Anthropic formally signed up to via the Code of Practice.

Build it yourself

A text checker on the same principle

The underlying principle is openly documented and can be rebuilt for your own purposes, for instance to watermark self-hosted LLM pipelines, even though Anthropic's concrete key stays out of reach. The Python module below implements the core logic: pseudorandom green-list generation per preceding token plus key, and a z-test detector that compares the observed hit rate against the chance expectation.

checker.py
"""
Claude / LLM Text-Watermark Checker (KGW-Stil / Green-Red-List)
-----------------------------------------------------------------
Implementiert das statistische Grundprinzip, das Anthropic fuer
Claude-Wasserzeichen beschreibt (SynthID-Text / KGW-Familie):
Bei jedem Generierungsschritt wird das Vokabular pseudorandom -
gesteuert durch einen Secret Key + die vorherigen Tokens - in eine
"Green List" und eine "Red List" gesplittet. Ein wasserzeichen-
behaftetes Modell bevorzugt statistisch die Green-List-Tokens.
Ohne den Key ist dieser Bias fuer Menschen unsichtbar, aber mit
genuegend Text statistisch nachweisbar (z-Test).

WICHTIG: Ohne Anthropics echten Secret Key kann dieses Skript
Claude-Wasserzeichen NICHT verifizieren. Es demonstriert die
Methodik und kann fuer eigene, selbst erzeugte Wasserzeichen
(z.B. in eigenen LLM-Pipelines) produktiv genutzt werden.
"""

import hashlib
import math
import re
from typing import List, Dict, Optional


def _hash_token(seed_str: str, token: str) -> int:
    return int(hashlib.sha256(f"{seed_str}:{token.lower()}".encode()).hexdigest(), 16)


def get_green_list(prev_token: str, key: str, vocab: List[str], gamma: float = 0.5) -> set:
    """Pseudorandomer Split des Vokabulars in Green/Red, seeded durch prev_token + Key."""
    seed_str = f"{key}:{prev_token.lower()}"
    scored = sorted(vocab, key=lambda w: _hash_token(seed_str, w))
    n_green = int(len(vocab) * gamma)
    return set(scored[:n_green])


def tokenize(text: str) -> List[str]:
    """Einfache Wort-Tokenisierung (fuer Produktionseinsatz: echten LLM-Tokenizer verwenden)."""
    return re.findall(r"[A-Za-zÀ-ÿ]+(?:'[a-z]+)?", text)


def detect_watermark(
    tokens: List[str],
    key: str,
    gamma: float = 0.5,
    vocab: Optional[List[str]] = None,
    z_threshold: float = 4.0,
) -> Dict:
    """
    Fuehrt den z-Test auf der Green-List-Traefferquote durch.

    - gamma: Erwarteter Anteil Green-Tokens unter Nullhypothese (kein Wasserzeichen).
    - z_threshold: Klassischer Schwellenwert (~4.0) fuer "wahrscheinlich wasserzeichenbehaftet".
    """
    if vocab is None:
        vocab = list(set(t.lower() for t in tokens))
    if len(tokens) < 2:
        return {"error": "Zu wenige Tokens fuer verlaessliche Erkennung (mind. ~75-100 empfohlen)."}

    green_hits = 0
    n = 0
    for i in range(1, len(tokens)):
        prev_tok, cur_tok = tokens[i - 1], tokens[i]
        green = get_green_list(prev_tok, key, vocab, gamma)
        if cur_tok.lower() in green:
            green_hits += 1
        n += 1

    observed_frac = green_hits / n
    se = math.sqrt(gamma * (1 - gamma) / n) if n > 0 else 0
    z = (observed_frac - gamma) / se if se > 0 else 0.0
    p_value = 0.5 * math.erfc(z / math.sqrt(2))

    return {
        "tokens_tested": n,
        "green_hits": green_hits,
        "observed_fraction": round(observed_frac, 4),
        "expected_fraction_null": gamma,
        "z_score": round(z, 3),
        "p_value_one_sided": round(p_value, 6),
        "likely_watermarked": z > z_threshold,
        "reliability_note": (
            "Ausreichend Text (>=100 Woerter empfohlen)."
            if n >= 100 else
            "Warnung: Textmenge unter empfohlenem Minimum, Ergebnis unsicher."
        ),
    }


def check_text(text: str, key: str, gamma: float = 0.5) -> Dict:
    """High-Level-Funktion: Text -> Tokenisierung -> Watermark-Check."""
    tokens = tokenize(text)
    return detect_watermark(tokens, key, gamma=gamma)


if __name__ == "__main__":
    # Beispieltext (menschlich verfasst, kein echtes Anthropic-Wasserzeichen)
    demo_key = "beispiel-secret-key"
    demo_text = (
        "Der Regen fiel leise auf das Dach, waehrend die Katze am Fenster sass "
        "und nach draussen schaute. Es war ein ruhiger Nachmittag, an dem nichts "
        "Aussergewoehnliches geschah, ausser dem gleichmaessigen Klang des Wassers."
    )
    result = check_text(demo_text, demo_key)
    for k, v in result.items():
        print(f"{k}: {v}")

For every text the detector returns the number of tokens tested, the green-list hit rate, the z-score and a one-sided p-value. As a rule of thumb from the literature, a z-score above roughly 4 is strong evidence of a watermark, while below 100 words reliability drops sharply. Production use against real models additionally requires the exact tokenizer of the target model instead of naive word tokenisation, the provider's actual secret key, plus knowledge of the gamma parameter and of the context window size used for hash seeding.

On top of that, the module ki_text_evidenz.py is available for download. It is deliberately not a percentage detector but a transparent evidence key: measurable features score 0 to 3 points each, grouped and weighted into an index with a stated reliability. The «typical AI phrasing» mode above uses exactly that logic — minus the token-statistical features, which would require a locally run language model.

Practice

The matching skill

If you need the other direction, that is checking and removing provenance marks in your own files, my skill for that lives on skills.fragroger.ai.

Remove multi-vendor AI provenance marks

  • Style · typical AI phrasing, defused by rewriting
  • Word choice · statistical text watermarks
  • Characters · invisible characters in the text
  • Files · C2PA, EXIF, XMP and container metadata in PNG, JPEG, WebP, SVG, PDF, DOCX, ODT, HTML, MD

Covers Claude, Gemini and the SynthID class, OpenAI provenance and sampling marks of open LLMs. Invoked via /remove-ai-marks (alias /remove-claude-marks).

View the skill: text-humanizer

Intended for your own content, for privacy, hygiene and research. A cleaned text is no proof of human authorship — and should not be sold as one.

Orientation

Further information

Related approaches

Google DeepMind runs a similar sampling watermark with SynthID Text, on top of SynthID for image, audio and video. OpenAI has built a text watermark but has not shipped it.

Provenance instead of watermarks

C2PA, also known as Content Credentials, attaches cryptographically signed metadata to files. That is robust against rewriting but does not survive copy-pasting plain text.

Attacks from the literature

Paraphrase attacks, translation round-trips and spoofing are well documented. Increasing the green-list bias for robustness lowers text quality — a direct trade-off.

False positives

The z-test is a statistical test, not a proof. With short texts, lists, code or fixed phrasing the risk of misclassification rises sharply.

Practice for schools and HR

A detector result alone carries no sanction. It works as a reason to talk, combined with process evidence such as version history, drafts and sources.

FAQ

Frequently asked questions

Can Claude's watermark be detected without Anthropic's key?

No. The statistical test only works with the secret key that splits the vocabulary into a green and a red list. Without it, a genuine Claude text looks statistically unremarkable.

Does translating or rewriting a text remove the watermark?

Translation destroys the signal completely because the token sequence is regenerated. Heavy paraphrasing usually destroys it as well; light copy-editing often leaves part of the signal intact.

How long does a text have to be for detection to be reliable?

Roughly 75 to 100 words is the lower bound. Below that the z-score is dominated by noise and the result cannot be trusted.

Is a positive detection proof of AI authorship?

No. A hit shows that the model contributed to the text, not who supplied the ideas. A human-written text merely proofread by Claude can trigger the same mark, and a missing mark proves nothing either.

Evidence

Sources