diff --git a/CLAUDE.md b/CLAUDE.md index 9a55d60..85e594d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -402,13 +402,16 @@ nobody: a node visible on the official telemetry site was invisible here. The `/:chain/node` index and `/:chain/node/:peer` route have no entry condition, and the miner panel now links to them rather than being the only way in. -**"Is this the standings?" is one function, not three.** `isStandings` in -`lib/routes.ts`. Adding the node section updated the copies in `SectionNav` and -`windowApplies` and missed the canonicalising redirect in `App`, which judged +**"Is this the standings?" is one function, not four.** `isStandings` in +`lib/routes.ts`. Adding the node section had to update the section nav, the +window selector, the canonicalising redirect and the board's own render +condition — and the first pass caught two of them. The redirect judged `/quantus/node/` to be the standings and replaced it with -`/quantus/3600-blocks` — the route parsed, the page existed, and the address bar -threw it away before it rendered. A new section still has to be added to the -predicate; it now has one place to be added to. +`/quantus/3600-blocks`, and the render condition left thirty unrelated mining +rows under the node. Both were reported rather than caught: the route parsed, +the page existed, the build was green, and only opening it showed either. A new +section still has to be added to the predicate; it now has one place to be added +to. **Telemetry hardware is the node's word, reached by inference.** A miner is joined to a node through the same first-reporter voting that produces its diff --git a/web/src/App.tsx b/web/src/App.tsx index 5a8581e..bcbeba6 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -269,39 +269,39 @@ export default function App() { )} {route.index === 'node' && chain && } - {!route.account && - !route.miner && - !route.block && - route.runtime === null && - route.call === null && - route.event === null && - route.index === null && ( -
-
-
-

The Standings

- - last {activeWindow.blocks.toLocaleString('en-US')} blocks ·{' '} - {measuredSpan(state.windowSeconds, activeWindow.blocks, interval)} - {pinned.length > 0 && ` · ${pinned.length} marked yours`} - -
- -
+ {/* The standings and the live ticker belong to the standings route and + nowhere else. A page that names one subject has that subject as its + whole subject; leaving thirty unrelated mining rows underneath is the + site failing to notice which page it is on. This was the fourth place + spelling out "is this the standings?" by hand — and the one that kept + showing the board under a node. */} + {isStandings(route) && ( +
+
+
+

The Standings

+ + last {activeWindow.blocks.toLocaleString('en-US')} blocks ·{' '} + {measuredSpan(state.windowSeconds, activeWindow.blocks, interval)} + {pinned.length > 0 && ` · ${pinned.length} marked yours`} + +
+ +
-
-
-

Live Blocks

- - {state.summary?.block_interval_seconds - ? `${seconds(state.summary.block_interval_seconds)} apart` - : 'measuring'} - -
- -
-
- )} +
+
+

Live Blocks

+ + {state.summary?.block_interval_seconds + ? `${seconds(state.summary.block_interval_seconds)} apart` + : 'measuring'} + +
+ +
+
+ )}