CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Why does JSON still fail after the hidden character is removed?
Our cleaner turns [1, plus U+200B plus ] into [1,], which still throws SyntaxError in JSON.parse. A trailing comma is a grammar problem. Fix it with a deliberate structural edit and validate the complete JSON again.
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 array with comma direct string / keep / invisible true | "[1,]"U+005B U+0031 U+002C U+200B U+005D | "[1,]"Removed 1 invisible character | {"accepted":false,"errorName":"SyntaxError"}{"accepted":false,"errorName":"SyntaxError"} |
| Array trailing comma direct string / keep / invisible true | "[1,]"U+005B U+0031 U+002C U+005D | "[1,]"No selected invisible characters found | {"accepted":false,"errorName":"SyntaxError"}{"accepted":false,"errorName":"SyntaxError"} |
| Object trailing comma direct string / keep / invisible true | "{\"a\":1,}"U+007B U+0022 U+0061 U+0022 U+003A U+0031 U+002C U+007D | "{\"a\":1,}"No selected invisible characters found | {"accepted":false,"errorName":"SyntaxError"}{"accepted":false,"errorName":"SyntaxError"} |
| Valid array direct string / keep / invisible true | "[1]"U+005B U+0031 U+005D | "[1]"No selected invisible characters found | {"accepted":true,"value":[1]}{"accepted":true,"value":[1]} |
One successful deletion leaves a second defect
The marked array contains one selected invisible character after its comma. The cleaner removes it exactly as recorded, leaving the visible string [1,]. JSON.parse rejects both versions with SyntaxError. The cleaner status and the parser outcome therefore describe different stages: the selected character was removed, but the resulting source still violates the destination grammar. This row is a useful diagnostic for a workflow that reports clean and then encounters another import error. It establishes neither a failed deletion nor a promise that removing the character should have repaired all remaining syntax.
Array and object controls isolate the grammar
The plain trailing-comma array and the object with a final comma are unchanged by cleanup and also fail. The valid [1] control succeeds before and after. Those comparisons remove the invisible character as a necessary explanation for rejection. We call JSON.parse on the entire string and record error names without presenting runtime-specific error wording as a universal diagnostic. No object literal is evaluated as JavaScript source. A trailing comma accepted in another language or configuration dialect does not establish acceptance by the strict parser measured here, even if the visible syntax looks familiar.
Make a structural correction outside the cleaner
For a real document, retain the original and locate the actual syntax defect with the intended parser or editor. Correct the unwanted comma in a working copy, then validate the complete result. Do not apply a blind comma-before-bracket replacement across raw text because punctuation inside quoted strings can be meaningful content. A grammar-aware tool can distinguish those contexts. This homepage is a character transformer and offers no JSON repair policy. Our experiment runs its unchanged callback and then observes parsing; it does not secretly delete a comma to manufacture a successful import.
Keep the claimed boundary precise
Strict JSON validity still does not guarantee required properties, accepted types or application-level meaning. Those require a separate schema or consumer check. This page addresses one particular remaining grammar error, distinct from our existing controls-inside-strings and root-type guides. We do not test JSON5, a configuration editor, a network API or a database importer. The public downloads give the exact four sources and saved script needed to reproduce this limited result. Nothing here establishes the origin of the text or whether a statistical mark is present; it explains why one successful cleanup can coexist with a parser failure.
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
RFC 8259 JSON grammar 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.