Status's classifyMerge calls wtEqBase on EVERY in-base+on-disk path (be/shared/classify.js:417), a full open/readAll/blob-hash per file, even when the file is untouched since checkout. Yet every verb-written mtime is already recorded in the wtlog stamp-set (wtlog.js has(ts); get/post stamps, DIS-057 patch bands), and stage.js:150 already uses exactly this fast path: mtime ∈ stamp-set → clean, no read. Status is the outlier: on a big wt the content sweep dominates wall-clock (PACK-003 fixture: full re-read+re-hash of every path, no stat shortcut at all).
jab status wall-clock on a large wt is dominated by wtEqBase content reads; the wtlog already carries the ground truth for "untouched since the verb wrote it".
classify.js:417 — wtEqBase(wtRoot, path, b.sha) unconditionally; classify.js:127-161 is the per-file open/readAll/frameSha cost.wtScan already lstat's every path and carries ts (mtime ron60 BigInt, JS-042) in the merge row — the stamp is in hand, unused.stage.js:150,216,242 — put/post staging already skips content compare when mtime ∈ get/post stamp-set; status never got the same treatment.Fast path in classifyMerge: for an in-base+on-disk path, if wt mtime ∈ the wtlog stamp-set → treat as eqBase true (bucket ok) without opening the file; only mtime-miss paths pay the read+hash.
eq rows, JAB-018) keeps emitting the wt mtime it already has.!pb && w.ts &&
wtlogReader.has(w.ts) short-circuits wtEqBase; no reader
threading needed (wtlogReader already in scope).!pb guard is load-bearing: the cnf band slot IS the
patch row ts, a stamp-set member — pb routes con/mrg first.has(ts)) into classifyMerge's inBase+onDisk arm; consult before wtEqBase at classify.js:417.io.open via hook or timing bound) and output is byte-identical.ok (pStamp check precedes the fast path).con-row marker scan (classify.js:383) — already gated on conSet, unaffected.get never restamps checkout mtimes (no io.setMtime in
get.js/checkout.js) — only post/put/patch stamp, so a FRESH
CLONE still pays the full content sweep; stamping get
checkouts would need its own ticket.