CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does padStart add a different number of zeros after cleaning?
Our marked 7 receives two zeros before cleanup and three afterward. padStart targets UTF-16 length, retains an emoji pair and does not shorten text already longer than the target.
Open the Claude text cleaner · Full measured data
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.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Marked identifier direct string / keep / invisible true | "7"U+200B U+0037 | "7"Removed 1 invisible character | {"utf16Units":2,"codePoints":2,"padded":"007","paddedUtf16Units":4}{"utf16Units":1,"codePoints":1,"padded":"0007","paddedUtf16Units":4} |
| Plain identifier direct string / keep / invisible true | "7"U+0037 | "7"No selected invisible characters found | {"utf16Units":1,"codePoints":1,"padded":"0007","paddedUtf16Units":4}{"utf16Units":1,"codePoints":1,"padded":"0007","paddedUtf16Units":4} |
| Supplementary symbol direct string / keep / invisible true | "😀"U+1F600 | "😀"No selected invisible characters found | {"utf16Units":2,"codePoints":1,"padded":"00😀","paddedUtf16Units":4}{"utf16Units":2,"codePoints":1,"padded":"00😀","paddedUtf16Units":4} |
| Already over width direct string / keep / invisible true | "12345"U+0031 U+0032 U+0033 U+0034 U+0035 | "12345"No selected invisible characters found | {"utf16Units":5,"codePoints":5,"padded":"12345","paddedUtf16Units":5}{"utf16Units":5,"codePoints":5,"padded":"12345","paddedUtf16Units":5} |
The marker consumes one position in the padding target
We call padStart with a target of four and the single padding character zero. The marked identifier has two UTF-16 units, so its output begins with two zeros while retaining the marker before seven. After deletion, one unit remains and the output is 0007. Plain seven already produces that result. The smile occupies two UTF-16 units but one code point, receiving two zeros. The five-digit reference remains five units long: the method does not truncate it to four. Recording the exact padded string alongside both lengths reveals that a nominal four-unit target is not a universal four-visible-character field.
The observer constructs text without numeric conversion
This page measures a string operation, not a numeric parser, formatter or database column. Leading zeros are generated as literal text and the input is never converted to a number. The older character-counter article compares units; our distinct question concerns how those units drive a generated output and when a requested width is exceeded. The target four is an experimental choice, not an official account-number or export rule. We do not test a multicharacter pad string, negative target, right padding or a file’s encoded byte width. The saved cleaner has no fixed-width field logic and cannot determine whether the original marker belongs in an identifier.
Validate the field contract after constructing padding
Preserve the original identifier and identify whether width means UTF-16 units, code points, graphemes or encoded bytes. Construct the output according to that destination contract, then validate its content and width separately. A padStart call can return an over-width result without an error, as our unchanged reference demonstrates. Do not remove meaningful emoji components or convert identifiers to numbers simply to force a target. These four tests establish one padding behavior with explicit arguments and controls. They do not promise compatibility with a fixed-width file specification or validate an identifier schema, and the removal counter alone cannot certify the generated field.
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.cjsReference 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.