{
  "study": "Invisible-character census in Claude model output",
  "version": "1.0.0",
  "runDate": "2026-08-12",
  "question": "Do Claude text outputs contain invisible Unicode characters — zero-width spaces, joiners, byte-order marks, soft hyphens, bidirectional format controls or tag characters — of the kind widely claimed online to be 'the Claude watermark'?",
  "whatThisCannotAnswer": "Whether Anthropic's confirmed statistical text watermark is present. No public detector exists for it, so its presence or absence cannot be measured by us or by anyone else outside Anthropic. This study measures only what is observable in the bytes.",
  "models": [
    { "key": "opus", "id": "claude-opus-5", "generators": 4, "outputs": 32 },
    { "key": "sonnet", "id": "claude-sonnet-5", "generators": 4, "outputs": 32 },
    { "key": "haiku", "id": "claude-haiku-4-5-20251001", "generators": 4, "outputs": 32 }
  ],
  "harness": {
    "interface": "Claude Code CLI, subagent tasks",
    "capturePath": "Model output written directly to disk by the generating process using its file-write tool, with no intermediate copy/paste, clipboard, terminal render or editor step",
    "note": "Generation ran through an agentic harness rather than the claude.ai web interface. If a provider applied invisible characters as a presentation-layer step in a specific product surface, this capture path would not observe it. Sampling-layer marking would be unaffected by the harness."
  },
  "design": {
    "prompts": 8,
    "replicatesPerModel": 4,
    "outputsPerModel": 32,
    "totalOutputs": 96,
    "samplingSettings": "Not controllable through this harness; defaults were used and are not published by the provider"
  },
  "prompts": [
    { "id": "p01-short-factual", "language": "en", "shape": "short factual answer", "text": "In two sentences, explain why the sky appears blue." },
    { "id": "p02-long-essay", "language": "en", "shape": "long prose", "text": "Write a 600-word essay on the history of the printing press and its effect on literacy in Europe." },
    { "id": "p03-code", "language": "en", "shape": "source code", "text": "Write a Python function that merges two sorted lists into one sorted list. Include a docstring and three doctests." },
    { "id": "p04-list", "language": "en", "shape": "list", "text": "List 10 practical tips for reducing household energy use. One line each, no intro." },
    { "id": "p05-spanish", "language": "es", "shape": "prose, non-English", "text": "Explica en español, en unas 200 palabras, qué es la fotosíntesis y por qué importa." },
    { "id": "p06-japanese", "language": "ja", "shape": "poetry, non-Latin script", "text": "日本語で俳句を三つ作ってください。それぞれに季語を必ず入れてください。" },
    { "id": "p07-table", "language": "en", "shape": "markdown table", "text": "Produce a markdown table comparing four programming languages across five attributes." },
    { "id": "p08-dialogue", "language": "en", "shape": "dialogue", "text": "Write a 300-word dialogue between a librarian and a student about how to find primary sources." }
  ],
  "positiveControl": {
    "path": "control/agent-written/positive-control.txt",
    "purpose": "Confirm the capture path preserves invisible characters, so that a count of zero in the corpus means absence in the output rather than loss in transit.",
    "requested": ["U+200B", "U+200C", "U+00AD", "U+00A0"],
    "detected": ["U+200B", "U+200C", "U+00AD"],
    "result": "Three of the four requested characters were emitted and detected, confirming the pipeline preserves zero-width and format characters end to end. The fourth was replaced by an ordinary ASCII space by the generating model, which is itself consistent with the corpus result."
  },
  "results": {
    "outputs": 96,
    "words": 19364,
    "codePoints": 127307,
    "zeroWidthAndFormatCharacters": 0,
    "filesContainingAnyZeroWidthOrFormatCharacter": 0,
    "ideographicSpaces": 30,
    "ideographicSpaceNote": "All 30 occur in Japanese-language outputs, where U+3000 is ordinary Japanese typography, not a hidden mark.",
    "emDashTotal": 68,
    "emDashesPer1000Words": { "claude-opus-5": 2.12, "claude-sonnet-5": 4.59, "claude-haiku-4-5-20251001": 4.04 },
    "curlyQuotesAndApostrophes": 0
  },
  "limitations": [
    "One provider, three model identifiers, one harness, one date. Not a longitudinal study.",
    "96 outputs and 19,364 words is enough to rule out a per-output or per-paragraph invisible marker; it is not enough to rule out a rare probabilistic marker appearing in well under 1% of outputs.",
    "Generation ran through the Claude Code CLI. A presentation-layer marker applied only in another product surface would not be visible here.",
    "The corpus is machine-generated for this study rather than sampled from real user sessions, so prompt distribution is ours, not the world's.",
    "Nothing here measures Anthropic's statistical text watermark, which remains undetectable to the public."
  ],
  "reproduce": "node scan.mjs [corpusDir] [outDir] — dependency-free Node script, reads corpusDir/<model>/*.txt.",
  "license": "Data and code released for reuse with attribution and a link back to https://www.aiwatermarkremoval.com/lab/claude-invisible-characters"
}
