CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Can removing an invisible-only field shift columns after filter(Boolean)?
Yes in our constructed row. A U+200B-only middle string becomes empty after cleanup; filter(Boolean) then removes that position. Space and the string 0 remain. The filtering step changes row shape after the cleaner changes one field.
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 |
|---|---|---|---|
| Marker-only field direct string / keep / invisible true | ""U+200B | ""Removed 1 invisible character | {"original":["A","","B"],"filtered":["A","","B"],"keptPositions":[0,1,2],"empty":false}{"original":["A","","B"],"filtered":["A","B"],"keptPositions":[0,2],"empty":true} |
| Empty field direct string / keep / invisible true | "" | ""No selected invisible characters found | {"original":["A","","B"],"filtered":["A","B"],"keptPositions":[0,2],"empty":true}{"original":["A","","B"],"filtered":["A","B"],"keptPositions":[0,2],"empty":true} |
| Space field direct string / keep / invisible true | " "U+0020 | " "No selected invisible characters found | {"original":["A"," ","B"],"filtered":["A"," ","B"],"keptPositions":[0,1,2],"empty":false}{"original":["A"," ","B"],"filtered":["A"," ","B"],"keptPositions":[0,1,2],"empty":false} |
| Zero text field direct string / keep / invisible true | "0"U+0030 | "0"No selected invisible characters found | {"original":["A","0","B"],"filtered":["A","0","B"],"keptPositions":[0,1,2],"empty":false}{"original":["A","0","B"],"filtered":["A","0","B"],"keptPositions":[0,1,2],"empty":false} |
Deleting one character can change a later filter decision
For each observation we construct the three-position row A, supplied field, B. Before cleanup, the marker-only middle string is nonempty and passes filter(Boolean), preserving all three values. After the selected deletion it becomes an empty string, so the filter returns only A and B. Our keptPositions record changes from zero, one, two to zero, two. The already empty control produces that reduced output before any cleaning. The space control and the textual zero control both retain the middle position. The observer therefore isolates a truthiness-based filtering decision after cleanup instead of suggesting that the homepage itself deletes an array element or reorders a record.
Textual zero and a numeric zero have different truthiness
Every field in this fixture is a string. The label Zero text field means the single character 0, which is truthy and remains in the filtered result. We do not supply the numeric value zero, false, null or undefined, and the saved results should not be generalized into a claim that Boolean filtering preserves those types. The space is also a nonempty string; neither this filter nor the cleaner trims it. Earlier CSV and TSV guides study delimiters and parsed field content, while this test begins with an already constructed row and runs no import parser. Positional loss is caused by the explicit later filter and can occur even for a perfectly parsed source.
Preserve positions when the record schema depends on them
When columns correspond to fixed names or indexes, keep an empty value at its original position unless the destination explicitly permits dropping the field. Validate or annotate emptiness without compressing the entire row by truthiness. If filtering is intended for a list of optional labels instead, its different contract can be appropriate, but verify that meaning before reusing it for tabular records. Keep source positions in diagnostics so a missing middle field is not mistaken for a different column’s value. Our downloadable rows show the original array, filtered array and surviving indexes for every control. They demonstrate one concrete alignment risk without claiming to validate a production CSV pipeline.
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 Array.prototype.filter 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.