Back to list
Aug 19 2026

Development Update — August 19

The big thread today is a root-cause fix to transport discovery: the transport-discovery service had been reflecting only about 9% of the real transport graph, and the route-finder plans over that view, so it was blind to most of the network. A run of eight fixes traces it to CXO fills breaking over short-lived announce connections and closes the gap from both ends — the publisher makes its feed fill faster and smaller, the aggregator keeps a stable source, and both sides now verify what they publish. Alongside it, an optional route-calculation path sidesteps the discovery service entirely, the mux data plane gets two more fixes, and the performance presets move onto the no-dip engine.

Skywire: Closing the Discovery Gap

The transport-discovery CXO aggregator only accepted inbound connections — a visor announces, delivers its transport-list Root, and its conn closes moments later, so the aggregator’s fill hit ErrNoConnectionsToFillFrom in the same second the Root arrived. Live logs showed the fill breaking for ~198 of 204 visors; only ~22 Roots ever filled, and the little TPD held was skewed toward short-lived sudph/webrtc transports, missing the reliable stcpr/squicr visors actually hold. 4008 has the aggregator dial back to visors so fills have a stable source. 4009 salvages what a partial fill did fetch — CXO fills top-down and keeps whatever objects it got before the break, so transports/list can be landed from a partial fill. 4012 makes that reliably work by publishing the list as a top-level leaf that sorts and fills first, rather than nested under the transports node after N per-transport telemetry subtrees keyed by uuid (which sort before list). 4010 shrinks the snapshot ~62% by publishing a compact form — dropping the reporter’s own PK repeated on every row and the derivable transport IDs — that TPD reconstructs byte-identically. 4011 stops mirroring an unused daily-rollup leaf to CXO that nothing consumes and that competed with transports/list for the fill budget. 4014 fixes a redundant reverse-dial that evicted the fill mid-transfer: a CXO node enforces one conn per NodeID, so a second conn to a visor tore down the fill’s only source. 4017 makes TPD’s own published feeds fillable by subscribers, salvaging leaves from a partially-filled Root. And 4013 makes the drift observable so it can never go unnoticed again: every five minutes the transport manager diffs its published set against what TPD reflects for its own edge and logs a WARN below a 0.9 ratio — a publisher that never checks whether the authority mirrors what it published cannot notice when the authority stops.

Skywire: A Route Calc That Doesn’t Need Discovery

4018 adds an opt-in, default-off path to compute single-intermediate (2-hop) multiplexed routes from the destination’s own transports, fetched via a setup-node-signed query, instead of the transport-discovery service. For S→I→D you only need S’s transports (local) intersected with D’s transports (authoritative and fresh from D itself), so the common route type stops depending on TPD’s incomplete view. It reuses the cascade trust model: the RSN setup-node signs a transport-list query for D, S delivers it to D dmsg-direct on a new control-plane port bound only when the flag is on, D verifies the signature against its trusted-RSN allowlist and returns its compact transport list, and S computes the disjoint 2-hop route.

Skywire: Two More Mux Data-Plane Fixes

4005 stops the reorder buffer from skipping a gap: its time-based release flushed past a missing sequence after 1.5s on the theory that a long-held gap is a dead leg, but the mux carries the route group’s noise-encrypted byte stream, so a delivered hole corrupts it and an HTTP GET through a leg that black-holes its share of the sequence space returned zero bytes; the buffer must hold the gap, never skip. 4006 adds a fast data-progress prune for a leg that keeps echoing the tiny liveness ping while black-holing bulk data — classically a WebRTC leg under load, which survived the ~90s pong-miss window while every sequence it dropped was SACK-retransmitted on a live leg, collapsing aggregate throughput — now a 5s loop samples each leg’s received bytes and prunes one whose reorder frontier gap has stayed open. 4001 has GrowMuxRoute plan its aux legs route-finder-first and cost-ranked, like the other two mux planners.

Skywire: Presets on the No-Dip Engine, Warm Forward

4004 lifts latency-adaptive, elastic-mux and probe-and-prune onto the shared no-dip engine: they had still torn working legs down and rebuilt them (raw drop-and-add), and every eviction dipped the mux width while the replacement set up — a stall, on a noise-wrapped mux — so the rotating-bw discipline is factored into shared helpers that evict by demote-to-standby and grow by promote. 4002 fixes the skynet-client forward, which had dialed a fresh route group to the forwarding port on every accept and torn it down at connection end — so with mux options each accept built and discarded an N-leg group and the mux never sustained, carrying ~0 bytes under bulk load — now holding one warm route group open to the forwarding mux port via skyroute.Pool, the same warm-route mechanism the resolving proxy uses. 3998 has rotating-bw’s on_tick manage standby only, never adding or dropping, which kills the rotation thrash, and 3997 applies it to any opt-in app rather than only built-in binary names. 4003 silences an unparam lint on the DialRoute ctx param.

Skywire: Interstitial over HTTPS, the policy-bw Rig, CI

3999 gives the proxy interstitial the real Skycoin cloud brand mark and shows why the page is waiting, and 4000 serves the branded interstitial over HTTPS (a TLS-MITM for mesh hosts) with a per-caller status line, so an HTTPS mesh target gets the branded wait page rather than a browser TLS error. 4015 adds an in-process policy-bw rig that drives the mux-bandwidth rig through the WASM/Starlark policy engine, and 4016 serializes its leg-lifecycle events to NDJSON. On CI, 4007 persists $GOCACHE across runs so unchanged packages skip re-test.