Skip to content

Release v0.26.0 - #63

Merged
jdogresorg merged 63 commits into
masterfrom
release/v0.26.0
Oct 20, 2026
Merged

jdogresorg merged 63 commits into
masterfrom
release/v0.26.0

Conversation

@jdogresorg

Copy link
Copy Markdown
Contributor

What this release carries

Added

  • Proved a DOGE- or LTC-origin bridge escrow at the checkpoint after the hub's BTC anchor.
  • Added the attestation response batch lookup index.

Changed

  • Armed exact-integer wire fields on regtest from genesis by default.
  • Wired the legacy anchor reward pins into derivation.
  • Bounded capability proof waits to observed holds and released quiet call barriers on stream progress.
  • Disclosed batch preflight payment totals.

Fixed

  • Released a diverged escrow proof once the checkpoint stream has stopped.
  • Failed closed on an incomplete checkpoint twin.
  • Guarded archive head re-issue and fixed barrier, dry-run and fee paths.

Testnet activation

  • BRIDGE_ESCROW_ANCHOR_MATCH_ACTIVATION on BTC:testnet at height 157235
  • BRIDGE_ESCROW_ANCHOR_MATCH_ACTIVATION on LTC:testnet at height 4930600
  • BRIDGE_ESCROW_ANCHOR_MATCH_ACTIVATION on DOGE:testnet at height 68012800
  • BRIDGE_ANCHOR_PROOF_READY_ACTIVATION on BTC:testnet at height 157235
  • BRIDGE_ANCHOR_PROOF_READY_ACTIVATION on LTC:testnet at height 4930600
  • BRIDGE_ANCHOR_PROOF_READY_ACTIVATION on DOGE:testnet at height 68012800
  • EXACT_INTEGER_EXPIRATION_ACTIVATION on BTC:testnet at block time 1792605600
  • EXACT_INTEGER_EXPIRATION_ACTIVATION on LTC:testnet at block time 1792605600
  • EXACT_INTEGER_EXPIRATION_ACTIVATION on DOGE:testnet at block time 1792605600
  • DISPENSER_WIDE_EXPIRATION_GATES on BTC:testnet at block time 1792605600
  • DISPENSER_WIDE_EXPIRATION_GATES on LTC:testnet at block time 1792605600
  • DISPENSER_WIDE_EXPIRATION_GATES on DOGE:testnet at block time 1792605600

Release v0.26.0

Base: master at 64a281981203572c3e1f85f43150b9dcf224f2f5
Head: release/v0.26.0 at 33ef89d5137e44960aa4b84e2329fb1c28324ec6

