CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Does maxlength truncate cleaned text assigned by a script?
In our browser, assigning ABCD to input and textarea controls with maxlength 2 retains all four UTF-16 units and reports tooLong false. The same occurs for two emoji. This programmatic-assignment test does not measure interactive typing limits.
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 were measured separately in Chromium 156 using detached native controls and programmatic value assignment. Node reruns the actual homepage callback and reads the saved browser observations; it does not independently rerun the browser. No form was submitted. 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 pair direct string / keep / invisible true | "AB"U+0041 U+200B U+0042 | "AB"Removed 1 invisible character | {"input":{"maxLength":2,"tooLong":false,"units":3,"valid":true,"value":"AB"},"textarea":{"maxLength":2,"tooLong":false,"units":3,"valid":true,"value":"AB"}}{"input":{"maxLength":2,"tooLong":false,"units":2,"valid":true,"value":"AB"},"textarea":{"maxLength":2,"tooLong":false,"units":2,"valid":true,"value":"AB"}} |
| Overlong value direct string / keep / invisible true | "ABCD"U+0041 U+0042 U+0043 U+0044 | "ABCD"No selected invisible characters found | {"input":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"ABCD"},"textarea":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"ABCD"}}{"input":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"ABCD"},"textarea":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"ABCD"}} |
| Emoji pair direct string / keep / invisible true | "😀😀"U+1F600 U+1F600 | "😀😀"No selected invisible characters found | {"input":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"😀😀"},"textarea":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"😀😀"}}{"input":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"😀😀"},"textarea":{"maxLength":2,"tooLong":false,"units":4,"valid":true,"value":"😀😀"}} |
| Empty text direct string / keep / invisible true | "" | ""No selected invisible characters found | {"input":{"maxLength":2,"tooLong":false,"units":0,"valid":true,"value":""},"textarea":{"maxLength":2,"tooLong":false,"units":0,"valid":true,"value":""}}{"input":{"maxLength":2,"tooLong":false,"units":0,"valid":true,"value":""},"textarea":{"maxLength":2,"tooLong":false,"units":0,"valid":true,"value":""}} |
The attribute does not truncate this assignment
The observer sets maxLength to two before assigning each supplied string. Both the input and textarea retain the three-unit marked AB source. After the actual cleaner returns AB, both retain its two units. Their tooLong flags are false in both states. The overlong ABCD reference retains all four units and also reports valid true. Saving values alongside constraints exposes the exact behavior: no code in this fixture asks the browser to type characters or to enforce an explicit application length policy.
The emoji reference separates units from appearance
Two grinning emoji remain four UTF-16 units in each control despite maxLength two. The observer reports the length it actually measures rather than calling those units bytes or visible characters. This control is deliberately unmodified by the cleaner. The empty reference stays empty and valid. None of these observations establishes what a user can enter through the keyboard, what an input method editor does or how the same field behaves after user edits. They establish only the programmatic assignment path used here.
Validity depends on the interaction path
A caller that loads text through a script should inspect its chosen length measure explicitly instead of assuming the attribute will clip the value. Decide whether the destination needs code units, code points, graphemes or encoded bytes before enforcing a limit. This page does not implement truncation and does not recommend cutting text at an arbitrary unit boundary. The earlier counter and byte-budget guides explain different measures; the new question here is whether native maxlength applies as a truncation operation during script assignment.
Rerun the exact assignment method
The downloadable browser harness creates fresh detached input and textarea elements and reads each validity state without user editing or submission. Its recorded user agent accompanies the results. The Node reproducer rechecks the saved cleaner and consumes the browser snapshot; it does not independently reproduce native constraints. These synthetic controls are not actual Claude output. A false tooLong flag here must not be interpreted as a general storage guarantee, a pass from a server validator or evidence about a statistical watermark.
Reproduce this test
For a fresh native-control measurement, save and open reproduce-browser.html in your browser. It embeds the exact fixture observer and saved homepage script, runs locally, and shows its user agent. For the Node cleanup rerun, save reproduce.cjs, tested-app.js and browser-observations.json 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
WHATWG HTML limiting-user-input-length:-the-maxlength-attribute 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.