Deps: none. The sanctioned replacement already exists — wtread readFileBytes (pooled open/readAll/close, landed under CODE-020 57ff502a). This ticket routes the remaining per-file mmap readers through it. Repro concern is the RESIDENT pager loop over a big tree, per classify's own documented rule.
io.mmap leaks the mapping (no JS-side unmap), so a wt with >~1000 tracked files exhausts the process's mmap regions mid-sweep; every later map fails and the file reads as a false mod (the 279-file real-repo regression). Reads MUST use pooled fd.readFileText, per .gitignore during a tree scan), diff.js:317 (readWtFile, per changed file), why.js:27 (per file). ingest.js:242 io._mmap per appendRecords.readFileBytes or a shared read helper), so no mapping outlives the call.readFileText → pooled fd readreadWtFile → wtread readFileBytesio._mmap appendRecords — ensure unmap/close or document the boundCODE-024: per-file reads off io.mmap onto pooled fd.