Skip to content

Release v0.12.0 - #12

Merged
jdogresorg merged 7 commits into
masterfrom
release/v0.12.0
Aug 31, 2026
Merged

Release v0.12.0#12
jdogresorg merged 7 commits into
masterfrom
release/v0.12.0

Conversation

@jdogresorg

Copy link
Copy Markdown
Contributor

Cuts xchain-decoder for the v0.12.0 release train. 7 commits from master.

Added

  • ROLLCALL is decoded from the wire.

Fixed

  • The MariaDB connector moves to 3.5.3, closing three high-severity advisories against the pinned 3.5.2.
  • RPC faults keep their identity, and tuning environment variables go through the shared validator.
  • A halt the service cannot record no longer passes unnoticed.

Changed

  • Service logging routes through the shared log shim, one line per console call.

…through the shared validator

Review round 2026-08-29 (xchain-platform board 161 -> 0).
The service logged free text through bare console calls, so its lines carried
no level, no timestamp and no service tag, and LOG_LEVEL and LOG_FORMAT changed
nothing an operator could see on any box.

patchConsole() goes at the very top of the entry file, above the env-validation
gates. Those gates run hundreds of lines before the existing wiring point, and
their failures are among the lines an operator most needs framed. The shim's
vendored copy is re-synced from the canonical module in xchain-hub in the same
change, which brings the credential scrub that catches prefixed names like
SERVICE_DB_SECRET= and the token after Bearer.

The test bootstrap sets XCHAIN_LOG_PATCH=0 so the suites keep seeing stock
console regardless of require order.

Where this repo carries its own ported copy of the observability or metrics
suite, it is re-ported from the canonical one rather than hand-edited, per the
note those files carry. Two contract changes travel with it: the metrics
registry is always constructed and only the endpoint stays gated, so a counter
registered by a module exists on the default fleet instead of nowhere; and an
identical metric re-declaration returns the registered metric rather than
throwing, while a different shape still throws.

READMEs gain the shim-control env table.
The halt path returns without writing a marker when the database layer has no
markReorgHalted, and returned without saying anything either. The write FAILURE
one line below was already logged; this branch is the genuinely silent one, and
it is the worst case in the set: a decoder decides to stop, cannot persist why,
and /status, /live and the JSON-RPC health method all go on reporting no halt.
It now emits a REORG_HALT record carrying the reason and depth it was about to
record, and says plainly that the marker could not be persisted so the health
surfaces will not report it.

The crash record carries the halt state, so a crash during a halt is
distinguishable from an ordinary one, and an uncaughtException handler joins
the rejection handler that was already there. The rejection handler still logs
and continues; that choice is deliberate and unchanged. Both are registered
inside startApi, because several suites require this module in-process under
mocha and a module-scope exit would abort the run instead of failing one test.

Six health-route catches swallowed their cause, five of them empty. If the halt
probe threw, the routes reported no halt: a halted decoder that reads healthy.
They now log at warn, throttled per probe and route, with the suppressed count
on the next line. Without the throttle a database outage turns the rate
limiter's ceiling into more log volume per hour than this service normally
emits in a day, which would eat the retention window the caps are sized on.
Control flow and status codes are untouched.

In db.js, one catch of ten now logs: the temporary-table drop, which is the only
one whose failure lands on a different, later query, so the next mempool diff
fails on a table it did not create with nothing naming the drop that lost. The
nine connection releases stay silent on purpose, reasoned at the site.

The prose crash lines are gone. Each duplicated the record beside it, and a
collector reading warn and above would file one crash as two findings. Nothing
in the tree greps either string.
Adds ROLLCALL to VALID_ACTION_NAMES and re-vendors the action manifest.
Without it every roll call on DOGE is dropped at decode, silently, which
would evict the whole federation once the BTC close starts asking.
Allowlist is 36 and identical to the manifest wireDecoded set.
Suite: 1426 passing, 11 pending, 0 failing.
…ne line

Picks up the canonical fix: a trailing error argument expanded across lines and
only the first line carried the timestamp, level and service, leaving every
line after it an orphan with no operation, no error and no coin. The breaks are
escaped now; the stack still ships on one line.

Vendored copy, not edited here. Behaviour changes belong in the canonical
module first.
@jdogresorg
jdogresorg merged commit 9f33333 into master Aug 31, 2026
8 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