Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does lowercasing a Greek word one character at a time change sigma?

Whole-string lowercasing of ΟΣ produces ος in our runtime, while lowercasing each code point produces οσ. Both approaches agree on ΟΣΑ. Cleanup removes the selected marker but does not choose a casing algorithm.

Tested October 16, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked Greek word

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked Greek word
direct string / keep / invisible true
"Ο​Σ"
U+039F U+200B U+03A3
"ΟΣ"
Removed 1 invisible character
{"whole":"ο​ς","perCodePoint":"ο​σ","wholeCodepoints":["3bf","200b","3c2"]}
{"whole":"ος","perCodePoint":"οσ","wholeCodepoints":["3bf","3c2"]}
Final sigma
direct string / keep / invisible true
"ΟΣ"
U+039F U+03A3
"ΟΣ"
No selected invisible characters found
{"whole":"ος","perCodePoint":"οσ","wholeCodepoints":["3bf","3c2"]}
{"whole":"ος","perCodePoint":"οσ","wholeCodepoints":["3bf","3c2"]}
Nonfinal sigma
direct string / keep / invisible true
"ΟΣΑ"
U+039F U+03A3 U+0391
"ΟΣΑ"
No selected invisible characters found
{"whole":"οσα","perCodePoint":"οσα","wholeCodepoints":["3bf","3c3","3b1"]}
{"whole":"οσα","perCodePoint":"οσα","wholeCodepoints":["3bf","3c3","3b1"]}
Lone sigma
direct string / keep / invisible true
"Σ"
U+03A3
"Σ"
No selected invisible characters found
{"whole":"σ","perCodePoint":"σ","wholeCodepoints":["3c3"]}
{"whole":"σ","perCodePoint":"σ","wholeCodepoints":["3c3"]}

Whole-string and isolated-character mappings see different context

The final-sigma control consists of capital omicron followed by capital sigma. Calling toLowerCase on the whole string returns omicron followed by final sigma, U+03C2. Mapping toLowerCase independently over code points returns ordinary sigma, U+03C3, in the second position. The marked Greek fixture shows that same distinction with U+200B retained before cleanup and without it after cleanup. We record wholeCodepoints alongside the actual strings so the two visually related lowercase sigma characters can be distinguished reliably. The nonfinal ΟΣΑ control produces οσα in both paths; the lone capital sigma also becomes ordinary sigma in both.

The discrepancy comes from lost context during transformation

Our point-by-point mapping deliberately removes surrounding letters from each casing call. It is a different operation from whole-string case conversion, even though it reconstructs an output string afterwards. The cleaner does not lowercase any text, and its result preserves the Greek capitals while removing only the selected marker. The earlier Turkish guide compares locale choices, whereas this matrix uses the default toLowerCase method and changes call granularity. We do not claim every language, mark position or contextual case rule behaves identically. Exact outcomes are attached to the saved runtime and Unicode metadata. Nor does a case difference establish that a string came from Claude or carried any watermark signal.

Choose a text transformation before using its output for matching

If a workflow requires whole-string lowercase, preserve the surrounding context for that operation and compare the resulting code points in tests. Avoid assuming that mapping over individually extracted characters implements an equivalent algorithm. If the application needs caseless matching rather than a displayed lowercase label, define and test that matching requirement separately; this experiment does not implement general Unicode case folding. Keep the original spelling when case changes affect identifiers or user-facing text. The four synthetic controls isolate a contextual transformation issue after selective cleanup, making it possible to reproduce a puzzling final letter without changing the cleaner’s removal list or deleting meaningful Greek characters.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMAScript String.prototype.toLowerCase provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.