Skip to content

Release v0.20.1 - #47

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

jdogresorg merged 46 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.
  • Publishes the four activation maps in the protocol canon and records LTC:testnet mirror admission as null under dq4 (a).
  • Corrects reference-implementation, TIS, bridge-proof, capability, drain, lint, and error-code documentation against shipped behavior.
  • Adds mobile reproducibility and review guidance, plus a warning against contracts on Bitcoin testnet4.

Sibling release PRs

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

…escribing the burial gate as armed from genesis
… 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.
Replace three unconditional placeholders with canonical vectors for
activation boundaries and fail-closed inputs. Cover snapshot burial
at its current genesis arm, including empty values, unknown
networks, and the zero clamp.
The API split moved three computed env reads onto named reads, so the blind
spot shrank from seven sites to four and the ratchet follows it down. Measure
this table at each sibling's origin ref: the stale 7 came from a working
checkout that origin had already moved past, which reddened every venue run
while a local run stayed green.
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 the canon (protocol/constants.js) and in
this repo's shared_rows_2.js twin, with the same replacement comment
used across all six carriers.
…margin from freeze

Ruling 2026-09-19: margin is 24 hours measured from the freeze, converted
per coin at that coin's own measured cadence, not five days.

Measured live: TBTC tip 153110, least-squares bound cadence 781.078553
s/block over a 114-block trailing window (about 25.2h span). TDOGE tip
67911061, trailing two-endpoint cadence 25.469118 s/block over a
3400-block window (about 24.1h span). Both sources are
explorer.xchain.io, proven live (advancing tip, tip_age_seconds fresh).

train_activation.TRAIN_ACTIVATION['0.20.0'].testnet: 153116 -> 153221
(tip + 111 blocks, 24h).
mirror_admission_activation.MIRROR_ADMISSION_ACTIVATION:
  BTC:testnet 153222 -> 153300 (train + 79 blocks, 17h)
  DOGE:testnet 67911796 -> 67916857 (tip + 5796 blocks, 41h)
mirror_admission_activation.MIRROR_ADMISSION_CONSUMER_ACTIVATION:
  BTC:testnet 153266 -> 153328 (producer + 28 blocks, 6h)
  DOGE:testnet 67912575 -> 67917706 (producer + 849 blocks, 6h)
anchor_reward_activation.ANCHOR_ATTEST_BARRIER_ACTIVATION.testnet:
  153266 -> 153328 (rides the same instant as the BTC consumer)

LTC:testnet stays null under dq4 (a) and is untouched by this reslide;
that carrier state was already landed on develop by a separate lane.

This is the canonical copy (xchain-documentation). Five follow-on briefs
propagate the identical shared-block edit to xchain-indexer, xchain-hub,
xchain-sync, xchain-explorer and xchain-sdk, plus a sixth brief that
proves the six-way byte-twin sha256 once all six carriers land.
Adds AMOUNT_REPRESENTABILITY_ACTIVATION, DISPENSER_FRESHNESS_SHAPE_ACTIVATION,
PRICE_ZERO_VALIDITY_ACTIVATION and PRICE_BATCHING_FLOOR_ACTIVATION to
protocol/constants.js and exports them, so a gate that has no mainnet date is
still discoverable from the canon.

generate-flag-days.js now reads protocol/constants.js as a second source and
renders every published *_ACTIVATION name into protocol/flag-days.md, and
test/flag-day-literals.test.js pins the four new maps value-identical to the
indexer activation registry.

No activation-height value changes: the v0.20.1 re-slid BTC, DOGE and LTC
heights are untouched.
pull_request now targets develop as well as master, since
xchain-documentation is the one repo whose contributor flow opens PRs
against develop. The xchain-indexer sibling checkout is now skipped on
a fork pull request so the rest of the suite still runs there with
siblings absent, instead of the job failing outright.

Operator ruling 2026-09-12, option a.
…n action above the indexed tip

The explorer answers a lookup above its indexer's committed action index with a 404 carrying this code, indexed_through and a Retry-After header, and the registry coverage test requires every emitted code to have a row here.
Document the current miner block-size limitation and direct contract testing to Litecoin or Dogecoin testnets.
Validator pages agree on whether cross_chain needs a coin node, the decoder's
valid action list includes XBRIDGE, action counts match the SDK's 32, the
release train roster matches the thirteen-component trains, and the VM pages
describe isolated-vm's prebuilt bindings. The action-count claims test pins
the new figures.
…ide claims against the shipped code

