From b65e0b00b59d3b40625e640fd9a767fbc8b1d1f8 Mon Sep 17 00:00:00 2001 From: Bitcoin Universe Date: Fri, 18 Sep 2026 07:18:27 +0000 Subject: [PATCH] feat(explorer): name the TAP coverage limitations the backend can now report The backend derives TAP limitation reasons from the coverage dimensions the authority publishes instead of emitting fixed text, so it can now report pending-protocol-coverage-partial, pending-protocol-coverage-unknown and reorg-evidence-unknown. describeChainReason already falls back safely for an unknown code, but it returns kind 'unstated', which reads as no reason given rather than as a stated limit of the authority. These three are limits and are now written as such. Refs WP04 step 4 and WP05 step 1. Co-Authored-By: Claude Opus 5 --- .../multichain-explorer/chain-reasons.spec.ts | 6 ++++++ .../universe/multichain-explorer/chain-reasons.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/frontend/src/app/universe/multichain-explorer/chain-reasons.spec.ts b/frontend/src/app/universe/multichain-explorer/chain-reasons.spec.ts index 170f4c1bba6..230ca58aab2 100644 --- a/frontend/src/app/universe/multichain-explorer/chain-reasons.spec.ts +++ b/frontend/src/app/universe/multichain-explorer/chain-reasons.spec.ts @@ -17,6 +17,12 @@ describe('describeChainReason', () => { // faults they describe an outage that is not happening. expect(describeChainReason('pending-protocol-coverage-unavailable').kind).toBe('limit'); expect(describeChainReason('reorg-evidence-tail-only').kind).toBe('limit'); + // The backend derives these from the authority's published coverage + // dimensions, so each one must read as a stated limit rather than fall + // through to the unstated wording. + expect(describeChainReason('pending-protocol-coverage-partial').kind).toBe('limit'); + expect(describeChainReason('pending-protocol-coverage-unknown').kind).toBe('limit'); + expect(describeChainReason('reorg-evidence-unknown').kind).toBe('limit'); expect(describeChainReason('protocol-authority-unavailable').kind).toBe('fault'); }); diff --git a/frontend/src/app/universe/multichain-explorer/chain-reasons.ts b/frontend/src/app/universe/multichain-explorer/chain-reasons.ts index 97537adebe7..7a0ff7b3bc5 100644 --- a/frontend/src/app/universe/multichain-explorer/chain-reasons.ts +++ b/frontend/src/app/universe/multichain-explorer/chain-reasons.ts @@ -123,6 +123,18 @@ const REASON_COPY: Record = { text: $localize`:@@universe.reason.reorg-evidence-tail-only:This authority keeps reorganisation evidence for recent blocks only, not for the whole chain.`, kind: 'limit', }, + 'pending-protocol-coverage-partial': { + text: $localize`:@@universe.reason.pending-protocol-coverage-partial:This authority sees some pending transactions but not all of them, so a missing one does not mean it does not exist.`, + kind: 'limit', + }, + 'pending-protocol-coverage-unknown': { + text: $localize`:@@universe.reason.pending-protocol-coverage-unknown:This authority has not stated what pending coverage it offers, so none is assumed.`, + kind: 'limit', + }, + 'reorg-evidence-unknown': { + text: $localize`:@@universe.reason.reorg-evidence-unknown:This authority has not stated what reorganisation evidence it keeps, so none is assumed.`, + kind: 'limit', + }, 'protocol-qualification-pending': { text: $localize`:@@universe.reason.protocol-qualification-pending:Protocol qualification has not been established.`, kind: 'fault',