Skip to content

Release v0.20.1 - #29

Merged
jdogresorg merged 72 commits into
masterfrom
release/v0.20.1
Sep 24, 2026
Merged

jdogresorg merged 72 commits into
masterfrom
release/v0.20.1

Conversation

@jdogresorg

@jdogresorg jdogresorg commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Release v0.20.1

Coordinated platform release across the 13-repo v0.20.1 train.

  • Base: master
  • Head: release/v0.20.1

What changes

  • Re-slides the v0.20.1 testnet activation train from 153221 to 154074, with BTC producer/consumer activation at 154234/154291, DOGE producer/consumer activation at 67942777/67944741, and ANCHOR_ATTEST_BARRIER_ACTIVATION at 154291; LTC:testnet mirror admission remains null under dq4 (a).
  • Carries L004-28 in the explorer mirror_admission_gate.js twin: admissionCanonicalValue() is non-throwing, and an INERT consumer with a legacy-signature mismatch follows the ordinary invalid-row path.
  • Serves bridge-panel data, XBRIDGE and multi-leg action details, rollcall activation heights, generated OpenAPI response schemas, and all indexed action types.
  • Improves contract-custody balances, fee history, FILE filenames, not-yet-indexed responses, API fallbacks, escaping, and missing-data rendering.

Sibling release PRs

Filled in by open-release-prs.sh --execute once every PR above has a number:

…ation that began it and reschedules after a reconnect
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.
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.
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.
@jdogresorg
jdogresorg merged commit 1f1eb1b into master Sep 24, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant