Problem
CSV uploads larger than ~20 MB fail because of Pyodide's WASM heap limit (documented in `CLAUDE.md`). Users only discover the cap by trying — the upload silently errors out (or surfaces a cryptic Python exception) and they assume the app is broken.
Proposal
Show the cap before the upload starts:
- In the upload modal (`frontend/index.html`, the CSV upload section): a small badge or note "Max 20 MB · runs in your browser".
- Client-side check: if `file.size > 20 * 1024 * 1024`, reject with a friendly error toast ("File is too large for the browser runtime — please subsample first") before calling `pyCallBinary`.
Acceptance criteria
Why now
Two lines of HTML, ~10 lines of JS. Removes the worst silent failure mode in the app.
Problem
CSV uploads larger than ~20 MB fail because of Pyodide's WASM heap limit (documented in `CLAUDE.md`). Users only discover the cap by trying — the upload silently errors out (or surfaces a cryptic Python exception) and they assume the app is broken.
Proposal
Show the cap before the upload starts:
Acceptance criteria
Why now
Two lines of HTML, ~10 lines of JS. Removes the worst silent failure mode in the app.