Residual from the #91 fix (2026-08-10 review wave; implementation track
interpretation call 4).
#91 moved lender release onto every non-success exit of the start-call
bodies (trap rethrow, NeedsJspi bail, async-start resume-trap). One window
remains: when createSyncStartCall parks on a JSPI suspension
(blockCurrentActivation), lender release lives inside produce(). If that
suspension point settles by cancellation or by an error path that never runs
produce (SuspensionPoint reject/cancel paths), the lent handles' numLends
stay elevated forever — same failure class as #91, one layer down.
Needs: an audit of SuspensionPoint's settle paths (which ones bypass
produce?) and a release hook tied to the suspension point's terminal state
rather than to produce alone — or a scope-stack registration so the
executor-side amendment-2 unwind (contracts/intrinsics.md v0.2 amendment 2,
scope-clarified 2026-08-10) discharges it.
Site: runtime/src/intrinsics/fact_calls.ts (createSyncStartCall park);
compare runtime/src/jspi/bridge.ts SuspensionPoint settle paths.
Residual from the #91 fix (2026-08-10 review wave; implementation track
interpretation call 4).
#91 moved lender release onto every non-success exit of the start-call
bodies (trap rethrow, NeedsJspi bail, async-start resume-trap). One window
remains: when
createSyncStartCallparks on a JSPI suspension(blockCurrentActivation), lender release lives inside
produce(). If thatsuspension point settles by cancellation or by an error path that never runs
produce(SuspensionPoint reject/cancel paths), the lent handles' numLendsstay elevated forever — same failure class as #91, one layer down.
Needs: an audit of SuspensionPoint's settle paths (which ones bypass
produce?) and a release hook tied to the suspension point's terminal state
rather than to produce alone — or a scope-stack registration so the
executor-side amendment-2 unwind (contracts/intrinsics.md v0.2 amendment 2,
scope-clarified 2026-08-10) discharges it.
Site: runtime/src/intrinsics/fact_calls.ts (createSyncStartCall park);
compare runtime/src/jspi/bridge.ts SuspensionPoint settle paths.