Landed refs

  • 33ef89d Release v0.26.0
  • 89e7e78 Merge: Keep the SDK CI fix narrowly scoped
  • 54acccd Move the pre-flight map snapshot to the SDK commit that pins the current handlers
  • 25429f5 Keep the SDK CI fix narrowly scoped
  • dab601e Use the current SDK map in local CI
  • 8b84beb Fail closed on an incomplete checkpoint twin
  • b908dc4 sync trunk
  • 52a8236 Refresh the generated pins
  • 04d457e Merge: Remove unrelated documentation edits
  • 6e60e2f Remove unrelated documentation edits
  • ca9f72c Record green fast CI verification
  • 9a8b12d Add the attestation response batch lookup index
  • b3d8ba0 Merge remote-tracking branch 'origin/develop' into rr/review-round-1020
  • e49fc3e Guard archive head re-issue and correct barrier and gate docs
  • cb86284 Merge: Keep batch payment probes outside mapped handlers
  • b79ae6a Keep batch payment probes outside mapped handlers
  • f8bfde2 sync trunk
  • 1283f84 Disclose batch preflight payment totals
  • 5eacd67 Check the hub admission columns against its dated migrations and move the pre-flight map snapshot to the current SDK
  • 6cc9e63 Refresh the generated pins
  • 62c944c Merge: Record legacy anchor reward activation evidence
  • 1414e55 Record legacy anchor reward activation evidence
  • 7dd9b0d sync trunk
  • 0a86166 Wire legacy anchor reward pins into derivation
  • 5344010 Regenerate the sibling reference map against current develop trees
  • cbe16fd Merge: Resolve the exact-integer regtest arming in one local reader
  • 0fd1c42 Resolve the exact-integer regtest arming in one local reader
  • cfb9a8e Read the exact-integer regtest arming through the shared override
  • 3bfbcb8 Arm exact-integer wire fields on regtest from genesis by default
  • 982a9ca Merge remote-tracking branch 'origin/develop' into hand/coverage-timeout
  • 4eea252 Refresh the suite title pin
  • 7372012 Give the coverage job room for its measured nine to fourteen minute runs
  • 17a2c48 Give proof waits their own stall grace and fix barrier, dry-run and fee paths
  • 9a581e0 Merge remote-tracking branch 'origin/develop' into hand/indexer-cleanup
  • c96507e Load the production DDL from src/sql in tests that seed a production table
  • 352779c Pin the suite titles of the new utf8mb4 inventory sync test
  • 7c1e8f6 Drop the legacy manual migrations directory and keep the migration rules beside the runner-tracked files
  • 5365f6a Mark the utf8mb4 inventory canonical and add a sync check for the xchain-sync copy
  • 25ae681 Merge: Release quiet call barriers on stream progress
  • 74f41bb Merge: test: drop the leftover relay lifecycle monolith case
  • 882f6ea Release quiet call barriers on stream progress
  • 0b425e2 test: drop the leftover relay lifecycle monolith case
  • bbeee47 Merge: Bound capability proof waits to observed holds
  • 7dae1f8 Bound capability proof waits to observed holds
  • bdb1085 sync trunk
  • 8d475e6 Release a diverged escrow proof once the checkpoint stream has stopped
  • 0056c0e sync trunk
  • 1993be7 Prove a DOGE- or LTC-origin bridge escrow at the checkpoint after the hub's BTC anchor
  • e970ef5 Read the validator-stats repair tool's database settings by name
  • ab7f26c Name the genesis dump module with its extension so the moved script's path resolves as written
  • 5b6d238 Merge: Move maintenance scripts into bin
  • 2836e70 Merge: Move Stryker config under mutation tests
  • b56a306 Move maintenance scripts into bin
  • b333244 Move Stryker config under mutation tests
  • c3deebb Merge develop into the v0.25.0 back-merge
  • 616bc83 Merge master (v0.25.0 release) back into develop
  • 3467781 Merge: Stabilize cross-repo drift and relay tests
  • 798d8a7 Log why a mirror-resolved capability snapshot row is still held
  • 2dd5b21 Accept the regtest seeded validator row in capability snapshot proofs
  • 6602f4f test: distinguish relay lifecycle lookup coverage
  • 6f95cb5 test: remove duplicate relay lifecycle title
  • d306aae Stabilize cross-repo drift and relay tests
  • 03db144 Open a sixth indexer registry part file for the newest gate rows

Move the seven rows registered after match_origin_open_activation from gates_5.js into a new gates_6.js, loaded from the entry right after gates_5.js on the same line, so registration order and every row value are unchanged. Allow 23 part files in the assembler guard, re-pin protocol_changes in the carrier logic pin, and regenerate the consensus identity pin, where only the carrier logic digest moves.
Pin ordinary develop pre-flight checks to the reviewed SDK handler map so cross-repository landing order cannot change the verdict. Give each relay identity describe block its own schema so table fault and migration cases cannot leak ordering state.
Keep the terminal lifecycle coverage in the request-id split while dropping the redundant origin-monolith case and its unused connection binding.
Keep the origin lookup assertion while giving it a title distinct from the request-id split coverage.
A single-hub regtest stack seeds capability_snapshots with its own key under
source seed:<pubkey> and weight 1. That key is never a BTC stakes_root leaf, so
since the capability snapshot proof gate armed on regtest every LTC and DOGE
indexer refused the row and no bridged credit could land. On an unpinned
regtest venue the seeded row is now accepted when its key signed the snapshot
checkpoint; testnet, mainnet and pinned regtest venues still refuse it.
A held capability_snapshots row stalls an LTC or DOGE indexer's block loop at
the proof barrier, and nothing said why: a 404 or 503 from the hub, or a proof
that does not verify. The reason is now logged once a minute per row. The
verdict is unchanged.
# Conflicts:
#	bin/pins/at1-suite-titles.json
#	src/protocol_changes/gates_6.js
#	test/unit/consensus/capability_snapshot_proof/wiring.test.js
Point the mutation script at the relocated configuration while preserving its repository-root-relative paths.
Update usage text, source references, and unit test imports for the new executable paths.
… hub's BTC anchor

