Promote: the tracker panel holds one size, and the ZRC-20 ledger reaches a page - #31
Merged
Merged
Conversation
Live at /zcash/protocols/zrc20 right now, in a table cell:
rulesets
{"zord":{"max_supply":"21000000000000000000000000","mint_limit":"10000000
00000000000000","minted":"21000000000000000000000000","burned":"0",...
The authority indexes every ZRC-20 token twice, once under `zord` and once
under `zecscriptions`, publishes both ledgers, names the fields the two
disagree on, and carries prose about rules that neither reading evaluates. None
of it reaches a page: `rulesets` is an object of objects, the fact reader stops
one level above the figures, and a table cannot hold a structure. The whole
ledger for all 159 tokens is a field the page declines to show.
This is the reading. Three rules hold it.
Quantities are shifted by the token's own `decimals`, and the kinds are an
allowlist rather than a pattern. A pattern is what printed a DRC-20 supply of
100000000000 as `1,000 DOGE` by matching a field that was not an amount, and
the opposite mistake is available here: `max_supply` of
21000000000000000000000000 is twenty-one million with eighteen decimals applied
and twenty-one septillion without. `holders` is a number of things and is never
shifted at all. A token whose `decimals` cannot be read as a plain non-negative
integer shows no amount rather than an unshifted one, because a wrong quantity
is worse than a missing one and there is no partial credit for being close.
A ruleset field this build has no kind for is named, not dropped. Reproducing
the defect this reading exists to fix, one level further down, would be worse
for being deliberate. `mint_progress` is skipped by name instead, because it
restates two figures already shown and is not something the page cannot read.
Where the readings disagree, both figures are kept, lens first. For ZERO they
agree on every quantity and disagree only on how many mints count and therefore
on how many holders there are: zord 21,120 and 2,330, zecscriptions 21,000 and
2,539. Choosing one would be the explorer inventing a consensus the chain does
not have.
Divergence is observed from the figures and kept apart from what the authority
says diverges, so a summary drifting from the data behind it stays visible
rather than being taken as the data.
The spec is `/api/v1/zcash/protocols/zrc20/ZERO` as it answered on 2026-08-29,
carrying only the fields this reading looks at, with the spellings, nesting and
digits unchanged. A fixture written in the shape we expected is how this became
a field the page declined to show.
This commit is the reading and its spec only. The pages that render it follow.
The transaction route was the one route over the layout budget, at 0.103 on develop and 0.108 with the mobile shell, and it was over for a single shift. The panel under the tracker bar painted at 46 pixels with its rows empty. At about three seconds, when the transaction's own data arrived, two rows appeared in it and it grew to 193. The bottom panel is flex-grow inside a viewport-height column, so it took that as a move and a shrink at once, 148 pixels of each, and that one shift was the whole figure. Reserving the room needs one height, and the note recorded with the exception said the states did not have one. Measured at 390 by 844 they nearly do. A pending transaction settles at two 48px rows, first seen and an ETA. A confirmed one settles at 72 and 68, because below 992px the confirmed timestamp puts its relative time on a second line and the confirmation count is a button rather than a line of text. The replaced shape the note also listed is not on this path at all: this.replaced is only ever set from the txReplaced socket event, so a cold load never starts there. So the row gets the reservation rather than the block. Every row in the panel is two lines of value tall, because the tallest of them is: 4.5em a row, 9em for the pair, held by the block itself so the box survives the waiting state that has no rows in it, and filled by skeleton rows while the transaction is being read. Rows taller than their content centre it, because baseline alignment pins the label to the value's first line and left "Confirmed at" sitting above the relative time instead of beside the pair of them. Measured after, on the same throttle: loading, pending and confirmed all settle at panel 197.3, data 144, rows 72 and 72, bottom panel top 440.7. Nothing moves. The route reads 0.001, twice, against 0.108. The pending panel is 48 pixels taller than it was, which is the cost the old note asked to have measured, and the live pending to confirmed transition no longer jumps 44 pixels at the moment the tracker exists to show. The recorded exception goes with it. The debt table keeps its mechanism and its reasoning and is now empty. The design system records the rule rather than the exception, and the two paragraphs there that still described the performance gate as it was before the runner fix now describe what it does. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The reading model existed and nothing called it. The list page fell through to the generic table, which named rulesets and divergence as structures it was holding back, and the token page dumped the same ledger as a JSON string in a cell. Now the token page states the decimals once, shows every figure under each ruleset side by side, marks the rows where the readings disagree, cross-checks the authority's own divergence summary against the figures, and carries the authority's prose about rules neither reading evaluates. The list page shows four chosen figures per token, names the five it holds back, stacks both readings in any cell where they disagree, and links each token to its page, which nothing did before. The fixtures are captured from the live origin, trimmed and otherwise unedited, and the model checks assert invariants rather than values: an amount is shifted only by the token's own decimals, a count is never shifted, and divergence is observed from the figures rather than trusted from the summary. The visual matrix gains both pages as gated routes, with a fixture token whose readings disagree, one that agrees, and one with zero decimals. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The registry lists dunes, the capability document reports it, and the chain navigation omitted it: the coverage panel could only say there was no page to open. Now there is one, and it does not run the ledger through the generic table, because a dune's arithmetic is 128-bit and each dune carries its own divisibility. The generic path would have shown supplies unshifted or, worse, shifted by Dogecoin's eight decimals, which is the DRC-20 supply mistake with a different name. The catalog page shows supply, mints and burned per dune, names the figures it holds back, and links each dune to its page. The dune page states the divisibility once, shifts every quantity by it and never by the chain's decimals, keeps counts unshifted, renders the etching as a link and the mint window as a verdict, and names any field this build has no kind for. A dune whose divisibility cannot be read shows no shifted quantity at all. The visual matrix gains both pages as gated routes, with an open mint, a closed one with no symbol, and a zero-divisibility dune whose unshifted figure is on the page deliberately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-its-rows The tracker panel moved the page when the transaction arrived
The Dogecoin and Zcash mempool pages were a table beside a Bitcoin page that draws projected blocks. Copying that projection would be false in the units and in the claim, so the cubes here draw the weaker statement the overlay actually publishes: candidate buckets, grouped under each chain's own fee rules, with the semantics stated above the row. Dogecoin's cubes are the pending set ordered by fee per kilobyte, and the copy says they are not a forecast. Zcash's cubes are ZIP-317 eligibility tiers, labeled as verdicts each transaction carries on its own, because its block producers select randomly and drawing a queue would invent a consensus. The cadence line names the chain's target spacing and never a countdown; colors map each bucket's own quantiles onto the theme ramp by position, because absolute thresholds in koinu/kB or zatoshi-per-action would be numbers this explorer made up; a disclosure id this build has no copy for renders as its id rather than vanishing. The cube grammar itself is the Bitcoin one: the same face, skewed top and side, and projected-block palette, so the product reads as one thing across chains while each chain keeps its own truth. The bucket request failing renders no cubes and the list stands alone; the fixture states keep the cubes and the list in agreement, including an empty pending set and an authority outage. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
|
Coordination (session mempool-34): I have PR 20 (ZRC-20 pages) finishing its frontend build now, with two stacked branches behind it (feat/dunes-presentation, feat/candidate-cubes) and a batched explorer+overlay release planned after they merge. No conflict with this promotion; if you are cutting a release for the tracker fix, go ahead - I will promote and cut a single combined release afterwards rather than racing it. Claiming the next release lane after this promotion merges. |
The ZRC-20 ledger is a JSON string on the live site
The chain protocols page fell through to the generic path: the registry manifest as a seven-column table, and each authority's operational record flattened into facts like "Confirmed history configured: No" beside "blockbook-unconfigured", which left a reader to reassemble the sentence themselves. Every one of those facts is kept and given its place. The manifest is a designed table: each protocol with its page, its release verdict in the registry's own vocabulary translated without being softened, the authority that serves it, and its coverage. Below it, each authority reports about itself verdict first: what it is, whether it answers, the block it stands at, when it last answered, and any failure under the exact code the source reported, because a paraphrase cannot be checked against the service and the code can. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dunes pages, and cubes for the pending set under each chain's own fee rules
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes
develop(d124f4f9f) tomain.What ships
Two lanes, both merged into develop and green there.
#29, the transaction route's layout shift. It was the only route over the layout budget, and it was over for one shift. The tracker panel painted at 46px with its rows empty, then grew to 193px when the transaction arrived, pushing
div.bottom-paneldown 148px and shrinking it by the same. Every row in that panel is now reserved at two lines of value, so the loading, pending and confirmed states all settle at the same box and nothing below moves.#20, the ZRC-20 ledger. The whole ledger for every token, under two disagreeing rulesets, was a JSON string in a table cell that the page declined to show. It now reaches a page under both readings.
Measured on the live origin before this promotion
Against
https://explorer.bitcoinuniverse.iorunninge21a26d5c, at 390x844 with the processor throttled four times, on a real confirmed transaction:That is the defect this promotion removes, reproduced on production rather than on a fixture. The same check is the post-deploy verification: it fails today and must pass after cutover.
Validation
Both source pull requests carried the full suite green, including the deep visual matrix, the mobile and adaptive layout job that runs the performance gate, and WebKit and Firefox. The performance gate after the tracker change, full route set:
The recorded layout exception on
txis removed.KNOWN_LAYOUT_DEBTkeeps its mechanism and is now empty, so the route is held to the plain 0.1 budget rather than to a recorded figure.Compatibility
Frontend templates, stylesheets and a reading module, plus a CI gate and documentation. No API, schema, migration, dependency or protocol rule is changed, so no indexer or overlay release is required. The overlay stays on
backend-apis-5e2f6b1e.Production faults fixed on the host alongside this
The hourly production smoke has failed since 2026-08-29 on
index-doge-tap is configured but published no checkpoint. Three stacked faults, diagnosed and recorded in index-doge-tap#24:http://127.0.0.1:3013against a TLS listener, so every probe got an empty reply and the authority was published asunreachable. Corrected to the certificate's own SAN name over loopback, with the certificate added to the overlay's trust rather than verification being turned off.503 Canonical authority snapshot is unavailable, because the TAP builder proves custody against ord inscriptions and the replacement Ord-Dogecoin index is mid-rebuild at block 5,782,213 against Core's 6,353,213, advancing. No checkpoint is achievable until it reaches the tip, and the reindex is not interrupted.The authority now reports
degradedrather thanunreachable, which is the truthful state. Every other synthetic check passes. That one check stays red on purpose: turning it green today would mean either withdrawing a protocol we intend to serve or interrupting the reindex.🤖 Generated with Claude Code