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).be-bin-*/be-js-get-* stay green; add a symlink + exec-bit checkout case.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.