JAB-008: binding calls C ops raw, skipping call() BASS scratch never rewinds, the 1GB arena drains, everything dies as "out full?"

Now
OPEN
Sev
HIGH

PRO.h's contract (dog/abc/PRO.h:20-40,73-83): a callee's a_carve scratch dies when the CALLER's call()/try() rewinds ABC_BASS; sane() alone rewinds nothing. The jab binding breaks the contract at the C++/C boundary: every JABC_FN (weave.hpp WEAVENext/WEAVEMerge/WEAVEAlive, pack.hpp, hunk.hpp) invokes the C op RAW no call() equivalent and ABC_BASS is mapped ONCE in main.cpp:281 and never rewound for the process lifetime. So every binding invocation leaks its whole carve set into the arena. Probe 2026-07-16 (in work/PATCH-012): fold the SAME 1MB blob from scratch in one process DIED at iteration 240, weave.fold: failed (out full?) ~4.3MB/fold (WEAVEFromBlob's a_carve(u32, toks, len+16) ≈4MB + anchors), 1GB/4.3MB 240. The C op's internal SNOROOM surfaces under the SAME "out full?" message as a dest overflow, so the leak masquerades as PATCH-012's cap bug. Hypothesis credit: gritzko.

Input

Context

One long-lived process + zero rewinds = every C-op invocation is a permanent allocation; hypothesis by gritzko, confirmed by probe.

Goals

Restore the PRO.h ownership contract at the JS/C boundary: a binding invocation leaks nothing.

Constraints

The guard is the binding's job; the C ops and the JS layer stay untouched.

WIP

Design decisions

TODOs

Blockers and bummers

Outcome