Skip to content

Release v0.20.1 - #49

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

jdogresorg merged 49 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

  • Derives service shutdown timeouts from the node stop budget and reports non-zero drain exits as failures.
  • Preserves branch installs, reports update refusals, removes the obsolete indexer migration path, and fixes the decoder clear-script path.
  • Routes runtime environment reads through configuration and separates hub config polling from feed routing.
  • Splits CLI, module-operation, validator-stake, migration-scan, and config-service responsibilities while expanding SQL safety and reset coverage.

Sibling release PRs

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

Move migration scanning and ledger reads behind the service facade. Preserve migration guard behavior while reducing oversized file and function counts.
Use the migration scan reader when callers omit injected dependencies. Add a regression test that exercises the production default path.
Render a private HUB_CONFIG_URL independently of the indexer feed endpoint. Preserve the private hub key for config polls while allowing per-stack credential overrides.
Move migration precondition registrations into focused suite parts while preserving shared hooks. Keep title pin coverage and async execution order unchanged.
Extract module-scope helpers for shared, per-coin, validator, and bitcoin checks. Preserve hook count, test order, fixtures, assertions, and synchronous execution.
Extract path precedence, capability detection, and refusal test registration into synchronous module-scope helpers. Preserve test callback text, title order, and await behavior while lowering the oversized-function count.
Move CLI and operation environment reads behind live config accessors while preserving names, defaults, coercion, and timing. Keep the decoupled structure gate at the existing signer-only baseline without widening exemptions.
MT3 needs one dispatched run that covers bitcoin, litecoin and dogecoin
against a named ref. The schedule trigger already covers all three coins
but never takes a ref, and a dispatch could name a ref but only one coin.
Add coin: all to the workflow_dispatch choice input and extend the matrix
expression so all expands to the same three-coin array the schedule uses,
while every existing single-coin choice and the scheduled behaviour are
unchanged.
…case path

xchain-decoder renamed src/clear-reorg-halt.js to src/clear_reorg_halt.js;
the clear-reorg-halt command runs that file inside the decoder container
by path. Re-applied at the current location of the function and its
test, module_operations/module_controls.js, after the module_operations
split moved both off the file this fix originally touched.
The two regtest cases pushed the coin-wallets describe past the 60-line
readability limit, which the code-structure gate refuses on push. Same
assertions, own block.
…e sweep

Generated block: do not hand-edit it. Change the tier config and re-run the
tier wirer, which owns both this file and the hook so the two cannot drift.

The pre-push venue gate ran the whole GitHub transcript on every push, coverage
re-runs and perf scenarios included. That is the right set to grade a release
with and the wrong set to pay for on every push, especially while three venues
serve every repo on the platform: a long gate does not just cost its own
minutes, it forms a queue behind itself for every other session pushing that
hour.

A push now grades the fast tier. The tiers named in the generated block move to
the scheduled full sweep, which already runs against every repo every three
hours and before any release or deploy, so nothing stops being graded.

The verdict line is rewritten with it, which is the part that matters: a fast
run can no longer print "all tiers green (same set GitHub CI runs)". It prints
which tiers were deferred and states plainly that they were NOT graded there,
so a fast green can never be mistaken for a full one. The dispatcher's verdict
cache is keyed on repo + sha + cmd, so a fast green cannot stand in for a full
one either.
… stop

stopContainerByName now carries the container's exit code out, and a
non-zero exit other than a kill warns and names the service's own drain
timer, so an overrun drain that exits 1 no longer reads as clean. The
killed-branch text explains that raising the per-service stop override
alone does not lengthen the drain, and operations.md documents the pairing.
…op budget

The node forwards SHUTDOWN_TIMEOUT_MS as its stop budget minus 20 s unless the
module config sets it, so the drain always fits inside the stop; defaults keep
100000, and a container not yet recreated gets a warning.
Give the real-shell freshness probe a scoped timeout for cold macOS proxyquire loads while keeping the test file within its structure budget.
The regtest grace list predates the bridge-family barriers, so an armed regtest
indexer kept their 120 s frozen grace. A bitcoin-only venue never finalizes a
transfer and never paid for it; the litecoin and dogecoin legs get their gas
over the bridge, so after the first transfer every block past the newest
effective_time was deferred eight times, about 2m10s, before it parsed. On
nightly run 35829816064 every e2e step on those legs took about 130 s against
about 10 s on bitcoin, and both legs hit the 360-minute job budget.

HUB_SYNC_BRIDGE_GRACE_S and HUB_SYNC_POLICY_GRACE_S now join the other six in
the regtest passthrough and default to 0 there; the indexer still ignores both
off regtest. The nightly pins them to 2 s beside the anchor-attest grace.
The MT3 matrix ran each coin's full action suite on one runner: 3h14m on
bitcoin (run 35605562229), and the two-stack litecoin and dogecoin legs hit
the 360-minute ceiling. A plan job now splits test/actions into five
weight-balanced groups (scripts/e2e_shard_plan.js, weights measured off that
run), each e2e-shard (<coin>, <n>) job boots its own stack and runs only its
groups through e2etest's existing testName argument, and shard 1 also runs
security and performance.

The per-coin aggregate keeps the old job name e2e (<coin>) and artifact
e2e-logs-<coin>, so preflight.js and judge-matrix.js read the run unchanged.
It fails its coin unless every planned shard uploaded, exited 0, ran tests
and failed none (scripts/e2e_shard_merge.js), then writes one bannered action
log with the summed summary last and keeps the raw shard logs as .log.txt.
@jdogresorg
jdogresorg merged commit 77c6ad2 into master Sep 24, 2026
7 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