Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Can invisible-character cleanup expose an equals sign at the start of a CSV field?

Yes. Our authored U+200B plus =1+1 field becomes =1+1 after cleanup. A simple prefix flag changes from false to true. We test strings and CSV quoting only; no spreadsheet formula is executed or certified safe.

Tested October 17, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked equals

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.

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
Marked equals
direct string / keep / invisible true
"​=1+1"
U+200B U+003D U+0031 U+002B U+0031
"=1+1"
Removed 1 invisible character
{"firstCodepoint":"U+200B","startsFormulaLike":false,"csvQuoted":"\"​=1+1\"","method":"Literal first-character classifier only; no spreadsheet executed"}
{"firstCodepoint":"U+3D","startsFormulaLike":true,"csvQuoted":"\"=1+1\"","method":"Literal first-character classifier only; no spreadsheet executed"}
Equals reference
direct string / keep / invisible true
"=1+1"
U+003D U+0031 U+002B U+0031
"=1+1"
No selected invisible characters found
{"firstCodepoint":"U+3D","startsFormulaLike":true,"csvQuoted":"\"=1+1\"","method":"Literal first-character classifier only; no spreadsheet executed"}
{"firstCodepoint":"U+3D","startsFormulaLike":true,"csvQuoted":"\"=1+1\"","method":"Literal first-character classifier only; no spreadsheet executed"}
Text reference
direct string / keep / invisible true
"Total"
U+0054 U+006F U+0074 U+0061 U+006C
"Total"
No selected invisible characters found
{"firstCodepoint":"U+54","startsFormulaLike":false,"csvQuoted":"\"Total\"","method":"Literal first-character classifier only; no spreadsheet executed"}
{"firstCodepoint":"U+54","startsFormulaLike":false,"csvQuoted":"\"Total\"","method":"Literal first-character classifier only; no spreadsheet executed"}
Quoted-looking text
direct string / keep / invisible true
"\"=1+1\""
U+0022 U+003D U+0031 U+002B U+0031 U+0022
"\"=1+1\""
No selected invisible characters found
{"firstCodepoint":"U+22","startsFormulaLike":false,"csvQuoted":"\"\"\"=1+1\"\"\"","method":"Literal first-character classifier only; no spreadsheet executed"}
{"firstCodepoint":"U+22","startsFormulaLike":false,"csvQuoted":"\"\"\"=1+1\"\"\"","method":"Literal first-character classifier only; no spreadsheet executed"}

The first character changes the review result

We supply four strings to the actual homepage callback with invisible removal enabled and dash handling set to Keep. The marked field begins with U+200B, so our deliberately narrow first-character classifier returns false. After deletion its first character is equals, and the flag becomes true. The equals reference is flagged on both sides, Total is unflagged on both sides, and the quoted-looking source begins with a literal double quote. The change belongs to the content of one field. We neither assemble a worksheet nor ask an import engine to decide its cell type. A false result in this small classifier therefore means only that its four-character prefix rule did not match.

CSV quoting and cell interpretation are different checks

The observer also produces a quoted CSV field by doubling embedded double quotes and surrounding the result with double quotes. For the cleaned marked sample the exported spelling is a double-quoted =1+1. This records syntax construction, not proof that a spreadsheet will store the value as text. The quoted-looking control already contains quote characters as data, so its generated CSV spelling includes additional doubled quotes. It must not be mistaken for a successful security mitigation. Our prefix rule omits tabs, line breaks, leading whitespace and locale-specific characters; it is intentionally incomplete. The OWASP reference describes the broader formula-injection problem, while the four rows here measure only the effect of this cleaner on these exact strings.

Review the final fields at the receiving boundary

If cleaned content will become spreadsheet data, run the destination-specific review after all intended text transformations and CSV parsing decisions. Keep the original value and the transformed field together so a newly exposed leading character is visible to the reviewer. Decide whether the destination expects literal text, a numeric value or an intentional formula before export. Test that policy with the particular spreadsheet and import route in use; neither the local classifier nor ordinary CSV wrapping establishes it. This page supplies a reproducible reason to order those checks deliberately. It does not claim an observed exploit, an Excel test, a universal escaping recipe, or evidence that Claude inserted a formula or invisible character.

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

OWASP CSV Injection 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.