GIT-012 gave the JS wire a FETCH client (upload-pack) over ssh: and http:, but be/shared/wire.js exports fetch only — there is NO push, so be post //host / post ssh://host?br / post https://host?br (FF-advance a remote branch with cur's commits) is unimplemented in jab. This ticket adds the send-pack write direction: a shared wire.push() that advertises git-receive-pack, sends <old> <new> <ref> update commands plus a packfile of the objects the remote lacks, and parses report-status — over ssh: (spawn) and http: (curl POST), non-blocking over pol. POST stays FF-only; the unconstrained ref-write/force is its sibling GIT-014, reusing this core. Method: Issues.
be/shared/wire.js exports fetch only — no receive-pack/send-pack (grep finds no push path), so jab cannot push.be post //host / post ssh://host?br / post https://host?br (FF-push cur's tip to a remote) therefore no-ops or errors in jab; native C be pushes via keeper/WIRECLI.c send-pack.git-receive-pack: same pkt-line frame as fetch, opposite direction — client sends update commands + a pack, then reads report-status.jab post //origin to publish Beagle's own beagle-ext changes (the task that opened GIT-012) needs a working push.wire.push(remoteUri, updates, pack) receive-pack client used by jab post, over ssh: (spawn) and http: (curl), mirroring GIT-012's transports.pkt.js, the curl adapter + pol pump, classify() (add a receive-pack verb route), parseAdvLine.git-receive-pack) + http (curl POST …/git-receive-pack); non-blocking over pol; no new TLS binding (curl owns https), all as GIT-012.GIT-013 comments, greppable, ticket-coded commits; do not regress the fetch path or ssh/local.wire.push(remoteUri, updates, packBytes): advertise receive-pack, send <old> <new> <ref>\0<caps> pkt-lines + flush + the pack, then parse unpack ok / ok <ref> / ng <ref> <reason>.GET <U>/info/refs?service=git-receive-pack (skip the # service… preamble), then POST <U>/git-receive-pack, types application/x-git-receive-pack-{request,result}; ssh: spawn git-receive-pack <path>.report-status ofs-delta, no side-band — so the response is plain report-status pkt-lines, the same demux-free choice as GIT-012 fetch.keeper pack/serve builder); the JS never writes a pack itself.wire.push() receive-pack core (advert → updates+pack → report-status) behind the GIT-012 transports; ssh first. — landed cb3881f8 (shared/wire.js §GIT-013 PUSH).pol path. — landed cb3881f8 (wire.js pushHttp, …/git-receive-pack).buildPushPack; GIT-018 e42c94e7 later replaced the keeper spawn with a pure-JS closure walk + git.pack emit.classify() receive-pack route; wire into verbs/post/post.js //host push forms. — landed cb3881f8; FF verdict later unified into shared/relate.js (GIT-016 c12f6d4b).ng/unpack failure. — landed (wire.js parseReportStatus).git-receive-pack/http-backend; assert the remote ref advanced (mirror GIT-012's test/wire/). — test/wire/push-ssh, push-http, push-nonff.cb3881f8 ("git protocol push", be/ trunk): wire.push() receive-pack client over ssh: + http:, FF-only POST, report-status parse; verbs/post/post.js pushRemote Host-slot forms; tests test/wire/push-ssh/push-http/push-nonff.234b0f54 (ref-target resolution), GIT-016 c12f6d4b+14924366 (relate verdict spine, honest non-FF), GIT-018 e42c94e7 (pure-JS push pack, no keeper spawn — closes the T3 pack-builder blocker), GIT-019 3610b643 (one receive-pack session).