jab upload-pack / receive-pack) to retire the native keeper daemon on the be:// wire
jab is a wire CLIENT only (verbs get/put/post/patch/delete/head; no serve). The be:/keeper: transport (be/shared/wire.js dispatch) execs the NATIVE keeper daemon — keeper upload-pack locally or ssh host keeper … — which LAGS jab and is absent from the jab-only bin. Local file:// + git transport (git-upload-pack) already run keeper-free, so TEST-003 converts the local/ingest tests off be:. But the be:// WIRE-PROTOCOL tests (get/be, get/cached, any be-store push/fetch) genuinely need a beagle wire SERVER. Give jab one — a JS upload-pack/receive-pack serve loop — so the be:// wire runs jab-to-jab, fully native-binary-free.
be LAGS jab); the only surviving native dependency is the keeper wire daemon on be:/keeper:.wire.js transport dispatch: file:/scheme-less local → read direct (no wire); //host/git:/ssh:/http → git-upload-pack (keeper-free, tests pass); be:/keeper: → exec keeper upload-pack (local) or ssh host keeper ….build/bin ships no keeper; build-debug/bin/keeper is ABI-stale vs current jab (abc._ulog_open is not a function). So get/be + get/cached SKIP.file:// submodule mount must NOT reach keeper at all — it should reuse the on-disk source store + make a (store-backed) worktree; that submount local-reuse gap (the sub/* + spot/submount TEST-003 failures) is its OWN fix, tracked separately, NOT this JS-serve feature.serveReader (store open), markReachable (object closure), buildPushPack (pack build), plus pkt.js framing and GIT-013/014's report-status/pack logic.jab upload-pack <store> and jab receive-pack <store> (or one jab serve) — speaking the keeper wire protocol over stdin/stdout, so be: local-exec and ssh host jab upload-pack … both work jab-to-jab.be: dispatch execs the JS server via the EXISTING KEEPER_BIN override; get/be + get/cached (and be-store push/fetch) pass with NO native keeper.wire.js): v0/v1 refs advertisement, want/have negotiation, NAK\n, RAW pack after (keeper advertises NO side-band-64k, so no demux). Reuse pkt.js, not hand-rolled framing.markReachable(wants) − haves, build the pack with buildPushPack, stream it after NAK.jab upload-pack/receive-pack invocation (what ssh/local exec spawns); the CLI must NOT emit its normal banners on these (raw wire only).jab upload-pack <store> serve loop (advertise → negotiate → pack) over stdio. — landed 261680bf: shared/serve.js uploadPack (reuses serveReader/buildPushPack/pkt), raw-wire CLI intercept in core/loop.js ~229.jab receive-pack <store> serve loop (commands → pack ingest → report-status). — NOT built: serve.js exports uploadPack only, loop.js intercepts only upload-pack; a be:// PUSH still needs the native keeper.261680bf via the existing KEEPER_BIN=jab override (proven jab-to-jab in test/serve/uploadpack); no jab serve alias, classify() default stays keeper.test/get/be/run.sh still SKIPs on command -v keeper, test/get/cached still clones over ssh-keeper; only the new test/serve/uploadpack runs jab-to-jab (fetch side, local-exec).classify()'s ssh arm still hardcodes keeper <verb> for be://host (wire.js ~85) — an ssh host jab upload-pack form (or KEEPER_BIN-honouring remote cmd) is needed before the native daemon retires.wire.js exactly or fetch hangs.261680bf ("js upload-pack, also fix bro tests"): the FETCH serve side only — shared/serve.js uploadPack + the jab upload-pack raw-wire CLI entry + test/serve/uploadpack (be: local-exec fetch jab-to-jab via KEEPER_BIN=jab, incl. a want+have thin-serve drive). Remaining: receive-pack serve, the get/be + get/cached test flips, and an ssh-remote jab spawn form (see TODOs).jab receive-pack CLI entry landed later under POST-028 (serve.js receivePack, FF-gate + CAS + report-status); the leftover TODOs (ssh-remote jab spawn, test flips) are promoted to GIT-022.