The settle pass compared the hub's BTC-anchor snapshot_block with the origin
checkpoint's block_index, so a lock from DOGE or LTC was proven against the
oldest origin checkpoint and refused on every block. Behind
BRIDGE_ESCROW_ANCHOR_MATCH_ACTIVATION (regtest at genesis, testnet and mainnet
unarmed) those origins now take the first checkpoint whose snapshot_block is
above the row's; the BTC-origin pick is unchanged. Fixes #62.
An origin node whose own state at a checkpoint height no longer reassembles
to the signed state_root answered the divergence error until a later signed
checkpoint matched its state. When the hub stops signing, that checkpoint never
arrives, so the consumer deferred its block forever and every chain waiting on
it stalled. The answer is now also released once the newest signed checkpoint
the mirror holds is about a day of blocks below this node's tip (BTC 144,
LTC 576, DOGE 1440): the node serves its envelope, the consumer refuses it,
and the leg is skipped. A live stream keeps the error standing, so a node on a
minority fork still holds its consumers while the hub signs. The divergence
checks move into db/credits/escrow_divergence.js to keep bridge_reads.js under
the file size limit.
Keep each block-loop waiter scoped to the proof holds present when it begins. Later capability snapshot rows remain held for later passes without extending an earlier wait forever.
Remove the renamed origin-lookup case from the monolith file instead of keeping
it under a new title. Its assertion now runs inside the request-id split's
terminal-state case, so the title exists once and the origin predicate keeps
its coverage.
Allow admission-era call barriers to accept current stream coverage after the hub has published call height evidence. Missing admission evidence remains fail-closed and the call-specific watermark grace remains authoritative.
Unset now means armed from genesis and a positive height arms at that height, matching the decoder and e2e readers.
Unset or empty arms regtest from genesis, a non-negative integer arms it at that
height, and any other value stays unarmed, matching the decoder gate.
Carry the block protocol-change registry through both anchor reward mint paths, re-arm the testnet rule at the forward v0.25.0 instant, and cover the boundary with an unstubbed real-loop test.
Pin the regenerated flag-day reading and the public testnet history boundary used to choose it.
… the pre-flight map snapshot to the current SDK

The hub retired src/db/schema/columns.js and its migrateAdmissionColumns map for
ledgered .sql migrations, so the sibling case read a file that no longer exists.
It now reads every admit_block ALTER in the hub migrations and requires exactly the
manifest plus the hub-only set, each nullable.

