be status as bin/status.js (SDK validation)
Reimplement bare be / be status as a repo-local extension bin/status.js, built ONLY on libdog (dog/) + abc/ via JABC — never linking a dog (sniff/keeper/graf). Goal: validate the Extensions SDK end-to-end and surface each JABC gap as a thin libdog/abc leaf. Every on-disk format is already libdog/abc (keeper objects = git.pack, .idx = abc.index wh128, wtlog/refs = ULOG, sha = codec.sha1), so the store layer is reimplementable in JS, sharing zero code with sniff. Method: Issues.
be <name>→bin/<name>.js; be status is the first real extension and the SDK proof. C path (sniff): SNIFFClassify heap-merge → bucket rows → ahead/behind (graf) → summary; mirrored in JS over libdog/abc.io/abc.index/codec); the store/keeper/graf/subs side is reachable because the formats are libdog/abc.be status — incl. submodule recursion, pin advances (sub advanced past pin), and file del/new. Oracle = native be status; new parity tests live in test/bin/*. Iterate till parity; commit nothing.bin/lib/ SDK (be/wtlog/keeper/classify/dag/subs) future scripts (log, diff, ls) require().abc/ ONLY; any new C is a thin dog/+abc/ leaf, never a dog.be status.git.pack + abc.index + ULOG. Git object parse via new libdog git.tree/git.parseCommit leaves (over dog/git GITu8sDrain*), no manual framing in JS. git.tree(bytes).next() pull cursor; git.parseCommit eager struct.bin/lib/; bin/status.js builds + renders the ULOG and wires the libs.git.tree(bytes).next() cursor (mode/name/str/sha, 160000 gitlink visible) + git.parseCommit(bytes) → {tree,parents[],foster[],…} — libdog leaves over GITu8sDrainTree/GITu8sParseCommit; ctest. (no deps)bin/lib/be.js (.be discovery walk) + wtlog.js (ULOG reader: cur/baseline tip, pd/patch boundaries, ts stamp-set). Smoke bin/refs.js. (no deps)bin/lib/keeper.js — getObject(sha) (git.pack+abc.index+delta), resolveRef, eachTip/eachRemote, readTree, commitTree/commitParents. ← JS-028, JS-029bin/lib/classify.js + ignore.js + bin/status.js — baseline⊕wt⊕put⊕del heap-merge, bucket routing, .gitignore, build the status ULOG + render via HUNK + summary. File-row parity incl. del/new; test/bin/*. ← JS-030bin/lib/dag.js — ahead/behind via commitParents BFS; wire the commit-diff block into status. ← JS-030bin/lib/subs.js — gitlink(160000)+.gitmodules, mount detect, 3-axis dirty (ancestry via dag on the sub shard); sub rows. Full parity. ← JS-032Has(ts) index, git/IGNO matcher). ← JS-031process.exit) would let status return a clean/dirty exit code.125d5c8f (2026-06-21): bin/status.js + bin/lib/ {be,wtlog,keeper,classify,ignore,dag,subs}.js reproduce native be status BYTE-FOR-BYTE. Verified independently on the REAL beagle repo (1291 ok non-recursive; status:abc sub hunk recursive) and via test/bin/*: keeper-verify, status-parity (clean/mod/new/staged/del/mis/mov/ignored), dag-divergence (ahead/behind), sub-status-parity (advanced-pin / back-at-pin / recursion / clean-recursion), refs-parity. libdog+abc ONLY; jabc links dog abc-core unchanged. Landed as ONE commit 125d5c8f (all 20 files); js/cont.cpp's marker-doc comment was cleaned first to dodge DIS-046.git.tree/parseCommit → JS-029 be/wtlog → JS-030 keeper (over git.pack+abc.index, sha-rehash verified) → JS-031 classify/ ignore/status (file rows) → JS-032 dag → JS-033 subs + recursion.--sub (native: be status doesn't recurse, bare be does — the extension mirrors that). Object index = git.pack.scan → abc.index wh128. Sub-shard ancestry via keeper.open(parentStore, subTitle).io.stat has no mtime; no io.readlink/lstat; pack.scan REF_DELTA; inert sub Edited-axis (matches C until SUBS-027b). Caveat: dag ahead/behind is unit-verified (the live be status (behind N) cur≠ref state is transient + hard to stage).