Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Will cleaning the same output twice change it again?

With the same settings, our tested outputs are stable on a second pass. The second pass reports no selected characters even when the first pass removed them, so retain the first-run record.

Tested October 5, 2026 · v24.19.0 · 9 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Mixed removable characters

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. Invisible removal is enabled; the dash mode appears in each row. The observations below test this page's specific question. 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
Mixed removable characters
direct string / keep
"A​­⁠͏B—C"
U+0041 U+200B U+00AD U+2060 U+FEFF U+034F U+0042 U+2014 U+0043
"AB—C"
Removed 5 invisible characters
{"containsSelected":true,"dashCount":1}
{"containsSelected":false,"dashCount":1}
Mixed removable characters
direct string / replace
"A​­⁠͏B—C"
U+0041 U+200B U+00AD U+2060 U+FEFF U+034F U+0042 U+2014 U+0043
"AB-C"
Removed 5 invisible characters; handled 1 dash
{"containsSelected":true,"dashCount":1}
{"containsSelected":false,"dashCount":0}
Mixed removable characters
direct string / remove
"A​­⁠͏B—C"
U+0041 U+200B U+00AD U+2060 U+FEFF U+034F U+0042 U+2014 U+0043
"ABC"
Removed 5 invisible characters; handled 1 dash
{"containsSelected":true,"dashCount":1}
{"containsSelected":false,"dashCount":0}
Retained meaningful sequence
direct string / keep
"👩‍💻 "
U+1F469 U+200D U+1F4BB U+00A0
"👩‍💻 "
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}
Retained meaningful sequence
direct string / replace
"👩‍💻 "
U+1F469 U+200D U+1F4BB U+00A0
"👩‍💻 "
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}
Retained meaningful sequence
direct string / remove
"👩‍💻 "
U+1F469 U+200D U+1F4BB U+00A0
"👩‍💻 "
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}
Plain reference
direct string / keep
"ABC"
U+0041 U+0042 U+0043
"ABC"
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}
Plain reference
direct string / replace
"ABC"
U+0041 U+0042 U+0043
"ABC"
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}
Plain reference
direct string / remove
"ABC"
U+0041 U+0042 U+0043
"ABC"
No selected invisible characters found
{"containsSelected":false,"dashCount":0}
{"containsSelected":false,"dashCount":0}

Compare the second output, not just the status

For each of the three fixtures, we execute Keep, Replace and Remove dash modes. We feed each output into a second callback run with identical settings and save its output and status. The downloaded rows include second_pass and stable fields. The mixed fixture loses its selected characters in the first run; its em dash depends on the mode. The retained sequence and plain reference do not change. Every measured second output equals its corresponding first output.

A second no-findings result loses history

The status describes the current input, so a second run cannot say whether an earlier run removed characters. The mixed fixture receives a removal report first and a no-selected-character report afterward. Save the first input, first output and settings when documenting what happened. Repeating the operation with changed settings is a different experiment: switching from Keep to Remove can still edit a dash. We test stability for these fixtures and this script, rather than every possible Unicode sequence.

Use stability as a pipeline check

A stable result can help detect accidental repeated transformations in a text-processing pipeline. It does not prove the text has no retained controls, no statistical watermark or a particular author. Our script deletes a fixed map and optionally transforms three dash code points, so readers can inspect why the tested strings settle after one pass. Keep version information with your saved evidence and rerun if the cleaner changes. The measurement makes no AI-detector-score or indexing claim.

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 operations 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.