The drift gate ran against an SDK snapshot older than the reviewed batch handler
pin, so it reported the batch handler as unreviewed drift.
Accumulate native fee and destination-keyed coin obligations in probe-local collectors. Surface those totals through dry-run preflight results while preserving the consensus value ledger, with focused acceptance coverage.
Preserve native fee and coin obligation totals in probe-local weak state, bypass missing COINPAY outputs only for public batch probes, and restore the SDK-mapped handler directories to their reviewed executable shape.
Fixes from a review pass:
- Hub floor ignores invalid/orphan heads by the same author even though the indexer's canonical-head pick for chunks is status-agnostic
- v1 archive heads have no same-author re-issue guard; only the hub's local floor prevents re-publishing different content under a spent seq
- archive_reissue.js header says 'Pure and unwired' but the module is wired into the v3 fold path
- checkReplayGuards comment still describes getNextBatchSeq as a three-table MAX+1
- Height-aware clear-instant helpers claim no clock instant exists above mirror admission, but five barrier predicates keep a stream-watermark clock ...
- Stale locations in header comments for the barrier block loop (protocol_time.js, hub_db_sync.js)
- mirror_barriers.js header says its barriers follow "the price pair"; three price-read barriers precede them
- barrier_mapping test pins only 7 of the 11 waiter-release calls in advanceWatermark and releaseHeightWaiters
- deferOnListShareSync silently skips the barrier when the consumer gate and mirror-admission gate disagree, with no skip-rail backstop
- Relay exactly-once docs claim rejected v3 rows are stored, but persistRelayRequest withholds them
- GenesisDump.scalar's >2^53 fail-fast never fires under the configured pool, so u64 BIGINT values enter the pinned dump already rounded
- Runner and migrate --status ignore ledger rows with no file, so a rename without a registry entry silently re-applies the file
- Stale 'Mirrors ...' pointers between the indexer and decoder migration runners name files that no longer hold the logic
- XSNAPCKPT snapshot-checkpoint canonical twin (indexer→hub) has no CI cross-repo guard: only the indexer pins literal bytes, every hub test checks t...
- AIRDROP review count and 'This airdrop pays N' ignore the token's ALLOW_LIST/BLOCK_LIST, but the indexer credits and prices only approved recipients
- Dry-run surfaces ignore the mainnet pre-launch admission gate, so pre-flight says `valid` for a tx the chain never indexes
- Comments in the dry-run and dispatch code name pre-refactor module files (`batch.js`, `dispenser.js`, `order.js`, `swap.js`, `order_match.js`) that...
- nativeFeeMandatory re-implements detectFeePaymentMode's chain rule instead of sharing it; pre-flight fee mode can silently drift on a flag day
- mirror_tables.js tells maintainers to add new retractable tables to `quorumClass`, which is now a boolean; the real list is QUORUM_CLASS_TABLES
- Orphaned 'signed-retraction verification helpers' comment in watermark_config.js describes a canonical that is not in that file
- Comment on the capability_snapshots trust boundary says non-BTC mirror rows are never checked, but the code now checks them once the activation gat...
- Twin drift-lock checks gathering methods in declaration order but never pins the preimage object's key names or order
- Frozen index-id assignment rule leaves out the transaction-level destination, which processTransaction interns between SOURCE and the value-sorted ...
- ATTESTATION.PROVIDERS overlay feeds consensus decisions but is outside the CONSENSUS_CONFIG_PIN subset
- state_hash comments describe the index-map class as flag-day gated, but the code always includes it (gate retired)
- Time-table comments still say testnet is unarmed for rows that arm testnet
- price_scale_gate.js header still describes a gated legacy pattern after PRICE_SCALE_ACTIVATION was removed
- validator_rewards amount persisted via BigNumber.toString(): sub-1e-7 attest fee shares stored in exponent form ("5e-8")
- getAddressBalances accepts a `tick` argument but ignores it, so single-tick lookups still load the whole ledger
- Auto-migration safety check blocks known-bad SQL commands but lets any unlisted command through as auto-safe
- An auto migration can drop a UNIQUE or PRIMARY key that src/sql still declares, and nothing compares the drop against the declared schema
- bridge_transfers.sql header claims a byte-consistent CREATE TABLE with the 2026-09-12 migration, which later migrations made untrue
- LIST_OWNER_ACTIVATION mainnet moved from the UNARMED sentinel to 0 with no dated ruling or measurement
- changes_5.js comments say 'Unarmed on every network' / 'unarmed on testnet' while the testnet column is armed at 1792303200
- flag_times.js says 'both production networks stay inert' for HOST_CALL_BOUNDS / PER_ELEMENT_METER / STRING_RECEIVER_METER while testnet is armed
- setAttestationResponseBatchIndex adds the batch link to rejected v1 rows, not just the mirror-applied response
- Chunk-columns migration header says the batch columns hash nothing, but a gated state-hash section reads them
- feequotedryrun on a BATCH reports the last sub-command's STATUS (or the first filled match's), not the BATCH row the chain indexes
- withVoteBindingDryRunRefusal only partly mirrors the handler's guard-inert rule (version parse, contract parse, activation gate, earlier rejections)
- setActionParamHandler comment says SWEEP and ISSUE use bespoke parsing, but both parse with util.setActionParams
- Stale prose around the dry-run engine: dryRunAction return doc omits fields; fee_probe pointer names the wrong home
- readBatchResponses filters the hub attestation_responses mirror on batch_action_index, which no index covers, on a public detail path
- Policy-layer code comments that cite controller-bound-tokens.md say ISSUE format 7 and leave out the `all` class
# Conflicts:
#	bin/pins/at1-suite-titles.json
#	src/actions/actions_class/quote_surfaces.js
Create the index for fresh and migrated databases, refresh the generated suite-title pin, and align nearby synchronization and schema invariant documentation with the current implementation.
The required fast CI gate passes on the existing tree. The linked workflow test job also passed when rerun at the same source revision, so no production change is required.
Restore the synchronization and schema comments that were outside the batch lookup index fix.
Distinguish an absent optional hub checkout from a supplied checkout that is missing the snapshot checkpoint canonical module. This prevents the reciprocal drift guard from silently skipping an incomplete cross-repo rollout.
When a clean adjacent SDK checkout is behind its remote-tracking develop branch, run the pre-flight drift check from an archived origin/develop snapshot. Keep equal, ahead, and divergent checkouts on the live path.
Restore the canonical twin test policy to its existing behavior so this change only selects the current SDK map for the local drift gate.
@jdogresorg
jdogresorg merged commit 9fdef1b into master Oct 20, 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