A long-running pager with NOBODY TOUCHING IT leaks 19.2 file mappings per second and dies. The 100 ms key-wait spin calls _ciBadge() per pass; the badge pays two uncached treeAt climbs, each mmapping a .be ULOG that nothing ever unmaps. At vm.max_map_count (65530, ~57 min) every mmap fails and the process spins in the kernel forever. Observed live as be todo at 462% CPU / 71.0g VIRT (evidence); reproduced identically by jab log, so this is EVERY pager, not the todo view.
Live incident 2026-08-05 (gritzko, main tree): be todo pid 13475, 1h54m old, 71.0g 462% 12% be todo. Read-only forensics on /proc plus a clean pty re-run (ptyprobe.py, evidence).
vm.max_map_count is 65530, so EVERY mmap in it had been failing for a while.r--s map of ONE file, work/WORK-013/.be (inode 73807828, offset 0).mmap that can no longer succeed.jab todo grew be/.be maps 96 per 5 s (19.2/s), strictly monotonic, 594 after 40 s.jab log: same 96 per 5 s on the same file — the leak is the PAGER LOOP, no view is implicated..be leaks is just the pager's context: pid 13475 sat in //WORK-013, the repro sat in //be.pager.js:1522,1532 _ciBadge() → ci.js:289 contextWt → discover.wtdir + discover.treeAt = 2 × resolveAnchor → discover.row0Row → ulog.js:44 each() → abc.mmap("ULOG",…).abc.close is a no-op and release is GC-finalize-only (ABC-020); a 4 KiB VMA adds ~no JS-heap pressure, so GC effectively never runs and the maps just pile up.pager.js:461,858); an IDLE pager paying 19 opens/s is not covered by its goal.An idle pager costs ZERO file opens per tick and a session's VMA count plateaus, so a pager left open all day neither grows nor slows.
abc.close still inert — the cut comes from not opening, not from closing (ABC-020 is On1 for the deeper half only).Pager context changes ONLY by navigation (BRO-024, pager-context-only-changes-by-nav) — so a context-keyed memo is sound and invalidates on nav.
be/core/resolve_hash.js: memoize AROUND the canonical calls, never reimplement or bypass them.///be/ per work; stop and report on any clone failure, no improvised fallback._ciBadge's contextWt per pager context — the spin must not re-resolve an unchanged context_resized, _tickDue) pay no file opensjab todo and jab log idle for ≥ 5 min; report VMA counts before/after