Observed CSV workflow check — 2026-10-27 Controlled synthetic input, real browser outputs. Download all five CSV files in one folder. Save the Python code below as verify-records.py in that folder, then run it with Python 3. No packages required. It checks the archived observations and rewrites csv-record-rebuilt.csv only; keep a separate copy if you edit that file. The unseeded list output can vary on a new draw. The archived replay is deterministic; compare record counts/decoded fields, not a promise of new random order. import csv, json, hashlib from pathlib import Path base=Path(__file__).parent def rows(name): with (base/name).open(encoding='utf-8-sig',newline='') as f: return list(csv.reader(f,strict=True)) original=rows('csv-record-input.csv') header, data=original[0], original[1:] assert header==['slot','item','note'] and len(data)==3 assert all(len(r)==3 for r in data) assert data[0]==['C01','Map, north','Read\nthen draw'] assert data[1]==['C02','Quote "pair"','One line'] by_id={r[0]:r for r in data} assert len(by_id)==len(data) other=rows('csv-record-csvkit-observed.csv') assert other[0]==header and [r[0] for r in other[1:]]==['C03','C01','C02'] assert all(r==by_id[r[0]] for r in other[1:]) lines=rows('csv-record-lines-observed.csv') assert lines[0]==['Position','Input entry','Item'] and len(lines[1:])==5 assert [int(r[1]) for r in lines[1:]]==[5,2,3,4,1] assert any(r[2]=='then draw"' for r in lines[1:]) assert any(r[2]=='slot,item,note' for r in lines[1:]) ids=rows('csv-record-id-order.csv') order=[r[2] for r in ids[1:]] assert order==['C02','C01','C03'] and sorted(order)==sorted(by_id) rebuilt=[by_id[k] for k in order] with (base/'csv-record-rebuilt.csv').open('w',encoding='utf-8',newline='') as f: w=csv.writer(f);w.writerow(header);w.writerows(rebuilt) assert rows('csv-record-rebuilt.csv')==[header]+rebuilt report={'pass':True,'inputRecords':len(data),'inputPhysicalLines':len((base/'csv-record-input.csv').read_text().splitlines()),'csvkitRecords':len(other)-1,'lineToolEntries':len(lines)-1,'lineInputEntryOrder':[int(r[1]) for r in lines[1:]],'idOnlyOrder':order,'rebuiltRecords':len(rebuilt),'allRebuiltFieldsMatch':True,'rawFileHashes':{n:hashlib.sha256((base/n).read_bytes()).hexdigest() for n in ['csv-record-input.csv','csv-record-csvkit-observed.csv','csv-record-lines-observed.csv','csv-record-id-order.csv','csv-record-rebuilt.csv']}} (base/'field-verification.json').write_text(json.dumps(report,indent=2),encoding='utf-8') print(json.dumps(report))