# CSV preservation v1 — 10 October 2026

Synthetic 7-row × 6-column fixture. Frozen expected.json predates browser runs.
Two real products: ConvertCSV CSV Viewer and Editor (web checked 10 October 2026) and TableConvert 3.0.1 CSV to CSV. Chrome 152 on Windows. Excel: official-document review only, NOT_RUN.

## Reproduce
1. Keep originals. Parse input-utf8.csv and input-utf8-bom.csv: same table; one has a UTF-8 BOM.
2. ConvertCSV: https://www.convertcsv.com/csv-viewer-editor.htm — Input Options: UTF-8, comma, header on, treat quotes as data off, apostrophe quote off. Output header on, CRLF. Download an unedited CSV.
3. TableConvert: https://tableconvert.com/csv-to-csv — CSV source file; comma, Newline, Double Quote Wrap on, output BOM off. Download an unedited CSV. The original quoted note split on import in this run; preserve this failure.
4. In each actual grid change only r02.status to checked and r05.note to 已核对, "保留原文". Commit both cells, download CSV, reopen both saved files in that editor. Repeat for the other input encoding.
5. Re-read actual downloaded files with a strict independent CSV parser and compare each cell, header, count and order. Run `python verify.py` in this directory. The command validates recorded outcomes: it expects four primary ConvertCSV PASS results and four TableConvert FAIL results. A successful verifier exit does not mean every product preserved the data.

## Results and file map
- input-* are frozen inputs; expected.json contains complete original/edited rows.
- convertcsv-*-unedited.csv and convertcsv-*-edited.csv: actual PASS exports. No BOM, CRLF, 426/441 bytes. Every parsed cell matched; every output was reopened in the actual application.
- tableconvert-*-unedited.csv and tableconvert-*-edited.csv: actual FAIL exports. No BOM, LF, 533/544 bytes. Extra seventh column and malformed embedded quotes. Strict parser fails; tolerant parsing is diagnostic only, never accepted as valid data.
- tableconvert-settings-confirmed.csv: one explicit settings confirmation, byte-identical to the original failing unedited output.
- convertcsv-utf8-unedited-initial.csv: retained early save, matching the later unedited file.
- observed.json: full independent output parses, differences, formats and separate application reopen observations.
- manifest.json: hashes and byte lengths for all files except itself.

ConvertCSV Clear All resets input options; the reopen displays in this evidence showed the header as a normal first row. Blank editor row/column are UI insertion affordances, absent from actual CSV output. No data was trimmed from CSV validation.

Both products were operated through their browser UI and produced real downloads. Python is the independent verifier, not a third editor. Changing BOM/newlines/valid quoting alone does not imply value corruption. No large-file, multiline-field, formula-execution, privacy/security or recovery claim. Unknown capabilities remain unknown.

Excel documentation (not a live workbook result):
- https://support.microsoft.com/en-gb/excel/keeping-leading-zeros-and-large-numbers
- https://support.microsoft.com/en-us/excel/text-import-wizard
- https://support.microsoft.com/en-us/excel/get-started/import-or-export-text-txt-or-csv-files
