Zerowidth CleanerMeasured guides

CLAUDE WATERMARK REMOVER · CALLBACK TEST

Are removed-character details sorted by code point?

No. In these fixtures, details follow the order in which each removable character first occurs. Reversing the input reverses the detail entries.

Tested 28 October 2026 · Synthetic fixtures · Minimal DOM

What the test establishes

Both strings contain two word joiners and one zero-width space. The totals match, but the first distinct character encountered differs. The recorded list reflects the insertion order of the count map. Comparing list position alone across two runs can be misleading; compare the explicit U+ code point and its count instead.

Reproduce the observation

Save tested-app.js and reproduce.cjs together, then run node reproduce.cjs. Compare its output with the recorded observation. The harness executes the actual homepage callback in a minimal DOM and records its resulting field values and method calls. File-like objects and clipboard responses are controlled substitutes. Runtime: v24.22.1. No submitted text or genuine Claude output is used.

{
  "first": {
    "source": "⁠​⁠",
    "result": "",
    "status": "Removed 3 invisible characters",
    "inputCount": "",
    "resultCount": "0 characters",
    "copyDisabled": false,
    "details": [
      {
        "children": [],
        "textContent": "Removed characters:"
      },
      {
        "children": [
          {
            "children": [],
            "textContent": "2 (U+2060) × 2"
          },
          {
            "children": [],
            "textContent": "1 (U+200B) × 1"
          }
        ],
        "textContent": ""
      }
    ],
    "writes": [],
    "focused": false,
    "selected": false
  },
  "second": {
    "source": "​⁠⁠",
    "result": "",
    "status": "Removed 3 invisible characters",
    "inputCount": "",
    "resultCount": "0 characters",
    "copyDisabled": false,
    "details": [
      {
        "children": [],
        "textContent": "Removed characters:"
      },
      {
        "children": [
          {
            "children": [],
            "textContent": "1 (U+200B) × 1"
          },
          {
            "children": [],
            "textContent": "2 (U+2060) × 2"
          }
        ],
        "textContent": ""
      }
    ],
    "writes": [],
    "focused": false,
    "selected": false
  }
}

Capability boundary

Only these two synthetic short inputs were measured. List order is not a severity score, origin indicator or watermark classification. This test checks diagnostic presentation in the callback and does not verify screen-reader reading order or the visual appearance of the list in a browser.

This Claude watermark remover edits a small selected character set. These callback observations do not establish authorship, detector scores, statistical-watermark removal or end-to-end browser behavior. For real work, keep the original and compare the exact result at its destination.

Primary material and next step

The tested first-party source snapshot and complete harness are the primary material for this page. For broader scope, read invisible Unicode versus AI watermarks, or return to the cleaner.