The rebase replay loop invokes the heavy carving helpers (tm_merge_trees, tm_merge_blob, GRAFPatchId) with plain assignment instead of call()/try(), so ABC_BASS is never snapshot-restored between iterations; each commit (and each tree-recursion level / divergent leaf) permanently bumps the arena by hundreds of KB to tens of MB, growing unbounded over chains up to REBASE_PATH_MAX=4096 until a_carve returns NOROOM and the rebase aborts. The goal is to rewind BASS around each iteration's scratch.
Carving helpers called directly, defeating the arena-rewind discipline; leak survives into sniff/POST.c.
graf/REBASE.c:780-882 GRAFRebase — tm_merge_trees (:851) and GRAFPatchId (:791) assigned, not call()ed; their carves (≤1MB newtree + trees + 2.7MB pid) never rewind.graf/REBASE.c:625-649 rebase_collect_pids — GRAFPatchId (:639) in a loop over ≤8192 ancestors leaks ~2.7MB each.graf/REBASE.c:363-419 tm_merge_blob — carves 64MB (4×REBASE_BLOB_MAX), called directly from tm_merge_trees:548 per modify/modify leaf.None. GRAFPatchId returns u64 (not ok64), so it needs explicit mark/rewind, not call().
Snapshot-restore BASS per iteration; keep hoisted buffers outside the marked region.
NOROOM abort reproduces pre-fix).tm_merge_trees/tm_merge_blob in call()/try(); bracket GRAFPatchId with u8aMark(ABC_BASS)/u8aRewind(...).head_body_cache, chain/pids buffers carved outside the marked region.