BLAME-004: blame of a large / long-history file returns BNOROOM

graf blame:keeper/KEEP.c (a 2973-line file) fails with BNOROOM instead of producing output — surfaced while profiling BLAME-001. A fixed scratch cap overflows: candidates are GRAF_FW_BLOB_MAX (16 MB per blob, graf/BLAME.c:245), the keeper inflate buffers (keeper/KEEP.h:167), or the 16 MB blame outbuf/weave accumulation (graf/BLAME.c) once the all-ancestors walk folds a large file across long history. It is a correctness bug (a real file is un-blameable), distinct from the performance gap, though the all-ancestors walk amplifies it. See Plan.

Issues

A large, long-lived file cannot be blamed at all — a fixed buffer fills before the weave/output completes.

Blockers

None. Needs a repro-first failing test (CLAUDE.md §17) pinning the exact buffer before resizing or switching to a growable/BASS-carved sink.

Planned

Repro, identify the overflowing buffer, then make it grow (or stream) rather than cap.

Landed

LANDED 43e90bdb. Root cause was NOT a size cap (none of the three suspects fired): GRAFFileWeave's fold loop (graf/BLAME.c) called WEAVEFromBlob/WEAVEApply/WEAVEDiff bare, so each fold's transient ABC_BASS scratch never rewound and piled up across all versions until the 1 GB arena exhausted mid-walk → BNOROOM (a missing call frame, cf. avoid-poking-abc-bass-internals). Fix: wrap the three per-fold calls in try() (per-iteration BASS rewind); the woven result survives in each weave's own mmap'd TLV. Test graf/test/blame-bignoroom.sh (80-commit/4000-line); be blame:beagle/BE.cli.c → exit 0, 4297 lines; 290/290 green.