A batch of low-severity modularity nits surfaced across the JS tree: dead code whose header still advertises an unused API, three overlapping short-hex resolvers, and helpers (ancestor walk, sub-traversal, stdout writers, require idioms) re-implemented per module instead of shared. One TODO per item; each is independently landable. Method: Issues.
apply() + its scanWt(:129) are dead —the header (:7) advertises apply() but no caller drives it.
store.js:302 (resolveHexAny, any-object), log.js:104-134 (a pack-walk re-impl, see JS-085).
ancestorSet/lca re-implement the dagwalk locally ("so patchscope has no dag cycle", :81).
(joinPrefix/isMount) that core/recurse.js already exports (walk :74, isMount :32, joinPrefix :63).
join/statExists/statKind.
render.js:35 (writeStdout), pager.js:26 (ttyWrite) — all io.buf+feed+io.writeAll(fd,…).
require(.../core/discover.js) — a shared→coreupward require (also in JS-088).
io.log(...) directly instead ofthe ctx.out header sink (refs.js:4 admits ctx.out is a no-op stub).
store.resolveHexAny; drop the log.js variant (JS-085).
status/patch/refs); existing parity tests stay green.
comment) but delegates the prefix scan to resolveHexAny.
apply is now LIVE (shared/submount.js:273,320),no longer dead; fix its missing-object bug instead (see JS-083).
3 short-hex resolvers (resolve.js/store.js:303/log.js:121); patchscope ancestorSet/lca local (patchscope.js:83,101); delete.js local join/statExists/statKind (:55-57); 3 stdout writers (pager.js:81 ttyWrite, view/render.js:54 writeStdout, views/bro/bro.js:34 writeStdout); subs.js:53 lazy core/ require.