Beagle SCM
JS-110: net bundle composes URIs by string concatenation, breaking IPv6
Proposed by the 2026-07-07 jab multi-agent review; confirmed by both skeptic verifiers. Manual URI composition is explicitly forbidden by the norms, and the concat form cannot frame IPv6 literals.
Context
- Server.listen:
net._listen("tcp://" + host + ":" + port) (jab net.cpp:307); net.connect: same concat (net.cpp:326); Dgram.bind: "udp://" + addr + ":" + port (net.cpp:339).
- An IPv6 literal ("::1") yields "tcp://::1:8080", which the abc URI/NET parser cannot split into host/port (needs bracket framing) — net.connect(port, "::1") fails or mis-parses.
- uri._make/URI.make (uri.cpp) exists precisely for composition; meta/abc.mkd: never compose URIs manually.
Goals
- Repro first: connect/listen/bind with an IPv6 literal host.
- Compose via URI.make with proper bracketing/escaping in the bundle.
Constraints
- Keep Node argument shapes (port, host); loopback-default behavior unchanged.
WIP
TODOs
- 2026-07-10 revision: still OPEN — 3 concat sites live: net.cpp:307 listen, :326 connect, :339 dgram bind; no URI.make, IPv6 unframed
- 2026-07-10 worker: fixed in
work/JS-110b (netUri helper, reparse-verified; 95/95), unmerged; diff pending review.
Blockers and bummers
- Bug found mid-fix, own ticket ABC-019: NETResolve feeds the bracketed host verbatim to getaddrinfo, so correctly composed
tcp://[::1]:p URIs still fail Invalid argument at the C layer — IPv6 stays dead end-to-end until it lands.