Release v0.20.1 - #29
Merged
Merged
Conversation
…ation that began it and reschedules after a reconnect
…push, release and hotfix refs unchanged
Launch conformance with the connection selected by fixture preflight and keep credentials in the child environment. Use venue-scoped schemas and guard the wiring against hardcoded defaults.
sinon's withArgs(matcher).resolves(A).resolves(B) chains the second resolves onto the matcher-scoped fake, not the base stub, so every non-matching call returned undefined instead of the intended default string. Dormant until unit 13-1 added a render_page.js call path that invokes .replace() as a method on that value directly, which throws on undefined instead of silently stringifying it. Split the stub setup so the default lands on the base stub in all three affected suites.
… the BTC instant The v0.20.0 family was sized 2026-09-16 20:41Z from last-99-block cadences. LTC testnet then ran at about 82 s per block against the 146.6 s that sizing assumed, pulling its producer boundary to 3.2 h out while BTC's stayed 53.0 h out, and DOGE's drifted 7.5 h early. Two legs of one cross-chain match would have crossed the flag day about two days apart, which is what the same-wall-clock-instant rule exists to prevent. Re-measured 2026-09-17 22:45Z over a trailing window as long as the lead being sized: TBTC 152,891 at 576.7 s per block, TLTC 4,889,190 at 82.5 s, TDOGE 67,904,912 at 27.7 s. BTC is unchanged, still keyed to epoch close 153,216 plus 6 buried; LTC and DOGE are converted onto that same instant, and each consumer is its own producer plus six hours at its own measured cadence rather than a block count carried over from the first sizing. Arms the TRAIN_ACTIVATION 0.20.0 row at testnet 153,116, 106 blocks and about 17 h below the BTC producer. resolveRuleSet reads only the local map, so with no row every block above the boundary keeps resolving under 0.19.0, and a manifest naming 0.20.0 halts a fleet in which no build implements it. Records the cadence-window rule the re-cut used and makes the re-size rule per chain instead of BTC-keyed, so an LTC or DOGE drift past the six-hour ordering margin forces a re-cut the way an overrun BTC height already does.
Copy the indexer mirror-client updates byte for byte into the explorer twin. Keep streamed anchor metadata on the update-only admission path.
…ts corpus The re-stale predicate conformance file carried its fixture corpus inline and two helpers well over the function limit, so it sat above the file-length limit and could not be read as a unit. The corpus moves to a support module the suite requires, the two long helpers are split, and the mirror and preflight suites pick up the cases that moved out of the predicate file.
…h a count that opens the legs A multi-send is one action with one sends row per leg, and every list surface printed leg 0 alone, so a four-recipient send read as a single send; a BATCH parent projected nothing and rendered as a bare name; the history feed derived each member's parent per row and then dropped it. The summary projection now carries leg_count, member_count and parent_batch_action_index (absent, never 0 or 1, when there is nothing to mark, so single sends keep their exact shape). The client appends a count badge that fetches the action once and opens its legs or members as a child row, and a member row links its batch. Rendering lives in a new client part so the summary renderer stays under the file limit, and the styling reads from theme tokens in both themes.
The armed LTC:testnet producer/consumer heights (4891504/4891766) are already behind the live TLTC tip. Ruling dq4 (a), 2026-09-18: LTC:testnet mirror admission ships null on this train and arms on a later train. Sets both heights to null in this repo's shared_rows_2.js twin, with the same replacement comment used across all six carriers.
Propagate the canonical v0.20.1 patch-train reslide into the explorer's own copy of the shared consensus registry: BTC train height 153221, BTC mirror producer/consumer 153300/153328 (producer also carries ANCHOR_ATTEST_BARRIER_ACTIVATION), DOGE mirror producer/consumer 67916857/67917706. LTC:testnet stays null under dq4 (a) and is untouched.
Derive published fixture ports from the gate CI_PORT_OFFSET while preserving zero-offset defaults. Keep container ports fixed and route fixture clients through the same resolved host ports.
…h.sh The stale comment claimed the dispatcher ships at origin/master with a fallback to local HEAD. The actual script prefers the pushed branch before falling back. Matched against xchain-documentation/.ci-siblings which has the correct wording. (cherry picked from commit 2fd50a0d700ad6ffd82f217da88fc7720c4ec366)
The indexer's getrollcallsigners returns rollcall_activation and rollcall_gates_activation; the explorer's port did not, so a validator reading the DOGE replica could not tell an epoch below activation apart from an epoch nobody signed. Read both from the shared gate registry, the same rows the indexer gates on, and pin them in the routing test by constant rather than by height.
…e indexer The canonical mirror client took the drain certification fix in indexer 5192d4c7 and the sync script was never re-run, so the vendored lifecycle.js drifted and the byte-parity conformance test has refused every explorer push since. Synced with xchain-indexer/bin/sync-hub-mirror-client.sh; its --check is clean.
…the indexer Third leg of row L007: the explorer's vendored copy of the shared gate, byte-identical to the indexer canonical and the hub twin, written by xchain-indexer/bin/sync-hub-mirror-client.sh (its --check reads clean). Suite: 4531 passing, 0 failing.
Mount the two routes token.html calls for bridge invariant and transfers. Transfers read through a db-layer getBridgeTransfers reader instead of inline SQL.
Resolve complete CI database settings from the process environment before consulting the venue file. Keep direct file parsing isolated and pin both precedence branches with a unit case.
…t the HTML shell processRequest now resolves the route itself before handing off to runRequest, and answers the NOT_FOUND JSON body directly for the exact case explorer/request/not_found.js treats as unmatched (neither a file nor a data method was found). A route that matched and answers 404 on its own, whether through the URL-table pipeline or one of the routes mounted ahead of the catch-all, is untouched because this only fires before any of those ever run.
…SON, not the HTML shell
Vendored byte-identical from xchain-indexer by bin/sync-hub-mirror-client.sh: ensureTables now converges the indexes a twin declares onto an existing mirror table (see the indexer commit), and instance_state.js picks up the comment-only tracker-label drop the canonical copy already carried.
… margin Live testnet tips (TBTC 153698, TDOGE 67924122 at 2026-09-23T15:55Z) have passed every height the 2026-09-19 reslide armed, so the freeze preflight refuses them. The operator ruled a second reslide to 40 h of margin to the nearest armed height at the fastest defensible cadence (BTC least-squares bound 383.04 s/block, DOGE median 11 s/block), keeping the prior spacing. Propagate it into the explorer's own copy of the shared consensus registry: BTC train height 154074 (tip + 376 blocks, 40 h), BTC mirror producer/consumer 154234/154291 (train + 160, 17 h; producer + 57, 6 h; the consumer also carries ANCHOR_ATTEST_BARRIER_ACTIVATION), DOGE mirror producer/consumer 67942777/67944741 (tip + 18655, 57 h, the same instant as the BTC producer; producer + 1964, 6 h). LTC:testnet stays null under dq4 (a) and is untouched.
…exer Propagate xchain-indexer's canonical hub_db_sync client via bin/sync-hub-mirror-client.sh; the explorer's copy had drifted on a comment (indexer commit 5eb696db) and was failing hub_mirror_client_conformance.
Replace the opaque dq4 (a) decision label with a self-contained explanation of why LTC:testnet mirror admission ships disabled on this train. Comment text only; byte-identical to the other five shared-row carriers.
… it on the icon route A tick is free text, and one carrying '#' or '%' (TDOGE action 2693 issued "$$$$$$$$$$$78324%@##*(@#") built an icon URL the browser cut at the fragment and the server refused as malformed, so the page showed a broken image instead of the token icon or the default. getTokenIcon now encodes the tick segment, the img carries a one-shot onerror fallback to /icon/default.png, and the /icon route decodes the segment before the disk lookup so such a tick can find its own downloaded file; a malformed encoding or a null byte is a miss served as the default, and decoding runs before the containment check so an encoded traversal still gets 403.
…iling mean Operator ruling D11 (a) 2026-09-23: producer moves from 67942777 to 67936053 and consumer from 67944741 to 67936888, the same-instant rule computed off the 84h trailing block-time mean. BTC:testnet heights are unchanged; their comments now also carry the 84h trailing mean cadence bound. Byte-identical to the other five shared-row carriers.
This was referenced Sep 23, 2026
The floating node:22-bookworm tag can advance past the Node patch xchain-vm's consensus runtime pin requires, so the base is now pinned by digest to the build whose V8/ICU/unicode/cldr versions match that pin.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release v0.20.1
Coordinated platform release across the 13-repo v0.20.1 train.
masterrelease/v0.20.1What changes
153221to154074, with BTC producer/consumer activation at154234/154291, DOGE producer/consumer activation at67942777/67944741, andANCHOR_ATTEST_BARRIER_ACTIVATIONat154291;LTC:testnetmirror admission remainsnullunder dq4 (a).mirror_admission_gate.jstwin:admissionCanonicalValue()is non-throwing, and an INERT consumer with a legacy-signature mismatch follows the ordinary invalid-row path.Sibling release PRs
Filled in by open-release-prs.sh --execute once every PR above has a number: