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.
A large, long-lived file cannot be blamed at all — a fixed buffer fills before the weave/output completes.
blame:keeper/KEEP.c returns BNOROOM (observed in release; the trivial schemes and small files succeed).GRAF_FW_BLOB_MAX 16 MB (graf/BLAME.c:245), keeper buf1..4 (keeper/KEEP.h:167), the 16 MB a_carve outbuf in GRAFBlame.be dispatcher: be blame:beagle/BE.cli.c
(4295 lines) → BNOROOM → BEDOGEXIT (exit 157, zero output); be blame:README.md (165 lines) works. Scales with file/output SIZE (not only history depth) — points at the output/weave accumulation cap over per-blob inflate.
None. Needs a repro-first failing test (CLAUDE.md §17) pinning the exact buffer before resizing or switching to a growable/BASS-carved sink.
Repro, identify the overflowing buffer, then make it grow (or stream) rather than cap.
graf blame:keeper/KEEP.c (or a synthetic large/long-history fixture) must finish OK, not BNOROOM.*bAcquire/a_carve/keeper buffer returns BNOROOM; confirm the trigger (blob size vs accumulated output vs weave).u8bAllocate sized to need), or stream the render instead of one 16 MB outbuf.
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.