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 realextension 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); thestore/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.
HUNK bindings (ULOG→HUNK serialize) — there is NO "rows" type (ROWS was rooted out, BE-007). One reusable module per concern under 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-029
bin/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-030
bin/lib/dag.js — ahead/behind via commitParents BFS; wire thecommit-diff block into status. ← JS-030
bin/lib/subs.js — gitlink(160000)+.gitmodules, mount detect,
3-axis dirty (ancestry via dag on the sub shard); sub rows. Full parity. ← JS-032
slow/awkward (candidates: ULOG Has(ts) index, git/IGNO matcher). ← JS-031
process.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).