The JS wire (be/shared/wire.js) speaks git's smart protocol but only over a spawned ssh/local keeper; classify() has no HTTP(S) branch, so an https:// (or git://) URL wrongly routes to ssh host git-upload-pack (wire.js:28,76). jab has no TLS and we will NOT add one, so HTTPS rides a spawned curl; the pkt-line negotiation (advert → want/have/done → NAK → pack) is transport-independent and reused as-is. Transport I/O moves to the non-blocking pol loop. SSH stays exactly as it is; git:// (daemon, TCP 9418) is OPTIONAL — net.connect already yields the socket and the core is shared. Method: Issues.
be/shared/wire.js fetch() runs ALL transports through io.spawn + blocking io._read/io.writeAll; the negotiation core is transport-agnostic (wire.js:142-201).classify() has NO http(s) branch: //host, git://, ssh:// all map to ssh host git-upload-pack, so an HTTPS remote silently mis-routes to ssh (wire.js:24-78).keeper/WIRECLI.c only local-exec or ssh), so smart-HTTP is net-new and lives in JS — no C reference to mirror.net.connect over pol, js/net.cpp:55-64,323-331) but NO TLS/HTTP/curl binding; pol is the loop the runtime drains after the script (js/main.cpp:159,319).//origin (replicated.live) and jab get https://… need an actual HTTPS path, not an ssh misfire.pol loop, replacing the synchronous io._read loops with pol-fed incremental reads.pkt.js, parseAdvLine, pickWant) verbatim across ssh / https / (optional) git://.git:// daemon adapter (net.connect :9418 + one request pkt-line), included only because the core is shared and it needs no new binding.curl (curl owns TLS+HTTP); NO native HTTPS/TLS — jab has none and we will not add one.net.connect, HTTPS rides io.spawn(curl), ssh/local unchanged.pol.watch registration; the wire awaits via the loop, never a blocking read.wire.js into a transport-agnostic negotiation core + per-transport adapters: local/ssh (spawn, have), https (curl spawn, new), git (net.connect, optional).pkt.Reader from pol-driven 'data' chunks (net socket or watched spawn fd), resolving on advert-flush and on pack-EOF — no synchronous io._read.GET <base>/info/refs?service=git-upload-pack then POST <base>/git-upload-pack, types application/x-git-upload-pack-{advertisement,request,result}.# service=git-upload-pack\n + flush preamble before the refs; the advert drainer skips it, while ssh/git go straight to the ref lines.want <sha> ofs-delta WITHOUT side-band-64k, so the server streams the raw pack after NAK — exactly what wire.js already assumes (wire.js:174-193).curl -sSf --get <base>/info/refs --data-urlencode service=git-upload-pack; POST curl -sSf -H 'Content-Type: …request' --data-binary @- <base>/git-upload-pack; stdout is the pkt stream.git:// (optional): one request pkt-line git-upload-pack <path>\0host=<host>\0 (v0, port 9418), then the identical core; the daemon serves upload-pack only.git-receive-pack (own ticket); the git:// daemon refuses receive-pack by default (anonymous-push unsafe).4370d67e (wire.js drainAdvert/pickWant/fetchHttp).pol I/O for the CURL adapter (curlRun: pol.watch + pol.run pump, wire.js ~158-182). The ssh/local spawn path STAYS blocking (pkt.Reader over io._read) — the T-scope decision resolved as curl-only; revisit only if a real stall shows.4370d67e (fetchHttp).classify() http/https branch → the curl adapter. — landed 4370d67e.git:// is STILL lumped with ssh (classify comment: git:// → ssh host git-upload-pack), so a git:// URL misroutes; split it off (route to T5's adapter or refuse clearly).net.connect :9418, daemon request pkt-line, run the core.wire.fetch→classify; http end-to-end proven by the wire tests.git http-backend: test/wire/http-clone, http-update, http-incremental, big-http.pol too (one uniform core), or keep it blocking and run only the new transports async? Affects T1/T2 scope. — Landed answer: curl-only async; ssh/local kept blocking (audit 07Jul26: pkt.js still refills via io._read).git:// still silently routes to ssh host git-upload-pack. Close-or-finish call is the owner's; kept open for that residue only.multi_ack_detailed handling once haves are sent; the no-side-band assumption must be checked live before HTTPS relies on it.-n injection a follow-up.curl is absent.4370d67e ("git protocol client", be/ trunk): smart-HTTP fetch over spawned curl (fetchHttp + curlRun on pol), classify() http/https branch, ssh/local behaviour-identical; tests test/wire/http-clone/http-update/http-incremental/big-http. Enabled the push twin (GIT-013 cb3881f8).git:// URL still routes to ssh.