Skip to content

bench 030 said it used no node, and prod is the page saying it - #3289

Merged
Flotapponnier merged 1 commit into
mainfrom
release/hl-node-attribution-main
Oct 25, 2026
Merged

Flotapponnier merged 1 commit into
mainfrom
release/hl-node-attribution-main

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Cherry-pick of #3286 (dev 79a0411) onto main, so production stops describing a source it no longer uses.

Why this needs to reach prod

The Hyperliquid node substitution merged on 2026-10-07 (#2872) and never ran. The ocb-hyperliquid-frontends image was rebuilt on 2026-10-21 from a source tree on the Paris VPS frozen at 2026-10-07 18:09, hours before that merge: no nodesource.go, and no a.node anywhere in its agg.go. That rebuild refreshed only builders.json, which is why Nova appeared on the site (#3130) and the node figures did not.

The harness was rebuilt from current dev on 2026-10-25 and verified by symbol before the container was touched. Measured through Prometheus either side of the swap:

before after
hl_frontend_volume_usd_7d_v2{builder="fomo"} $263.1M $780.8M (2.97x)
cohort sum(hl_frontend_volume_usd_7d_v2) $1.811B $4.783B (2.64x)
node days in the 30-day window 0 18, plus 10 reconstructions

$780.8M is what the node's own seven complete days give, read independently through the reducer before the rebuild. Production is already serving the corrected figures from the shared Prometheus, or will as its cache cycles. What it is not serving is an accurate description of where they come from, which is what this PR fixes.

What changes

Four statements were accidentally true for as long as the binary was stale and are false now: the subtitle, the abstract, the Reproducibility bullet, and the "Where does the data come from" FAQ answer all said no node. That FAQ answer renders as FAQPage JSON-LD, so it is a machine-readable claim on a production page.

They now name both sources, state that a whole node day replaces the export's copy of that day outright rather than being averaged with it, and say plainly that the days our node measured are not reproducible from the public feed alone. A new Node substitution methodology bullet carries the mechanism and keeps reconstructions separate from measurements.

HlFeedCoverageNote had a second defect: it took the export's share of the window as windowDays - nodeDays and described truncatedDaysWindow as a subset of it, which the gauges cannot support. On the 2026-10-25 reading that rendered as "the remaining 12 fall back to the export, and 11 of those stop around 12:10" where two days rest on the export. hlDaySources splits the window into the three sources the page can name, clamped so a scrape landing mid-pass cannot publish a negative day count. The nodeDays === 0 wording is kept and tested, because a node outage or an image rollback reproduces exactly the state the page was in until today.

Verification against this base

The four touched files were identical between origin/main and origin/dev before the cherry-pick, so nothing main-only is carried away. Every removed line in the diff is one of the replaced claims or the old note sentence; no main feature is touched, in particular nothing near ProviderClaim or bench-published.json.

  • pnpm validate 253 specs valid
  • pnpm exec tsc --noEmit clean
  • bun test 778 pass, 0 fail (full suite)
  • no provider set change, so no cache key bump
  • no em or en dashes in the spec

Merging deploys prod automatically via prod-deploy.yml.

…ed (#3286)

The node substitution merged on 2026-10-07 (#2872) and never ran. The
hyperliquid-frontends image was rebuilt on 2026-10-21 from
~/ocb-build/harness-src/hlf-build, a source tree whose Go files are frozen
at 2026-10-07 18:09, hours before that merge: no nodesource.go, and no
`a.node` anywhere in its agg.go. That rebuild refreshed only builders.json,
which is why Nova appeared on the site and the node figures did not. The
gauges are promauto-registered and Set in both branches of `if a.node != nil`
inside publish(), so their absence from /metrics was the proof the binary had
no node code rather than a node that was declining every day.

Rebuilt today from current dev, verified by symbol before the container was
touched, and the swap moved every figure on the bench:

  FOMO volume 7d      $263.1M -> $780.8M   (2.97x)
  cohort volume 7d    $1.811B -> $4.783B   (2.64x)
  node days / 30            0 -> 18, plus 10 reconstructions

$780.8M is the figure the node's own seven complete days give, read
independently through the reducer, so the bench was publishing roughly a
third of the real notional for eighteen days.

That makes four statements on the page false as of today, where they had
been accidentally true for as long as the binary was stale: the subtitle,
the abstract, the reproducibility bullet and the "where does the data come
from" FAQ answer all said no node. The FAQ answer is also FAQPage JSON-LD,
so it was a machine-readable claim. They now name both sources, say that a
whole node day replaces the export's copy outright rather than being
averaged with it, and say plainly that the days our node measured are not
reproducible from the public feed alone.

The coverage note had a second defect the same reading exposed. It took the
export's share of the window as windowDays - nodeDays and then described
truncatedDaysWindow as a subset of it, which the gauges cannot support: a
rebuilt day sits in that remainder, and the truncated count includes days
the node replaced. On today's reading that rendered as "the remaining 12
fall back to the export, and 11 of those stop around 12:10" where two days
rest on the export. hlDaySources splits the window into the three sources
the page can name, clamped so a scrape landing mid-pass cannot publish a
negative day count, and the amber branch now names the node share instead
of handing all thirty days to the upstream feed.

The nodeDays == 0 wording is kept and tested. A node outage or a rollback to
an older image reproduces exactly the state the page was in until today, and
the note has to describe that one correctly too.

(cherry picked from commit 79a0411)
@Flotapponnier
Flotapponnier merged commit 1446c18 into main Oct 25, 2026
2 checks passed
@Flotapponnier
Flotapponnier deleted the release/hl-node-attribution-main branch November 3, 2026 11:53
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