fix(prepare): measure a chunk before uploading it, and say what Iris said
Two failures from the first real four-URL bench, both of which cost a
round trip to learn something a stat call knew.
Splitting the 1004-page Texas appropriations act with pdfseparate +
pdfunite produced 477 MB chunks from a 34 MB source: poppler copies the
whole shared resource set into every slice. Each one was uploaded over a
throttled link and refused with a 413. A chunk's size is not a function
of its page count, so prepare now measures every chunk it writes against
the deployment's published max_request_bytes and records the ones that
came out unsendable as `chunk_too_large` — per chunk, so the pages that
did fit are still runnable, and named, so the summary can say which
pages are missing rather than quietly shipping a shorter corpus. The
advice to install qpdf is attached only when poppler did the splitting,
because qpdf subsets those resources instead of copying them.
The 413 itself printed as "[object Object]". Iris's errors are
structured — {code, message, details} — and this one named the declared
size, the cap, and the remedy, all of which the harness destroyed on the
way to the terminal. Worse, report.mjs groups failures by message, so
every distinct structured error would have collapsed into a single bogus
class. One shared errorText() now renders them for reading and grouping;
the structured form is still what gets stored.
A bad split is retryable, since the fix is on this side: --retry
re-splits from scratch rather than trusting the chunks already on disk.