Skip to content

Release v0.20.0 - #28

Merged
jdogresorg merged 12 commits into
masterfrom
release/v0.20.0
Sep 18, 2026
Merged

jdogresorg merged 12 commits into
masterfrom
release/v0.20.0

Conversation

@jdogresorg

@jdogresorg jdogresorg commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Title: Release v0.20.0

Summary

Changed

  • The hub-mirror client moves to schema v7 with admission-height columns on seven mirror tables.
  • Activation modules and identity pins now follow the consolidated consensus layout.
  • The bridge and policy barrier twin matches the indexer implementation.

Fixed

  • Token detail reads adapt to the connected replica schema.
  • XBRIDGE detail renders against replicas created before bridge tables existed.

Sibling release PRs

Merge order

Merge order: merge after xchain-indexer and before xchain-e2e-test.

CI note

GitHub CI on this branch clones sibling repos at develop, not at this release branch, unless a workflow call passes siblings-ref for release branches. A cross-repo guard failure here can reflect that develop-only comparison rather than a real disagreement with a sibling still on this release branch; check the venue pre-push gate (which ships each companion at its own release branch) before treating a red guard as a defect.

…s at the src/consensus tails from the indexer's bytes, citations and requirers repointed (activation registry row 21c)
… re-pinned for those bytes only (activation registry row 28-pin)
The v0.19.0 token read selects tokens.bridge_chains, min_depth, lock_bridge and
bridged, four columns that exist only where the indexer migration
2026-09-12-token-bridge-fields.sql has been applied. Naming an absent column is
MariaDB 1054 for the whole statement, not a null for one field, so every mainnet
token route answered 500 the moment the explorer rolled against replicas that had
not taken it, and the fleet had to be held at v0.18.0.

getToken now probes information_schema for those columns once per coin and projects
the pre-bridge column list where they are missing, with a 1054 recovery behind the
probe so a stale or failed probe still answers the page. A negative probe expires
after a minute, so applying the migration heals a live explorer without a restart.

The degraded body OMITS the bridge fields rather than defaulting them: locks.bridge
is seeded false by the empty shape, and false is a positive claim the replica never
made, which the wallet acts on by offering an edit a frozen policy forbids. Absence
is what every reader of this body already treats as unknown.
The canonical hub-mirror client now asks the connected schema for bridge_transfers
and policy_snapshots before reading a watermark from either, instead of firing a
statement the server answers 1146 and swallowing the error. Vendored here byte for
byte by the indexer's bin/sync-hub-mirror-client.sh, back to back with that commit
so neither repo's sibling drift check sees a one-sided twin.

Same shape the explorer's own reads take against a replica that has not applied a
migration: probe the schema, degrade on what it actually holds, and say so.
The XBRIDGE handler reads bridge_settlements, a table the indexer's bridge-tables
migration creates, and that migration is manual: a replica takes it on its
operator's schedule. Naming an absent table is MariaDB 1146 for the whole
statement, not an empty result for one section, so every XBRIDGE action page
answered 500 against a replica that had not taken it, the same way the token
routes did before the reader learned to ask.

The handler now probes information_schema for the table once per coin, with a
negative answer expiring after a minute so applying the migration heals a live
explorer without a restart, and a 1146 net behind the probe for the case where it
answered wrong.

The degraded body OMITS the whole bridge section rather than emptying it.
bridge_pending is the one field on that card a holder acts on, and it means "the
settle leg is applied on the other chain and has not landed yet"; reporting it
true off a table that was never read would tell them their transfer is in flight
on no evidence. An absent key reads as unknown, and the card renders the leg with
no settlement claim at all.

The shared probe lands as src/db/schema_probe.js so the next reader with the same
problem asks the same way. The action-detail golden is regenerated for the one
added statement in the two XBRIDGE captures, with every other capture byte-identical.
…a v7 and the seven admission-height SQL tables
…0.0 train (dq3 (a))

This reverts commit 22404c2; the token bridge and policy gates stay dark on v0.20.0 and arm on the next train.
… 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.

(cherry picked from commit 312f0ae84c3088834d33df6bf9ef00005baa5905)
@jdogresorg
jdogresorg merged commit 6daa89b into master Sep 18, 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