bin/*.js consumers onto the new FILE bindings
Once JS-042 surfaces io.stat mtime + io.lstat/readlink/symlink/chmod, delete the bin/*.js workarounds: the /usr/bin/stat subprocess in classify.js, the symlink "assume clean" / throw-recovery hacks, and the unapplied symlinks + exec-bit in checkout.js. Realizes the bin/*.js review's #1 + #3 payoff (and the JS-038 checkout residuals). BLOCKED on JS-042 (bindings) + JS-043 (consolidated base). Method: Issues.
classify.js:42-80 batchMtimes spawns /usr/bin/stat in 200-path chunks to
temp files, mmaps + text-parses %Y %n — only because io.stat dropped mtime; status.js carries shBin/shQuote solely for that.
classify.js:119-128 recovers a symlink kind from a thrown FILEStat;
classify.js:170-174,318-322 returns false / assume-clean for symlinks (no readlink); checkout.js:90-104 records but SKIPS symlink + exec-bit apply.
classify.js reads mtimes via io.stat(path).mtime (drop batchMtimes + the
subprocess + status.js's shBin/shQuote).
io.lstat + io.readlink (hash the link target, like
CLASS.c::CLASSWtEqBase); checkout.js applies symlinks (io.symlink) + exec-bit (io.chmod).
classify.js/status.js reconcile.
be-bin-*/be-js-get-* stay green; add a symlink + exec-bit checkoutcase.
batchMtimes/stat-subprocess; wire
io.stat.mtime/io.lstat/io.readlink; apply symlink + chmod in checkout.js; add a checkout symlink/exec-bit test.
ctest green.b87e6251: classify.js drops the /usr/bin/stat subprocess
(io.lstat(full).mtime) + real symlink classify (io.lstat/readlink/ frameSha, mirrors CLASS.c::CLASSWtEqBase); checkout.js materializes symlinks (io.symlink) + exec-bit (io.chmod), kind-aware leafUnchanged (a 100644→100755 flip re-chmods). New be-bin-checkout-symlink test (repro-first); full be-bin/be-js-get 7/7 green.