Covers the node stop and drain pairing, the six consensus lint gates and the
two undocumented advisory rules, the banned-Math matcher forms, the
stake-snapshot proof error codes and their registry coverage, FILE.GATE_TICKER
caret handling, the vote binding-callback preamble, controller-binding rules
for bridged tokens and BET feeds, the guard-gas scope, the royalty timestamp,
regtest miner poll cadence, health exemption and heartbeat default, and
user-guide claims about list locks, escrow payout legs and XBRIDGE.
… licensing carve-out, correct stale protocol claims

Adds the hash and size file-entry rows with a bidirectional schema coverage
gate, documents the second envelope carrier flag height, the contracts MIT
carve-out and the rollcall gate count, fixes the envelope chunking vector
length, the SECURITY.md key reference, the action-manifest flag pointers and
the clear-reorg-halt guidance, and gates the reference-impl registry entry.
…orrect its conformance premise

The three reference-impl consensus headers cite their real paths under
reference-impl/consensus and name xchain-indexer as the canonical copy, byte-
identical to the other five repos' twins.
Close the API 30 handset as a verification venue and retain it only for biometric unlock and real-camera QR coverage.
…ervice emits

operations.md's GET /utxos/:address example showed "amount": 1, a bare
number. address_queries.js derives it via satoshiToDecimalString(value),
an 8-decimal-place string ("1.00000000"), served verbatim by the public
get_utxos RPC.
…margin

Ruling 2026-09-23: the live testnet tips have passed every height the
2026-09-19 reslide armed, so re-slide to 40 hours of margin to the
nearest armed height at the fastest defensible cadence, keeping the
prior spacing (producer 17 h above train, each consumer 6 h above its
producer, the DOGE producer at the same instant as the BTC producer).

Measured live at 2026-09-23T15:55Z: TBTC tip 153698, least-squares
bound cadence 383.04 s/block. TDOGE tip 67924122, median cadence 11
s/block.

train_activation.TRAIN_ACTIVATION['0.20.0'].testnet: 153221 -> 154074
(tip + 376 blocks, 40h).
mirror_admission_activation.MIRROR_ADMISSION_ACTIVATION:
  BTC:testnet 153300 -> 154234 (train + 160 blocks, 17h)
  DOGE:testnet 67916857 -> 67942777 (tip + 18655 blocks, 57h)
mirror_admission_activation.MIRROR_ADMISSION_CONSUMER_ACTIVATION:
  BTC:testnet 153328 -> 154291 (producer + 57 blocks, 6h)
  DOGE:testnet 67917706 -> 67944741 (producer + 1964 blocks, 6h)
anchor_reward_activation.ANCHOR_ATTEST_BARRIER_ACTIVATION.testnet:
  153328 -> 154291 (rides the same instant as the BTC consumer)

LTC:testnet stays null under dq4 (a) and is untouched by this reslide.

This is the canonical copy (xchain-documentation); the identical
shared-block edit lands on the same branch name in xchain-indexer,
xchain-hub, xchain-sync, xchain-explorer and xchain-sdk, byte-identical
across all six carriers.
operations/releases.md still stated the original v0.20.0 testnet
activation heights (train 153116, mirror admission 153222/153266,
DOGE 67911796/67912575), which the fleet never reached before two
in-flight v0.20.1 reslides moved them. Split the section so it keeps
the heights v0.20.0 actually shipped at cut and adds the heights
v0.20.1 currently arms, read from
protocol/reference-impl/consensus/gate_registry/shared_rows_2.js and
shared_rows_5.js: train 154074, BTC producer/consumer 154234/154291,
DOGE producer/consumer 67942777/67944741, ANCHOR_ATTEST_BARRIER_ACTIVATION
154291, and LTC:testnet null under dq4 (a).
The bulk-sync directory was renamed to bulk_sync in the source tree; update the architecture citation to match.
Replace the opaque dq4 (a) decision shorthand with a public
explanation for leaving LTC:testnet mirror admission disabled on this
train. Comment and prose text only; no activation values changed, and
the reference-impl gate rows stay byte-identical to the other five
carriers.
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. Updates operations/releases.md, protocol/constants.js and the
reference-impl gate rows, which stay byte-identical to the other five
carriers.
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